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

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

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

  CREATE OR REPLACE PACKAGE BODY "CNRCTB037" is

-- =================================================
-- VSX di modifica impegni mandato di accreditamento
-- =================================================

 procedure vsx_man_acc(
       aPgCall NUMBER
 ) is
   aUser varchar2(20);
   aTSNow date;
   aCdCds varchar2(30);
   aEs number(4);
   aPgMan number(10);
   aObb obbligazione%rowtype;
   aObbN obbligazione%rowtype;
   aObbO obbligazione%rowtype;
   aObbScadN obbligazione_scadenzario%rowtype;
   aMan mandato%rowtype;
   aGenRiga documento_generico_riga%rowtype;
   aNewGenRiga documento_generico_riga%rowtype;
   aNumRigaGen number(10);
   aManRiga mandato_riga%rowtype;
   aNewManRiga mandato_riga%rowtype;
 begin
  for aVSX in (select distinct cd_cds,esercizio,pg_mandato,utuv,duva from vsx_man_acc where
                pg_call = aPgCall
        ) loop
   aCdCds:=aVSX.cd_cds;
   aEs:=aVSX.esercizio;
   aPgMan:=aVSX.pg_mandato;
   aTSNow:=aVSX.duva;
   aUser:=aVSX.utuv;
   exit;
  end loop;
  if
      aCdCds is null
   or aEs is null
   or aPgMan is null
   or aTSNow is null
   or aUser is null
  then
   IBMERR001.RAISE_ERR_GENERICO('Parametro VSX non definito');
  end if;
  begin
   select * into aMan from mandato where
          esercizio = aEs
      and cd_cds = aCdCds
      and pg_mandato = aPgMan
   for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Mandato non trovato');
  end;

  for aVSX in (select * from vsx_man_acc where
                pg_call = aPgCall
        ) loop
   aObbN:=null;
   aObbN.cd_cds:=aVSX.cd_cds;
   aObbN.esercizio:=aVSX.esercizio;
   aObbN.esercizio_originale:=aVSX.esercizio_ori_obbligazione;
   aObbN.pg_obbligazione:=aVSX.pg_obbligazione;
   CNRCTB035.LOCKDOCFULL(aObbN);

      -- Verifico che l'obbligazione non sia stata riportata nell'anno successivo
   If aObbN.riportato = 'Y' Then
    IBMERR001.RAISE_ERR_GENERICO('Modifica non possibile! L''impegno '||CNRCTB035.getDesc(aObbN)||' collegato al mandato risulta riportato ad anno successivo.');
   End If;

   -- Verifico che il pg_ver_rec delle scadenze non sia cambiato
   begin
    select * into aObbScadN from obbligazione_scadenzario where
       cd_cds = aObbN.cd_cds
   and esercizio = aObbN.esercizio
   and esercizio_originale = aObbN.esercizio_originale
   and pg_obbligazione = aObbN.pg_obbligazione
   and pg_obbligazione_scadenzario = aVSX.pg_obbligazione_scadenzario
     and pg_ver_rec = aVSX.pg_ver_rec_obb_scad;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Risorsa non più valida x');
   end;
   if aObbScadN.im_scadenza < aObbScadN.im_associato_doc_amm + aVSX.im_riga then
    IBMERR001.RAISE_ERR_GENERICO('Disponibilità esaurita su impegno:'||CNRCTB035.getDesc(aObbN));
   end if;
  end loop;

  -- Aggiorno i saldi emesso in delta neg. per i vecchi cap.
--DBMS_Output.PUT_LINE ('M A');

  updSaldoCapitoliM(aMan, 'A', 'A');

  -- Se man pagato aggiorno i saldi pagato in delta neg. per i vecchi cap.
  if aMan.STATO = CNRCTB038.STATO_AUT_ESI then
--DBMS_Output.PUT_LINE ('M B');
   updSaldoCapitoliM(aMan, 'A', 'U');
  end if;

  -- Aggiorno nell'obbligazione il saldo autorizzatori
  for aTempManRiga in (select * from mandato_riga where
          esercizio = aMan.esercizio
      and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato for update nowait) loop
   aObbO.cd_cds:=aTempManRiga.cd_cds;
   aObbO.esercizio:=aTempManRiga.esercizio_obbligazione;
   aObbO.esercizio_originale:=aTempManRiga.esercizio_ori_obbligazione;
   aObbO.pg_obbligazione:=aTempManRiga.pg_obbligazione;
   CNRCTB035.LOCKDOCFULL(aObbO);
      -- Verifico che le obbligazioni legate al mandato non siano stat riportata nell'anno successivo
   If aObbO.riportato = 'Y' Then
    IBMERR001.RAISE_ERR_GENERICO('Modifica non possibile! L''impegno '||CNRCTB035.getDesc(aObbO)||' collegato al mandato risulta riportato ad anno successivo.');
   End If;

   update obbligazione_scadenzario set
         im_associato_doc_contabile = im_associato_doc_contabile - aTempManRiga.im_mandato_riga,
         im_associato_doc_amm = im_associato_doc_amm - aTempManRiga.im_mandato_riga,
     utuv=aUser,
     duva=aTSNow,
         pg_ver_rec=pg_ver_rec+1
   where
       cd_cds = aObbO.cd_cds
   and esercizio = aObbO.esercizio
   and esercizio_originale = aObbO.esercizio_originale
   and pg_obbligazione = aObbO.pg_obbligazione
   and pg_obbligazione_scadenzario = aTempManRiga.pg_obbligazione_scadenzario;
  end loop;

  -- Salvo la prima riga del mandato da usare come template
  for aTempManRiga in (select * from mandato_riga where
          esercizio = aMan.esercizio
      and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato) loop
   aManRiga:=aTempManRiga;
   exit;
  end loop;

  delete from mandato_siope where
          esercizio = aMan.esercizio
      and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato;

  delete from mandato_riga where
          esercizio = aMan.esercizio
      and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato;

  CNRCTB100.LOCKDOCAMM(aManRiga.cd_tipo_documento_amm,aManRiga.cd_cds_doc_amm,aManRiga.esercizio,aManRiga.cd_uo_doc_amm,aManRiga.pg_doc_amm);
  -- Salvo la prima riga del mandato da usare come template
  for aTempGenRiga in (select * from documento_generico_riga where
              cd_tipo_documento_amm = aManRiga.cd_tipo_documento_amm
          and esercizio = aManRiga.esercizio
      and cd_cds = aManRiga.cd_cds_doc_amm
      and esercizio = aManRiga.esercizio_doc_amm
          and cd_unita_organizzativa = aManRiga.cd_uo_doc_amm
      and pg_documento_generico = aManRiga.pg_doc_amm
  for update nowait
  ) loop
   aGenRiga:=aTempGenRiga;
   exit;
  end loop;

  delete from documento_generico_riga where
              cd_tipo_documento_amm = aManRiga.cd_tipo_documento_amm
          and esercizio = aManRiga.esercizio
      and cd_cds = aManRiga.cd_cds_doc_amm
      and esercizio = aManRiga.esercizio_doc_amm
          and cd_unita_organizzativa = aManRiga.cd_uo_doc_amm
      and pg_documento_generico = aManRiga.pg_doc_amm;
  aNumRigaGen:=0;
  for aVSX in (select * from vsx_man_acc where
                pg_call = aPgCall
        ) loop
   aObbN:=null;
   aObbN.cd_cds:=aVSX.cd_cds;
   aObbN.esercizio:=aVSX.esercizio;
   aObbN.esercizio_originale:=aVSX.esercizio_ori_obbligazione;
   aObbN.pg_obbligazione:=aVSX.pg_obbligazione;
   CNRCTB035.LOCKDOCFULL(aObbN);
      -- Verifico che le obbligazioni legate al mandato non siano stat riportata nell'anno successivo
   If aObbN.riportato = 'Y' Then
    IBMERR001.RAISE_ERR_GENERICO('Modifica non possibile! L''impegno '||CNRCTB035.getDesc(aObbN)||' collegato al mandato risulta riportato ad anno successivo.');
   End If;
   -- Verifico che il pg_ver_rec delle scadenze non sia cambiato
   begin
    select * into aObbScadN from obbligazione_scadenzario where
       cd_cds = aObbN.cd_cds
   and esercizio = aObbN.esercizio
   and esercizio_originale = aObbN.esercizio_originale
   and pg_obbligazione = aObbN.pg_obbligazione
   and pg_obbligazione_scadenzario = aVSX.pg_obbligazione_scadenzario;
--   and pg_ver_rec = aVSX.pg_ver_rec_obb_scad;
   exception when NO_DATA_FOUND then
    IBMERR001.RAISE_ERR_GENERICO('Risorsa non pi? valida x');
   end;
   -- Ricreo le righe del generico
   aNewGenRiga:=aGenRiga;
   aNumRigaGen:=aNumRigaGen+1;
   aNewGenRiga.progressivo_riga := aNumRigaGen;
   aNewGenRiga.cd_cds_obbligazione := aObbScadN.cd_cds;
   aNewGenRiga.esercizio_obbligazione := aObbScadN.esercizio;
   aNewGenRiga.esercizio_ori_obbligazione := aObbScadN.esercizio_originale;
   aNewGenRiga.pg_obbligazione := aObbScadN.pg_obbligazione;
   aNewGenRiga.pg_obbligazione_scadenzario := aObbScadN.pg_obbligazione_scadenzario;
   aNewGenRiga.im_riga := aVSX.im_riga;
   aNewGenRiga.duva := aVSX.duva;
   aNewGenRiga.utuv := aVSX.utuv;
   aNewGenRiga.pg_ver_rec := 1;
   CNRCTB100.ins_documento_generico_riga(aNewGenRiga);
   -- Ricreo le righe del mandato
   aNewManRiga:=aManRiga;
   aNewManRiga.cd_cds := aObbScadN.cd_cds;
   aNewManRiga.esercizio_obbligazione := aObbScadN.esercizio;
   aNewManRiga.esercizio_ori_obbligazione := aObbScadN.esercizio_originale;
   aNewManRiga.pg_obbligazione := aObbScadN.pg_obbligazione;
   aNewManRiga.pg_obbligazione_scadenzario := aObbScadN.pg_obbligazione_scadenzario;
   aNewManRiga.im_mandato_riga := aVSX.im_riga;
   aNewManRiga.duva := aVSX.duva;
   aNewManRiga.utuv := aVSX.utuv;
   aNewManRiga.pg_ver_rec := 1;
   CNRCTB038.ins_mandato_riga(aNewManRiga);

   -- 23.04.2007 Stanislao Fusco
   -- Inserita procedura che pu? inserire la riga automatica SIOPE
   Inserisci_SIOPE_automatico (aNewManRiga);

   update obbligazione_scadenzario set
         im_associato_doc_contabile = im_associato_doc_contabile + aVSX.im_riga,
         im_associato_doc_amm = im_associato_doc_amm + aVSX.im_riga,
     utuv=aUser,
     duva=aTSNow,
         pg_ver_rec=pg_ver_rec+1
   where
       cd_cds = aObbN.cd_cds
   and esercizio = aObbN.esercizio
   and esercizio_originale = aObbN.esercizio_originale
   and pg_obbligazione = aObbN.pg_obbligazione
   and pg_obbligazione_scadenzario = aVSX.pg_obbligazione_scadenzario;
  end loop;
  if aObbN.pg_obbligazione is null Or aObbN.esercizio_originale Is Null Then
   IBMERR001.RAISE_ERR_GENERICO('Errore interno');
  end if;
  -- Aggiorno il tipo competenza/residui del mandato
  if aMan.ti_competenza_residuo = CNRCTB038.TI_MAN_COMP and aObbN.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP_RES then
   update mandato
   set
    ti_competenza_residuo=CNRCTB038.TI_MAN_RES,
    utuv=aUser,
  duva=aTSNow,
  pg_ver_rec=pg_ver_rec+1
   where
              esercizio = aMan.esercizio
          and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato;
  elsif aMan.ti_competenza_residuo = CNRCTB038.TI_MAN_RES and aObbN.cd_tipo_documento_cont = CNRCTB018.TI_DOC_IMP then
   update mandato
   set
    ti_competenza_residuo=CNRCTB038.TI_MAN_COMP,
    utuv=aUser,
  duva=aTSNow,
  pg_ver_rec=pg_ver_rec+1
   where
              esercizio = aMan.esercizio
          and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato;
  else
   update mandato
   set
    utuv=aUser,
  duva=aTSNow,
  pg_ver_rec=pg_ver_rec+1
   where
              esercizio = aMan.esercizio
          and cd_cds = aMan.cd_cds
      and pg_mandato = aMan.pg_mandato;
  end if;
  -- Aggiorno i saldi emesso in delta neg. per i vecchi cap.
--DBMS_Output.PUT_LINE ('M C');
  updSaldoCapitoliM(aMan, 'I', 'A');
  -- Se man pagato aggiorno i saldi pagato in delta neg. per i vecchi cap.
  if aMan.STATO = CNRCTB038.STATO_AUT_ESI then
--DBMS_Output.PUT_LINE ('M D');
   updSaldoCapitoliM(aMan, 'I', 'U');
  end if;

 end;

-- =================================================================================================
-- Aggiornamento dello stato pagato su mandati
-- =================================================================================================
PROCEDURE riscontroMandato
   (aEs NUMBER,
    aCdCds VARCHAR2,
    aPgMan NUMBER,
    aAzione VARCHAR2,
    aUtente VARCHAR2) IS
   aMan mandato%rowtype;

Begin

  select * into aMan
  from   mandato
  where  esercizio = aEs And
         cd_cds = aCdCds And
         pg_mandato = aPgMan
  for update nowait;

  if aAzione = 'I' and aMan.im_mandato <> aMan.im_pagato then
   return;
  end if;

  If aAzione <> 'A' Then

   If aAzione = 'M' And aMan.im_mandato <> aMan.im_pagato Then

     Update mandato
     Set    stato = CNRCTB038.STATO_MAN_EME,
            dt_pagamento = null,
            duva = aMan.duva,
            utuv = aMan.utuv,
      pg_ver_rec = pg_ver_rec+1
     Where  esercizio = aEs And
            cd_cds = aCdCds And
            pg_mandato = aPgMan;

   Else

    Update Mandato
    Set    stato = CNRCTB038.STATO_MAN_PAG,
           dt_pagamento = Nvl((Select Max(Trunc(SOSPESO.DT_REGISTRAZIONE))
                               From   SOSPESO, SOSPESO_DET_USC
                               Where  SOSPESO_DET_USC.TI_SOSPESO_RISCONTRO = 'R' And
                                      SOSPESO_DET_USC.STATO        != 'A' And
                                      SOSPESO_DET_USC.CD_CDS       = aCdCds And
                                      SOSPESO_DET_USC.ESERCIZIO    = aEs And
                                      SOSPESO_DET_USC.PG_MANDATO   = aPgMan And
                                      SOSPESO.CD_CDS               = SOSPESO_DET_USC.CD_CDS And
                                      SOSPESO.ESERCIZIO            = SOSPESO_DET_USC.ESERCIZIO And
                                      SOSPESO.TI_ENTRATA_SPESA     = SOSPESO_DET_USC.TI_ENTRATA_SPESA And
                                      SOSPESO.TI_SOSPESO_RISCONTRO = SOSPESO_DET_USC.TI_SOSPESO_RISCONTRO And
                                      SOSPESO.CD_SOSPESO           = SOSPESO_DET_USC.CD_SOSPESO), Trunc(aMan.duva)),
           duva = aMan.duva,
           utuv = aMan.utuv,
           pg_ver_rec = pg_ver_rec + 1
    Where esercizio = aEs And
          cd_cds = aCdCds And
          pg_mandato = aPgMan;

-- SF 13.09.2007 INSERITO PER GESTIRE LO STATO DELLA RIGA, COMPLETAMENTE TRASCURATO
    Update Mandato_RIGA
    Set    stato = CNRCTB038.STATO_MAN_PAG,
           duva = aMan.duva,
           utuv = aMan.utuv,
           pg_ver_rec = pg_ver_rec + 1
    Where esercizio = aEs And
          cd_cds = aCdCds And
          pg_mandato = aPgMan;

   End If;

  End If; -- AZIONE DIVERSA DA "A"

  If aAzione = 'A' Or (aAzione = 'M' And aMan.im_mandato <> aMan.im_pagato) Then
   updSaldoCapitoliM (aMan,'A','U');
  Else
   updSaldoCapitoliM (aMan,'I','U');
  End if;

End;

-- =================================================================================================
-- Aggiornamento dello stato pagato su reversali
-- =================================================================================================
 procedure riscontroReversale
   (
    aEs NUMBER,
    aCdCds VARCHAR2,
    aPgRev NUMBER,
    aAzione VARCHAR2,
    aUtente VARCHAR2
   ) IS

 aRev reversale%rowtype;
 aFatturaAttiva fattura_attiva%rowtype;
 begin
  select * into aRev from reversale where
       esercizio = aEs
   and cd_cds = aCdCds
   and pg_reversale = aPgRev
  for update nowait;
  if aAzione = 'I' and aRev.im_reversale <> aRev.im_incassato then
   return;
  end if;
  if aAzione <> 'A' then -- Attualmente l'annullamento gestisce il mandato dall'on-line
   if aAzione = 'M' and aRev.im_reversale <> aRev.im_incassato then
    update reversale set
     stato = CNRCTB038.STATO_REV_EME,
     dt_incasso = null,
     duva = aRev.duva,
     utuv = aRev.utuv,
  pg_ver_rec=pg_ver_rec+1
    where
         esercizio = aEs
     and cd_cds = aCdCds
     and pg_reversale = aPgRev;
   else
     Update reversale
     Set    stato = CNRCTB038.STATO_REV_PAG,
            dt_incasso = Nvl((Select Max(Trunc(SOSPESO.DT_REGISTRAZIONE))
                              From   SOSPESO, SOSPESO_DET_ETR
                              Where  SOSPESO_DET_ETR.TI_SOSPESO_RISCONTRO = 'R' And
                                     SOSPESO_DET_ETR.STATO        != 'A' And
                                     SOSPESO_DET_ETR.CD_CDS       = aCdCds And
                                     SOSPESO_DET_ETR.ESERCIZIO    = aEs And
                                     SOSPESO_DET_ETR.PG_REVERSALE = aPgRev And
                                     SOSPESO.CD_CDS               = SOSPESO_DET_ETR.CD_CDS And
                                     SOSPESO.ESERCIZIO            = SOSPESO_DET_ETR.ESERCIZIO And
                                     SOSPESO.TI_ENTRATA_SPESA     = SOSPESO_DET_ETR.TI_ENTRATA_SPESA And
                                     SOSPESO.TI_SOSPESO_RISCONTRO = SOSPESO_DET_ETR.TI_SOSPESO_RISCONTRO And
                                     SOSPESO.CD_SOSPESO           = SOSPESO_DET_ETR.CD_SOSPESO), Trunc(aRev.duva)),
            duva = aRev.duva,
            utuv = aRev.utuv,
      pg_ver_rec = pg_ver_rec+1
     Where esercizio = aEs And
           cd_cds = aCdCds And
           pg_reversale = aPgRev;

-- SF 13.09.2007 INSERITO PER GESTIRE LO STATO DELLA RIGA, COMPLETAMENTE TRASCURATO
    Update REVERSALE_RIGA
    Set    stato = CNRCTB038.STATO_REV_PAG,
           duva = aRev.duva,
           utuv = aRev.utuv,
           pg_ver_rec = pg_ver_rec + 1
    Where esercizio = aEs And
           cd_cds = aCdCds And
           pg_reversale = aPgRev;

   end if;
  end if;
  if aAzione = 'A'  or (aAzione = 'M' and aRev.im_reversale <> aRev.im_incassato) then
--DBMS_Output.PUT_LINE ('R A');
   updSaldoCapitoliR (aRev,'A','U');
  else
--DBMS_Output.PUT_LINE ('R B');
   updSaldoCapitoliR (aRev,'I','U');
  end if;

  -- Aggiornamento della data_esigibilit?_differita su fattura attiva
  --
  -- funzione eliminata
  --
  -- if aAzione <> 'A' then
  -- for aRiga in (select * from reversale_riga where
  --      esercizio = aEs
  --  and cd_cds = aCdCds
  --  and pg_reversale = aPgRev
  -- ) loop
  --  if aRiga.cd_tipo_documento_amm = CNRCTB100.TI_FATTURA_ATTIVA then
  --     select * into aFatturaAttiva from fattura_attiva where
  --          cd_cds = aRiga.cd_cds_doc_amm
  --      and esercizio = aRiga.esercizio_doc_amm
  --    and cd_unita_organizzativa = aRiga.cd_uo_doc_amm
  --    and pg_fattura_attiva = aRiga.pg_doc_amm
  --      for update nowait;
  --      CNRCTB100.UPDATEDOCAMM(
  --        aRiga.cd_tipo_documento_amm,
  --        aFatturaAttiva.cd_cds,
  --        aFatturaAttiva.esercizio,
  --        aFatturaAttiva.cd_unita_organizzativa,
  --        aFatturaAttiva.pg_fattura_attiva,
  --        'data_esigibilita_iva = '||IBMUTL001.ASDYNDATE(aRev.duva),
  --      null,
  --      aRev.utuv,
  --      aRev.duva
  --     );
  --  end if;
  -- end loop;
  -- end if;
 end;

 procedure generaDocumento(
   aManPrncT in out mandato%rowtype,
   aManPrncR in out CNRCTB038.righeMandatoList,
   aRevT in out reversale%rowtype,
   aRevR in out CNRCTB038.righeReversaleList
 ) is begin
  generaDocumenti(
   aManPrncT,
   aManPrncR,
   aRevT,
   aRevR,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA
  );
 end;


 procedure generaDocumento(
   aManPrncT in out mandato%rowtype,
   aManPrncR in out CNRCTB038.righeMandatoList
 ) is begin
  generaDocumenti(
   aManPrncT,
   aManPrncR,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.REV_VUOTA,
   CNRCTB038.REV_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA,
   CNRCTB038.MAN_VUOTO,
   CNRCTB038.MAN_RIGHE_VUOTA
  );
 end;

 function CheckCassaCds(testa_mandato mandato%rowtype) return boolean is
 gen_riga v_disp_cassa_cds%rowtype;
 scarto number;
 begin
    select *
    into gen_riga
    from v_disp_cassa_cds
    where esercizio = testa_mandato.esercizio
    and   cd_cds    = testa_mandato.cd_cds;
 -- trattamento errore
    scarto :=  nvl(gen_riga.im_DIsponibilita_cassa,0)
   --17/03/2006 Raffaele Pagano: richiesta di eliminare l'aggiornamento della disponibilità di cassa
   --all'atto dell'invio dei mandati di trasferimento
--              +nvl(gen_riga.im_accreditamenti_ic,0)
        -- Computa nel calcolo il mandato in processo al netto delle sue ritenute
        -nvl(testa_mandato.im_mandato,0)
        +nvl(testa_mandato.im_ritenute,0);
    if scarto <0 then
       return False;
    else
       return True;
    end if;
 exception when no_data_found then
    return False;
 end;

 function CheckSaldoCapitoli (lRigheMandato CNRCTB038.righeMandatoList) return boolean is
 i number;
 j number;
 scarto number(15,2);
 im_distribuito number(15,2);
 denominatore number(15,2);
 im_residuo number(15,2);
 peso number;

 controllo_logico boolean;
 num_righe number;
 desc_errore varchar2(2000);

 numeroCapitoli number;
 sRigaScadObblig obbligazione_scadenzario%rowtype;
 lRigheCapitoli righeCapitoliList;
 begin
   /*i:=1;
   lRigheCapitoli.DELETE;

   num_righe :=lRigheMandato.count;

   for i in 1..num_righe loop
    -- controllo effettuato solamente su righe di partita di giro
    if lRigheMandato(i).fl_pgiro = 'N' then
     -- per ogni riga del mandato si recupera la scadenza dell'obligazione associata
     sRigaScadObblig := getScadenzaObbligazione(lRigheMandato(i));
       if sRigaScadObblig.cd_cds is null then
       desc_errore := 'associazione con scadenza '||cnrutil.getLabelObbligazioneMin()||' non trovata';
       IBMERR001.RAISE_ERR_GENERICO(desc_errore);
     end if;

     -- per la scadenza di cui al punto precedente, si recupera il capitolo associato
     lRigheCapitoli := getCapitoliDiScadObblig(sRigaScadObblig);
       if lRigheCapitoli.Count = 0 then
       desc_errore := 'associazione con Capitolo non trovata';
       IBMERR001.RAISE_ERR_GENERICO(desc_errore);
     end if;
     -- Calcolare come l'importo della riga del mandato viene distribuita su i vari capitoli
     scarto := 0;
     numeroCapitoli := lRigheCapitoli.Count;

     if numeroCapitoli >1 then
       for j in 1..numeroCapitoli loop
           if j=0 then
     return TRUE;
    else
       return FALSE;
    end if;
 exception when no_data_found then
       return false;
 end;
*/

 procedure updSaldoCapitoli(aEs number, aCdCds varchar2, aPgDoc number, aTiDoc char, aAzione char, aTiImporto char, aUser varchar2, aTSNow date) is
  aTotDistr number(15,2);
  aSaldo voce_f_saldi_cmp%rowtype;
  aLastSaldo voce_f_saldi_cmp%rowtype;
  aLastCap v_mandato_reversale_voce%rowtype;
  aDelta number(15,2);
  aImManAlgebrico number(15,2);
  aSaldoCdrLinea voce_f_saldi_cdr_linea%Rowtype;
  parametriCnr parametri_cnr%Rowtype;
 begin
  aTotDistr:=0;
  aLastCap:=null;
  aLastSaldo:=null;
  aImManAlgebrico:=0;
  if(parametriCnr.fl_nuovo_pdg='N') then
    for aListaCap in (select * from v_mandato_reversale_voce where
                            esercizio = aEs
              and cd_cds = aCdCds
              and pg_documento = aPgDoc
              and ti_documento = aTiDoc
             ) loop
     begin
      select * into aSaldo from voce_f_saldi_cmp where
           CD_CDS=aListaCap.cd_cds
       and ESERCIZIO=aListaCap.esercizio
       and TI_APPARTENENZA=aListaCap.ti_appartenenza
       and TI_GESTIONE=aListaCap.ti_gestione
       and CD_VOCE=aListaCap.cd_voce
       and TI_COMPETENZA_RESIDUO=Decode(aListaCap.ti_appartenenza, CNRCTB001.APPARTENENZA_CDS, CNRCTB054.TI_COMPETENZA, aListaCap.ti_competenza_residuo)
      for update nowait;
     exception when NO_DATA_FOUND then
      IBMERR001.RAISE_ERR_GENERICO('Capitolo finanziario non trovato:'||aListaCap.cd_voce);
     end;

     if aAzione = 'A' then
      aDelta:=0-aListaCap.im_capitolo_pesato;
      aImManAlgebrico:=0-aListaCap.im_documento;
     else
      aDelta:=aListaCap.im_capitolo_pesato;
      aImManAlgebrico:=aListaCap.im_documento;
     end if;

     aTotDistr:=aTotDistr+aDelta;
     CNRCTB054.aggiornaSaldi(aSaldo,aTiImporto,aDelta,aUser,aTSNow);
     aLastSaldo:=aSaldo;
     aLastCap:=aListaCap;
    end loop;
    if aLastCap.cd_voce is not null and aImManAlgebrico-aTotDistr <> 0 Then

     -- Aggiorno VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
     CNRCTB054.aggiornaSaldi(aSaldo,aTiImporto,aImManAlgebrico-aTotDistr,aUser,aTSNow);
    end if;
  end if;
  for aListaScad in (select * from v_mandato_reversale_scad_voce
                     Where esercizio = aEs
           And cd_cds = aCdCds
           And pg_documento = aPgDoc
           And ti_documento = aTiDoc) loop
   Begin
    -- Aggiorno VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
    aSaldoCdrLinea.ESERCIZIO := aListaScad.ESERCIZIO;
    aSaldoCdrLinea.ESERCIZIO_RES := aListaScad.ESERCIZIO_ORIGINALE;
    aSaldoCdrLinea.CD_CENTRO_RESPONSABILITA := aListaScad.CD_CENTRO_RESPONSABILITA;
    aSaldoCdrLinea.CD_LINEA_ATTIVITA := aListaScad.CD_LINEA_ATTIVITA;
    aSaldoCdrLinea.TI_APPARTENENZA := aListaScad.TI_APPARTENENZA;
    aSaldoCdrLinea.TI_GESTIONE := aListaScad.TI_GESTIONE;
    aSaldoCdrLinea.CD_VOCE := aListaScad.CD_VOCE;

    CNRCTB054.RESET_IMPORTI_SALDI (aSaldoCdrLinea);

If aTiImporto = 'A' Then
    If aListaScad.CD_TIPO_DOCUMENTO_CONT In (CNRCTB018.TI_DOC_OBB, CNRCTB018.TI_DOC_OBB_RES_PRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES,
                                             CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES,
                                             CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC_PGIRO, CNRCTB018.TI_DOC_ACC_PGIRO_RES,
                                             CNRCTB018.TI_DOC_ACC_SIST, CNRCTB018.TI_DOC_ACC) Then
        If aAzione = 'A' Then
          aSaldocdrlinea.IM_MANDATI_REVERSALI_PRO := -aListaScad.IM_VOCE;
        Else
          aSaldocdrlinea.IM_MANDATI_REVERSALI_PRO := aListaScad.IM_VOCE;
        End If;
    Elsif aListaScad.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_OBB_RES_IMPRO Then

        If aAzione = 'A' Then
          aSaldocdrlinea.IM_MANDATI_REVERSALI_IMP := -aListaScad.IM_VOCE;
        Else
          aSaldocdrlinea.IM_MANDATI_REVERSALI_IMP := aListaScad.IM_VOCE;
        End If;


    End If;

Elsif aTiImporto = 'U' Then

        If aAzione = 'A' Then
          aSaldocdrlinea.IM_PAGAMENTI_INCASSI := -aListaScad.IM_VOCE;
        Else
          aSaldocdrlinea.IM_PAGAMENTI_INCASSI := aListaScad.IM_VOCE;
        End If;
End If;

    aSaldoCdrLinea.UTUV := aUser;

    CNRCTB054.crea_aggiorna_saldi(aSaldoCdrLinea, '037.updSaldoCapitoli', 'N');
   End;
   End Loop;
 end;

 procedure updSaldoCapitoliM(aMan mandato%rowtype, aAzione char, aTiImporto char) is
 begin
  updSaldoCapitoli(aMan.esercizio, aMan.cd_cds, aMan.pg_mandato, 'M', aAzione, aTiImporto, aMan.utuv, aMan.duva);
 end;

 procedure updSaldoCapitoliR (aRev reversale%rowtype, aAzione char, aTiImporto char) is
 begin
  updSaldoCapitoli(aRev.esercizio, aRev.cd_cds, aRev.pg_reversale, 'R', aAzione, aTiImporto, aRev.utuv, aRev.duva);
 end;

 procedure updObbligazioni(Mandato_Testata mandato%rowtype)  is

 begin
    update obbligazione
    set duva = Mandato_Testata.duva,
        utuv = Mandato_Testata.utuv,
      pg_ver_rec = pg_ver_rec + 1
    where (cd_cds, esercizio, esercizio_originale, pg_obbligazione ) in
        (select cd_cds, esercizio_obbligazione, esercizio_ori_obbligazione, pg_obbligazione
       from mandato_riga
       where cd_cds    =  Mandato_Testata.CD_CDS
       and   esercizio = Mandato_Testata.ESERCIZIO
       and pg_mandato  =  Mandato_Testata.PG_MANDATO
       group by cd_cds, esercizio_obbligazione, esercizio_ori_obbligazione, pg_obbligazione );
 end;

 procedure updAccertamento(Reversale_Testata reversale%rowtype)  is

 begin
    update accertamento
    set duva = Reversale_Testata.duva,
        utuv = Reversale_Testata.utuv,
      pg_ver_rec = pg_ver_rec + 1
    where (cd_cds, esercizio, esercizio_originale, pg_accertamento ) in
        (select cd_cds, esercizio_accertamento, esercizio_ori_accertamento, pg_accertamento
       from reversale_riga
       where cd_cds    =  Reversale_Testata.CD_CDS
       and   esercizio = Reversale_Testata.ESERCIZIO
       and pg_reversale  =  Reversale_Testata.PG_REVERSALE
       group by cd_cds, esercizio_accertamento, esercizio_ori_accertamento, pg_accertamento );
 end;

 procedure updScadObbligazione(MandatoTestata mandato%rowtype) is
 begin
    updObbligazioni(MandatoTestata);


    for sRigaVMandatoObblScad in (select * from
       v_mandato_obblScad
      where cd_cds =  MandatoTestata.CD_CDS
      and   esercizio = MandatoTestata.ESERCIZIO
      and   pg_mandato = MandatoTestata.PG_MANDATO
      ) loop
          update obbligazione_scadenzario
          set  IM_ASSOCIATO_DOC_CONTABILE = IM_ASSOCIATO_DOC_CONTABILE + sRigaVMandatoObblScad.TOT_RIGA_SU_SCAD,
           DUVA = MandatoTestata.DUVA,
           UTUV = MandatoTestata.UTUV,
           PG_VER_REC = PG_VER_REC +1
        where cd_cds =  sRigaVMandatoObblScad.CD_CDS
        and   esercizio = sRigaVMandatoObblScad.ESERCIZIO_OBBLIGAZIONE
        and   esercizio_originale = sRigaVMandatoObblScad.ESERCIZIO_ORI_OBBLIGAZIONE
        and   pg_obbligazione = sRigaVMandatoObblScad.PG_OBBLIGAZIONE
        and   pg_obbligazione_scadenzario = sRigaVMandatoObblScad.PG_OBBLIGAZIONE_SCADENZARIO;
    end loop;
 end;

 procedure updScadAccertamento(ReversaleTestata reversale%rowtype) is
 begin
    updAccertamento(ReversaleTestata);

      for sRigaVReversaleAccerScad in (
      select *
      from v_reversale_AccerScad
      where cd_cds =  ReversaleTestata.CD_CDS
      and   esercizio = ReversaleTestata.ESERCIZIO
      and   pg_reversale = ReversaleTestata.PG_REVERSALE)
      loop
        update accertamento_scadenzario
        set  IM_ASSOCIATO_DOC_CONTABILE = IM_ASSOCIATO_DOC_CONTABILE + sRigaVReversaleAccerScad.TOT_REVERSALE_RIGHE,
         DUVA = ReversaleTestata.DUVA,
         UTUV = ReversaleTestata.UTUV,
         PG_VER_REC = PG_VER_REC +1
      where cd_cds =  sRigaVReversaleAccerScad.CD_CDS
      and   esercizio = sRigaVReversaleAccerScad.ESERCIZIO
      and   esercizio_originale = sRigaVReversaleAccerScad.ESERCIZIO_ORI_ACCERTAMENTO
      and   pg_accertamento = sRigaVReversaleAccerScad.PG_ACCERTAMENTO
      and   pg_accertamento_scadenzario = sRigaVReversaleAccerScad.PG_ACCERTAMENTO_SCADENZARIO;
    end loop;
end;


 procedure generaDocumenti(
   aManPrncT in out  mandato%rowtype,
   aManPrncR in out  CNRCTB038.righeMandatoList,
   aRevColl01T in out reversale%rowtype ,
   aRevColl01R in out CNRCTB038.righeReversaleList ,
   aRevColl02T in out reversale%rowtype ,
   aRevColl02R in out CNRCTB038.righeReversaleList ,
   aRevColl03T in out reversale%rowtype ,
   aRevColl03R in out CNRCTB038.righeReversaleList ,
   aRevColl04T in out reversale%rowtype ,
   aRevColl04R in out CNRCTB038.righeReversaleList ,
   aRevColl05T in out reversale%rowtype ,
   aRevColl05R in out CNRCTB038.righeReversaleList ,
   aRevColl06T in out reversale%rowtype ,
   aRevColl06R in out CNRCTB038.righeReversaleList ,
   aRevColl07T in out reversale%rowtype ,
   aRevColl07R in out CNRCTB038.righeReversaleList ,
   aRevColl08T in out reversale%rowtype ,
   aRevColl08R in out CNRCTB038.righeReversaleList ,
   aRevColl09T in out reversale%rowtype ,
   aRevColl09R in out CNRCTB038.righeReversaleList ,
   aRevColl10T in out reversale%rowtype ,
   aRevColl10R in out CNRCTB038.righeReversaleList ,
   aRevColl11T in out reversale%rowtype ,
   aRevColl11R in out CNRCTB038.righeReversaleList ,
   aManColl01T in out mandato%rowtype ,
   aManColl01R in out CNRCTB038.righeMandatoList ,
   aManColl02T in out mandato%rowtype ,
   aManColl02R in out CNRCTB038.righeMandatoList ,
   aManColl03T in out mandato%rowtype ,
   aManColl03R in out CNRCTB038.righeMandatoList ,
   aManColl04T in out mandato%rowtype ,
   aManColl04R in out CNRCTB038.righeMandatoList ,
   aManColl05T in out mandato%rowtype ,
   aManColl05R in out CNRCTB038.righeMandatoList ,
   aManColl06T in out mandato%rowtype ,
   aManColl06R in out CNRCTB038.righeMandatoList ,
   aManColl07T in out mandato%rowtype ,
   aManColl07R in out CNRCTB038.righeMandatoList ,
   aManColl08T in out mandato%rowtype ,
   aManColl08R in out CNRCTB038.righeMandatoList ,
   aManColl09T in out mandato%rowtype ,
   aManColl09R in out CNRCTB038.righeMandatoList ,
   aManColl10T in out mandato%rowtype ,
   aManColl10R in out CNRCTB038.righeMandatoList
 ) is
 controlloCassaCds boolean;
 controlloSaldoCapitoli boolean;

 sRigaScadVoce obbligazione_scad_voce%rowtype;
 sTestaMandato_gen mandato%rowtype;
 lRigheMandato_gen CNRCTB038.righeMandatoList;

 sTestaReversale_gen reversale%rowtype;
 lRigheReversale_gen CNRCTB038.righeReversaleList;

 sMandatoTerzo mandato_terzo%rowtype;
 sReversaleTerzo reversale_terzo%rowtype;
 sCodiceTerzo mandato_riga.CD_TERZO%type;
 contatore number;
 i number;
 aAssManMan ass_mandato_mandato%rowtype;

 desc_errore varchar2(2000);
 aTipoBolloS tipo_bollo%rowtype;
 aTipoBolloE tipo_bollo%rowtype;
 isConMandatoPrincipale boolean;
 aObb obbligazione%rowtype;
 aAcc accertamento%rowtype;
 tesoreria_unica char(1):='N';
 begin
      isConMandatoPrincipale:=true;

      begin
       select * into aTipoBolloS from tipo_bollo where
            ti_entrata_spesa in ('*',CNRCTB001.GESTIONE_SPESE)
      and fl_cancellato='N'
      and fl_default='Y';
    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Tipo bollo di default non trovato');
    end;


      begin
       select * into aTipoBolloE from tipo_bollo where
            ti_entrata_spesa in ('*',CNRCTB001.GESTIONE_ENTRATE)
      and fl_cancellato='N'
      and fl_default='Y';
    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Tipo bollo di default non trovato');
    end;

    for contatore in 0..10 loop
        if contatore = 0 then
         sTestaMandato_gen := aManPrncT;
         lRigheMandato_gen := aManPrncR;
      end if;
        if contatore = 1 then
         sTestaMandato_gen := aManColl01T;
         lRigheMandato_gen := aManColl01R;
      end if;
        if contatore = 2 then
         sTestaMandato_gen := aManColl02T;
         lRigheMandato_gen := aManColl02R;
      end if;
        if contatore = 3 then
         sTestaMandato_gen := aManColl03T;
         lRigheMandato_gen := aManColl03R;
      end if;
        if contatore = 4 then
         sTestaMandato_gen := aManColl04T;
         lRigheMandato_gen := aManColl04R;
      end if;
        if contatore = 5 then
         sTestaMandato_gen := aManColl05T;
         lRigheMandato_gen := aManColl05R;
      end if;
        if contatore = 6 then
         sTestaMandato_gen := aManColl06T;
         lRigheMandato_gen := aManColl06R;
      end if;
        if contatore = 7 then
         sTestaMandato_gen := aManColl07T;
         lRigheMandato_gen := aManColl07R;
      end if;
        if contatore = 8 then
         sTestaMandato_gen := aManColl08T;
         lRigheMandato_gen := aManColl08R;
      end if;
        if contatore = 9 then
         sTestaMandato_gen := aManColl09T;
         lRigheMandato_gen := aManColl09R;
      end if;
        if contatore = 10 then
         sTestaMandato_gen := aManColl10T;
         lRigheMandato_gen := aManColl10R;
      end if;
      if contatore = 0 and lRigheMandato_gen.count = 0 then
           isConMandatoPrincipale:=false;
      end if;
      if (lRigheMandato_gen.count > 0) then
        begin
         select fl_tesoreria_unica into tesoreria_unica from parametri_cnr
         where
              esercizio =sTestaMandato_gen.esercizio;

        exception when NO_DATA_FOUND then
           IBMERR001.RAISE_ERR_GENERICO('Configurazione gestione tesoreria mancante');
        end;
          -- Impostazione del progressivo del mandato
          if(tesoreria_unica='N') then
            sTestaMandato_gen.pg_mandato:= CNRCTB018.getNextNumDocCont(sTestaMandato_gen.cd_tipo_documento_cont, sTestaMandato_gen.esercizio, sTestaMandato_gen.cd_cds, sTestaMandato_gen.utcr);
          else
            sTestaMandato_gen.pg_mandato:= CNRCTB018.getNextNumDocCont(sTestaMandato_gen.cd_tipo_documento_cont, sTestaMandato_gen.esercizio, cnrctb020.getCDCDSENTE(sTestaMandato_gen.esercizio), sTestaMandato_gen.utcr);
          end if;
          -- Impostazione dello STATO_COGE
          if contatore =0 then
             -- Mandato principale
             sTestaMandato_gen.STATO_COGE := CNRCTB100.STATO_COEP_INI;
          else
             -- Mandati collegati - se non impostato viene messo stato coge X
             if sTestaMandato_gen.STATO_COGE is null then
                sTestaMandato_gen.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
             end if;
          end if;
          -- Troncamento della data di registrazione
          sTestaMandato_gen.dt_emissione:=trunc(sTestaMandato_gen.dt_emissione);
          -- Impostazione di UTUV DUVA e PG_VER_REC per la testata del mandato
          sTestaMandato_gen.UTUV := sTestaMandato_gen.UTCR;
          sTestaMandato_gen.DUVA := sTestaMandato_gen.DUVA;
          sTestaMandato_gen.PG_VER_REC := 1;
          -- Controlli
          -- Tracciabilit? pagamenti: Controllo ammissibilit? della modalit? di pagamento per la tipologia del documento generico
          -- Solo per mandati di pagamento
          if sTestaMandato_gen.ti_mandato = CNRCTB038.TI_MAN_PAG then
             for i in 1..lRigheMandato_gen.count loop
                 verificaTracciabilitaPag(sTestaMandato_gen.esercizio,
                                          sTestaMandato_gen.dt_emissione,
                                          lRigheMandato_gen(i).cd_modalita_pag,
                                          lRigheMandato_gen(i).cd_tipo_documento_amm,
                                          sTestaMandato_gen.im_mandato - sTestaMandato_gen.im_ritenute);
             end loop;
          end if;

          if (tesoreria_unica='N') then
              controlloCassaCds      := CheckCassaCds(sTestaMandato_gen);
          else
              controlloCassaCds:= True;
          end if;
          /*
          --forzo il controllo di cassa a true per i mandati di versamento cori ed iva
          --(da sistemare:deve valere solo per i versamenti accentrati!!!!!.....)
          if not controlloCassaCds then
             -- controllo se ? un mandato di versamento cori, cio? se tutte le righe
             -- hanno tipo documento = GEN_CORV_S, oppure di versamento iva commerciale
             -- cio? tipo_documento = TRASF_S
             for aInd in 1..lRigheMandato_gen.count loop
                if lRigheMandato_gen(aInd).cd_tipo_documento_amm=cnrctb100.TI_GEN_CORI_VER_SPESA then
                --if lRigheMandato_gen(aInd).cd_tipo_documento_amm=cnrctb100.TI_GENERICO_TRASF_S then
                      controlloCassaCds := True;
                end if;
             end loop;
          end if;
          */
          for aInd in 1..lRigheMandato_gen.count loop
                -- controllo se il l'obbligazione specificata sulle righe ? su partita di giro ed eventualemente aggiorno la riga del mandato di conseguenza
                begin
                 select * into aObb from obbligazione where
                      cd_cds = lRigheMandato_gen(aInd).cd_cds
                  and esercizio = lRigheMandato_gen(aInd).esercizio_obbligazione
                  and esercizio_originale = lRigheMandato_gen(aInd).esercizio_ori_obbligazione
                  and pg_obbligazione = lRigheMandato_gen(aInd).pg_obbligazione
                 for update nowait;
                exception when NO_DATA_FOUND then
                 IBMERR001.RAISE_ERR_GENERICO(cnrutil.getLabelObbligazione()||' a cui collegare la riga di mandato non trovata');
                end;
                lRigheMandato_gen(aInd).fl_pgiro:=aObb.fl_pgiro;
          end loop;
          controlloSaldoCapitoli := CheckSaldoCapitoli(lRigheMandato_gen);
          if controlloCassaCds and controlloSaldoCapitoli then
             cnrctb038.ins_MANDATO(sTestaMandato_gen);
           for i in 1..lRigheMandato_gen.count loop
             lRigheMandato_gen(i).pg_mandato:=sTestaMandato_gen.pg_mandato;
                 -- Impostazione di UTUV DUVA e PG_VER_REC
             lRigheMandato_gen(i).UTUV:= lRigheMandato_gen(i).UTCR;
             lRigheMandato_gen(i).DUVA:= lRigheMandato_gen(i).DACR;
             lRigheMandato_gen(i).PG_VER_REC:= 1;
           -- Inserimento riga del mandato
             cnrctb038.ins_MANDATO_RIGA(lRigheMandato_gen(i));

                                         -- 23.04.2007 Stanislao Fusco
                                         -- Inserita procedura che pu? inserire la riga automatica SIOPE
                                         Inserisci_SIOPE_automatico (lRigheMandato_gen(i));

           sCodiceTerzo := lRigheMandato_gen(i).CD_TERZO;
         end loop;
--DBMS_Output.PUT_LINE ('generaDocumenti');
         updSaldoCapitoliM(sTestaMandato_gen,'I','A');

         updScadObbligazione(sTestaMandato_gen);
         sMandatoTerzo.CD_CDS := sTestaMandato_gen.CD_CDS;
         sMandatoTerzo.ESERCIZIO := sTestaMandato_gen.ESERCIZIO;
         sMandatoTerzo.PG_MANDATO := sTestaMandato_gen.PG_MANDATO;
         sMandatoTerzo.CD_TERZO   := sCodiceTerzo;
         sMandatoTerzo.CD_TIPO_BOLLO := aTipoBolloS.cd_tipo_bollo;
         sMandatoTerzo.DACR := sTestaMandato_gen.DACR;
         sMandatoTerzo.UTCR := sTestaMandato_gen.UTCR;
         sMandatoTerzo.DUVA := sTestaMandato_gen.DUVA;
         sMandatoTerzo.UTUV := sTestaMandato_gen.UTUV;
         sMandatoTerzo.PG_VER_REC := 1;
         cnrctb038.ins_MANDATO_TERZO(sMandatoTerzo);
         -- Aggiorna il collegamento mandato-mandato se c? il mandato principale
/*
if isConMandatoPrincipale = false then
PIPE.SEND_MESSAGE('false ');
else
PIPE.SEND_MESSAGE('true ');
end if;
PIPE.SEND_MESSAGE('contatore = '||contatore);

PIPE.SEND_MESSAGE('aManPrncT.cd_cds = '||aManPrncT.cd_cds);
PIPE.SEND_MESSAGE('aManPrncT.pg_mandato = '||aManPrncT.pg_mandato);
PIPE.SEND_MESSAGE('sTestaMandato_gen.CD_CDS = '||sTestaMandato_gen.CD_CDS);
PIPE.SEND_MESSAGE('sTestaMandato_gen.pg_mandato = '||sTestaMandato_gen.pg_mandato);
*/
         if contatore > 0 and isConMandatoPrincipale then

                  aAssManMan.CD_CDS:=aManPrncT.cd_cds;
                  aAssManMan.ESERCIZIO:=aManPrncT.esercizio;
                  aAssManMan.PG_MANDATO:=aManPrncT.pg_mandato;
                  aAssManMan.CD_CDS_COLL:=sTestaMandato_gen.CD_CDS;
                  aAssManMan.ESERCIZIO_COLL:=sTestaMandato_gen.esercizio;
                  aAssManMan.PG_MANDATO_COLL:=sTestaMandato_gen.pg_mandato;
                  aAssManMan.DACR:=sTestaMandato_gen.DACR;
                  aAssManMan.UTCR:=sTestaMandato_gen.UTCR;
                  aAssManMan.DUVA:=sTestaMandato_gen.DACR;
                  aAssManMan.UTUV:=sTestaMandato_gen.UTCR;
                  aAssManMan.PG_VER_REC:=1;
          CNRCTB038.INS_ASS_MANDATO_MANDATO(aAssManMan);
         end if;
               cnrctb300.leggiMandatoReversale(sTestaMandato_gen.CD_CDS,
                                         sTestaMandato_gen.ESERCIZIO,
                             sTestaMandato_gen.PG_MANDATO,
                             'MAN',
                             'I',
                             sTestaMandato_gen.utuv);
        else
           desc_errore := 'Saldo CC dei Capitoli oppure Cassa Cds, non sufficiente';
           IBMERR001.RAISE_ERR_GENERICO(desc_errore);
          end if;
      end if;
        if contatore = 0 then
         aManPrncT := sTestaMandato_gen;
         aManPrncR := lRigheMandato_gen;
      end if;
        if contatore = 1 then
         aManColl01T := sTestaMandato_gen;
         aManColl01R := lRigheMandato_gen;
      end if;
        if contatore = 2 then
         aManColl02T := sTestaMandato_gen;
         aManColl02R := lRigheMandato_gen;
      end if;
        if contatore = 3 then
         aManColl03T := sTestaMandato_gen;
         aManColl03R := lRigheMandato_gen;
      end if;
        if contatore = 4 then
         aManColl04T := sTestaMandato_gen;
         aManColl04R := lRigheMandato_gen;
      end if;
        if contatore = 5 then
         aManColl05T := sTestaMandato_gen;
         aManColl05R := lRigheMandato_gen;
      end if;
        if contatore = 6 then
         aManColl06T := sTestaMandato_gen;
         aManColl06R := lRigheMandato_gen;
      end if;
        if contatore = 7 then
         aManColl07T := sTestaMandato_gen;
         aManColl07R := lRigheMandato_gen;
      end if;
        if contatore = 8 then
         aManColl08T := sTestaMandato_gen;
         aManColl08R := lRigheMandato_gen;
      end if;
        if contatore = 9 then
         aManColl09T := sTestaMandato_gen;
         aManColl09R := lRigheMandato_gen;
      end if;
        if contatore = 10 then
         aManColl10T := sTestaMandato_gen;
         aManColl10R := lRigheMandato_gen;
      end if;
    end loop;

    contatore:=1;

      for contatore in 1..11 loop
        if contatore = 1 then
         sTestaReversale_gen := aRevColl01T;
         lRigheReversale_gen := aRevColl01R;
      end if;
        if contatore = 2 then
         sTestaReversale_gen := aRevColl02T;
         lRigheReversale_gen := aRevColl02R;
      end if;
        if contatore = 3 then
         sTestaReversale_gen := aRevColl03T;
         lRigheReversale_gen := aRevColl03R;
      end if;
        if contatore = 4 then
         sTestaReversale_gen := aRevColl04T;
         lRigheReversale_gen := aRevColl04R;
      end if;
        if contatore = 5 then
         sTestaReversale_gen := aRevColl05T;
         lRigheReversale_gen := aRevColl05R;
      end if;
        if contatore = 6 then
         sTestaReversale_gen := aRevColl06T;
         lRigheReversale_gen := aRevColl06R;
      end if;
        if contatore = 7 then
         sTestaReversale_gen := aRevColl07T;
         lRigheReversale_gen := aRevColl07R;
      end if;
        if contatore = 8 then
         sTestaReversale_gen := aRevColl08T;
         lRigheReversale_gen := aRevColl08R;
      end if;
        if contatore = 9 then
         sTestaReversale_gen := aRevColl09T;
         lRigheReversale_gen := aRevColl09R;
      end if;
        if contatore = 10 then
         sTestaReversale_gen := aRevColl10T;
         lRigheReversale_gen := aRevColl10R;
      end if;
      if contatore = 11 then
         sTestaReversale_gen := aRevColl11T;
         lRigheReversale_gen := aRevColl11R;
      end if;
      if (lRigheReversale_gen.count > 0) then
        select fl_tesoreria_unica into tesoreria_unica from parametri_cnr
         where
              esercizio =sTestaReversale_gen.esercizio;
       if(tesoreria_unica='N') then
            sTestaReversale_gen.pg_reversale   := CNRCTB018.getNextNumDocCont(sTestaReversale_gen.cd_tipo_documento_cont, sTestaReversale_gen.esercizio, sTestaReversale_gen.cd_cds, sTestaReversale_gen.utcr);
       else
            sTestaReversale_gen.pg_reversale   := CNRCTB018.getNextNumDocCont(sTestaReversale_gen.cd_tipo_documento_cont, sTestaReversale_gen.esercizio, cnrctb020.getCDCDSENTE(sTestaReversale_gen.esercizio), sTestaReversale_gen.utcr);
       end if;
        for aInd in 1..lRigheReversale_gen.count loop
                -- controllo se il l'accertamento specificata sulle righe ? su partita di giro ed eventualemente aggiorno la riga della reversale di conseguenza
              begin
               select * into aAcc from accertamento where
                    cd_cds = lRigheReversale_gen(aInd).cd_cds
                and esercizio = lRigheReversale_gen(aInd).esercizio_accertamento
                and esercizio_originale = lRigheReversale_gen(aInd).esercizio_ori_accertamento
                and pg_accertamento = lRigheReversale_gen(aInd).pg_accertamento
               for update nowait;
              exception when NO_DATA_FOUND then
               IBMERR001.RAISE_ERR_GENERICO('Accertamento a cui collegare la riga di reversale non trovato');
              end;
                lRigheReversale_gen(aInd).fl_pgiro:=aAcc.fl_pgiro;
              end loop;
        -- Impostazione dello STATO_COGE - se non impostato viene messo a X
        if sTestaReversale_gen.STATO_COGE is null then
         sTestaReversale_gen.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
        end if;
        -- Troncamento della data di registrazione
        sTestaReversale_gen.dt_emissione:=trunc(sTestaReversale_gen.dt_emissione);
        -- Impostazione di UTUV DUVA e PG_VER_REC per la testata della reversale
            sTestaReversale_gen.UTUV := sTestaReversale_gen.UTCR;
            sTestaReversale_gen.DUVA := sTestaReversale_gen.DUVA;
            sTestaReversale_gen.PG_VER_REC := 1;
        -- Inserimento della testata della reversale
              cnrctb038.ins_REVERSALE(sTestaReversale_gen);
          for i in 1..lRigheReversale_gen.count loop
            lRigheReversale_gen(i).pg_reversale:= sTestaReversale_gen.pg_reversale;
                -- Impostazione di UTUV DUVA e PG_VER_REC
            lRigheReversale_gen(i).UTUV:= lRigheReversale_gen(i).UTCR;
            lRigheReversale_gen(i).DUVA:= lRigheReversale_gen(i).DACR;
            lRigheReversale_gen(i).PG_VER_REC:= 1;
          -- Inserimento riga
            cnrctb038.ins_REVERSALE_RIGA(lRigheReversale_gen(i));

                                  -- 23.05.2007 Stanislao Fusco
                                  -- Inserita procedura che pu? inserire la riga automatica SIOPE
                                  Inserisci_SIOPE_automatico (lRigheReversale_gen(i));

          sCodiceTerzo := lRigheReversale_gen(i).CD_TERZO;
        end loop;
          updScadAccertamento(sTestaReversale_gen);
--DBMS_Output.PUT_LINE ('R 1');
          updSaldoCapitoliR(sTestaReversale_gen,'I','A');
          sReversaleTerzo.CD_CDS := sTestaReversale_gen.CD_CDS;
          sReversaleTerzo.CD_TERZO := sCodiceTerzo;
          sReversaleTerzo.CD_TIPO_BOLLO := aTipoBolloE.cd_tipo_bollo;
          sReversaleTerzo.DACR := sTestaReversale_gen.DACR;
          sReversaleTerzo.DUVA := sTestaReversale_gen.DUVA;
          sReversaleTerzo.ESERCIZIO := sTestaReversale_gen.ESERCIZIO;
          sReversaleTerzo.PG_REVERSALE := sTestaReversale_gen.PG_REVERSALE;
          sReversaleTerzo.PG_VER_REC := 1;
          sReversaleTerzo.UTCR := sTestaReversale_gen.UTCR;
          sReversaleTerzo.UTUV := sTestaReversale_gen.UTUV;
          cnrctb038.ins_REVERSALE_TERZO(sReversaleTerzo);
        if isConMandatoPrincipale then -- Se c'? mandato principale lo collego alla reversale
         cnrctb038.ins_ASS_MANDATO_REVERSALE (aManPrncT, aManPrncT.pg_mandato, sTestaReversale_gen);
            end if;
        cnrctb300.leggiMandatoReversale(sTestaReversale_gen.CD_CDS,
                                      sTestaReversale_gen.ESERCIZIO,
                          sTestaReversale_gen.PG_REVERSALE,
                          'REV',
                          'I',
                          sTestaReversale_gen.utuv);
      end if;
        if contatore = 1 then
         aRevColl01T := sTestaReversale_gen;
         aRevColl01R := lRigheReversale_gen;
      end if;
        if contatore = 2 then
         aRevColl02T := sTestaReversale_gen;
         aRevColl02R := lRigheReversale_gen;
      end if;
        if contatore = 3 then
         aRevColl03T := sTestaReversale_gen;
         aRevColl03R := lRigheReversale_gen;
      end if;
        if contatore = 4 then
         aRevColl04T := sTestaReversale_gen;
         aRevColl04R := lRigheReversale_gen;
      end if;
        if contatore = 5 then
         aRevColl05T := sTestaReversale_gen;
         aRevColl05R := lRigheReversale_gen;
      end if;
        if contatore = 6 then
         aRevColl06T := sTestaReversale_gen;
         aRevColl06R := lRigheReversale_gen;
      end if;
        if contatore = 7 then
         aRevColl07T := sTestaReversale_gen;
         aRevColl07R := lRigheReversale_gen;
      end if;
        if contatore = 8 then
         aRevColl08T := sTestaReversale_gen;
         aRevColl08R := lRigheReversale_gen;
      end if;
        if contatore = 9 then
         aRevColl09T := sTestaReversale_gen;
         aRevColl09R := lRigheReversale_gen;
      end if;
        if contatore = 10 then
         aRevColl10T := sTestaReversale_gen;
         aRevColl10R := lRigheReversale_gen;
      end if;
      if contatore = 11 then
         aRevColl11T := sTestaReversale_gen;
         aRevColl11R := lRigheReversale_gen;
      end if;
    end loop;
 exception when dup_val_on_index then
     desc_errore := 'Chiave duplicata';
     IBMERR001.RAISE_ERR_GENERICO(desc_errore);
 end;

 procedure GENERAECOLLEGADOC(
   aManP in mandato%rowtype,
   aRev in out reversale%rowtype,
   aListaRev in out CNRCTB038.righeReversaleList,
   isFromStipendi in boolean default false
 ) is
  aTempManP mandato%rowtype;
  sReversaleTerzo reversale_terzo%rowtype;
  sCodiceTerzo mandato_riga.CD_TERZO%type;
  desc_errore varchar2(2000);
  aTipoBolloE tipo_bollo%rowtype;
  aAcc accertamento%rowtype;
  tesoreria_unica char(1):='N';
  aRevExist boolean := false;
 begin
  If isFromStipendi and aRev.pg_reversale is not null Then
    aRevExist := true;
  End If; 
  
    begin
       select * into aTipoBolloE from tipo_bollo where
            ti_entrata_spesa in ('*',CNRCTB001.GESTIONE_ENTRATE)
      and fl_cancellato='N'
      and fl_default='Y';
    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Tipo bollo di default non trovato');
    end;

    begin
            select * into aTempManP from mandato
      Where esercizio = aManP.esercizio And
            cd_cds = aManP.cd_cds And
            pg_mandato = aManp.pg_mandato
            for update nowait;
          exception when NO_DATA_FOUND then
           IBMERR001.RAISE_ERR_GENERICO('Mandato non trovato: '||aManP.pg_mandato||' cds:'||aManP.cd_cds||' es.:'||aManP.esercizio);
    end;

    begin
       select fl_tesoreria_unica into tesoreria_unica from parametri_cnr
       where
            esercizio =aManP.esercizio;

    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Configurazione gestione tesoreria mancante');
    end;
  
    If (aListaRev.count > 0) then
      For aInd in 1..aListaRev.count loop
                -- controllo se il l'accertamento specificata sulle righe ? su partita di giro
                -- ed eventualemente aggiorno la riga della reversale di conseguenza
              Begin
               select *
               into aAcc
               from  accertamento
               Where cd_cds = aListaRev(aInd).cd_cds
                and  esercizio = aListaRev(aInd).esercizio_accertamento
                and  esercizio_originale = aListaRev(aInd).esercizio_ori_accertamento
                and  pg_accertamento = aListaRev(aInd).pg_accertamento
                 for update nowait;
              Exception when NO_DATA_FOUND then
               IBMERR001.RAISE_ERR_GENERICO('Accertamento a cui collegare la riga di reversale non trovato');
              End;
              aListaRev(aInd).fl_pgiro := aAcc.fl_pgiro;

      End loop;
      
      If not aRevExist Then
        if(tesoreria_unica='N') then
          aRev.pg_reversale   := CNRCTB018.getNextNumDocCont(aRev.cd_tipo_documento_cont, aRev.esercizio, aRev.cd_cds, aRev.utcr);
        else
          aRev.pg_reversale   := CNRCTB018.getNextNumDocCont(aRev.cd_tipo_documento_cont, aRev.esercizio, cnrctb020.getCDCDSENTE(aRev.esercizio), aRev.utcr);
        end if;

        -- Impostazione dello STATO_COGE - se non impostato viene messo a X
        if aRev.STATO_COGE is null then
           aRev.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
        end if;

        -- Troncamento della data di registrazione
        aRev.dt_emissione:=trunc(aRev.dt_emissione);
        -- Impostazione di UTUV DUVA e PG_VER_REC per la testata della reversale
        aRev.UTUV := aRev.UTCR;
        aRev.DUVA := aRev.DUVA;
        aRev.PG_VER_REC := 1;

        -- Inserimento della testata della reversale
        cnrctb038.ins_REVERSALE(aRev);
      End if;

      for i in 1..aListaRev.count loop
        aListaRev(i).pg_reversale:= aRev.pg_reversale;
        -- Impostazione di UTUV DUVA e PG_VER_REC
        aListaRev(i).UTUV:= aListaRev(i).UTCR;
        aListaRev(i).DUVA:= aListaRev(i).DACR;
        aListaRev(i).PG_VER_REC:= 1;
       
        -- Inserimento riga
        cnrctb038.ins_REVERSALE_RIGA(aListaRev(i));

        -- 23.05.2007 Stanislao Fusco
        -- Inserita procedura che pu? inserire la riga automatica SIOPE

        Inserisci_SIOPE_automatico (aListaRev(i));

        sCodiceTerzo := aListaRev(i).CD_TERZO;
      end loop;

      If not aRevExist Then
        sReversaleTerzo.CD_CDS := aRev.CD_CDS;
        sReversaleTerzo.CD_TERZO := sCodiceTerzo;
        sReversaleTerzo.CD_TIPO_BOLLO := aTipoBolloE.cd_tipo_bollo;
        sReversaleTerzo.DACR := aRev.DACR;
        sReversaleTerzo.DUVA := aRev.DUVA;
        sReversaleTerzo.ESERCIZIO := aRev.ESERCIZIO;
        sReversaleTerzo.PG_REVERSALE := aRev.PG_REVERSALE;
        sReversaleTerzo.PG_VER_REC := 1;
        sReversaleTerzo.UTCR := aRev.UTCR;
        sReversaleTerzo.UTUV := aRev.UTUV;

        cnrctb038.ins_REVERSALE_TERZO(sReversaleTerzo);

        cnrctb038.ins_ASS_MANDATO_REVERSALE (aManP, aManP.pg_mandato, aRev);
      End if;
      
      If not isFromStipendi Then
        updScadAccertamento(aRev);
        updSaldoCapitoliR(aRev,'I','A');

        cnrctb300.leggiMandatoReversale(aRev.CD_CDS, aRev.ESERCIZIO, aRev.PG_REVERSALE, 'REV', 'I', aRev.utuv);

        -- Aggiorno l'importo ritenute del mandato principale
        update mandato
        -- Devo sommare le ritenute !!!! 22/01/2003
        Set im_ritenute = im_ritenute + aRev.im_reversale
        Where esercizio = aManP.esercizio And
              cd_cds = aManP.cd_cds And
              pg_mandato = aManp.pg_mandato;
      End If;
    End if;
 end;

 procedure GENERAECOLLEGADOC(
   aManP in mandato%rowtype,
   aMan in out mandato%rowtype,
   aListaMan in out CNRCTB038.righeMandatoList
 ) is
  aTempManP mandato%rowtype;
  sMandatoTerzo mandato_terzo%rowtype;
  sCodiceTerzo mandato_riga.CD_TERZO%type;
  aAssManMan ass_mandato_mandato%rowtype;
  desc_errore varchar2(2000);
  aTipoBolloE tipo_bollo%rowtype;
  aObb obbligazione%rowtype;
  tesoreria_unica char(1):='N';
 begin
       begin
       select * into aTipoBolloE from tipo_bollo where
            ti_entrata_spesa in ('*',CNRCTB001.GESTIONE_SPESE)
      and fl_cancellato='N'
      and fl_default='Y';
    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Tipo bollo di default non trovato');
    end;

          begin
          select * into aTempManP from mandato
        where
             esercizio = aManP.esercizio
         and cd_cds = aManP.cd_cds
         and pg_mandato = aManp.pg_mandato
        for update nowait;
      exception when NO_DATA_FOUND then
           IBMERR001.RAISE_ERR_GENERICO('Mandato non trovato: '||aManP.pg_mandato||' cds:'||aManP.cd_cds||' es.:'||aManP.esercizio);
      end;
      begin
       select fl_tesoreria_unica into tesoreria_unica from parametri_cnr
       where
            esercizio =aMan.esercizio;

    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Configurazione gestione tesoreria mancante');
    end;
      if (aListaMan.count > 0) then
         if(tesoreria_unica='N') then
            aMan.pg_mandato   := CNRCTB018.getNextNumDocCont(aMan.cd_tipo_documento_cont, aMan.esercizio, aMan.cd_cds, aMan.utcr);
        else
            aMan.pg_mandato   := CNRCTB018.getNextNumDocCont(aMan.cd_tipo_documento_cont, aMan.esercizio,cnrctb020.getCDCDSENTE(aMan.esercizio), aMan.utcr);
       end if;
        for aInd in 1..aListaMan.count loop
                -- controllo se il mandato specificato sulle righe ? su partita di giro ed eventualemente aggiorno la riga del mandato di conseguenza
              begin
               select * into aObb from obbligazione where
                    cd_cds = aListaMan(aInd).cd_cds
                and esercizio = aListaMan(aInd).esercizio_obbligazione
                and esercizio_originale = aListaMan(aInd).esercizio_ori_obbligazione
          and pg_obbligazione = aListaMan(aInd).pg_obbligazione
               for update nowait;
              exception when NO_DATA_FOUND then
               IBMERR001.RAISE_ERR_GENERICO(cnrutil.getLabelObbligazione()||' a cui collegare la riga di mandato non trovata');
              end;
                aListaMan(aInd).fl_pgiro:=aObb.fl_pgiro;
              end loop;
        -- Impostazione dello STATO_COGE - se non impostato viene messo a X
        if aMan.STATO_COGE is null then
         aMan.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
        end if;
        -- Troncamento della data di registrazione
        aMan.dt_emissione:=trunc(aMan.dt_emissione);
        -- Impostazione di UTUV DUVA e PG_VER_REC per la testata del mandato
            aMan.UTUV := aMan.UTCR;
            aMan.DUVA := aMan.DUVA;
            aMan.PG_VER_REC := 1;
        -- Inserimento della testata della reversale
              cnrctb038.ins_MANDATO(aMan);
          for i in 1..aListaMan.count loop
            aListaMan(i).pg_mandato:= aMan.pg_mandato;
                -- Impostazione di UTUV DUVA e PG_VER_REC
            aListaMan(i).UTUV:= aListaMan(i).UTCR;
            aListaMan(i).DUVA:= aListaMan(i).DACR;
            aListaMan(i).PG_VER_REC:= 1;
          -- Inserimento riga
            cnrctb038.ins_MANDATO_RIGA(aListaMan(i));

                                  -- 23.04.2007 Stanislao Fusco
                                  -- Inserita procedura che pu? inserire la riga automatica SIOPE
                                  Inserisci_SIOPE_automatico(aListaMan(i));

          sCodiceTerzo := aListaMan(i).CD_TERZO;
        end loop;
          updScadObbligazione(aMan);
--DBMS_Output.PUT_LINE ('M 1');
          updSaldoCapitoliM(aMan,'I','A');
          sMandatoTerzo.CD_CDS := aMan.CD_CDS;
          sMandatoTerzo.CD_TERZO := sCodiceTerzo;
          sMandatoTerzo.CD_TIPO_BOLLO := aTipoBolloE.cd_tipo_bollo;
          sMandatoTerzo.DACR := aMan.DACR;
          sMandatoTerzo.DUVA := aMan.DUVA;
          sMandatoTerzo.ESERCIZIO := aMan.ESERCIZIO;
          sMandatoTerzo.PG_MANDATO := aMan.PG_MANDATO;
          sMandatoTerzo.PG_VER_REC := 1;
          sMandatoTerzo.UTCR := aMan.UTCR;
          sMandatoTerzo.UTUV := aMan.UTUV;
          cnrctb038.ins_MANDATO_TERZO(sMandatoTerzo);
              aAssManMan.CD_CDS:=aManP.cd_cds;
              aAssManMan.ESERCIZIO:=aManP.esercizio;
              aAssManMan.PG_MANDATO:=aManP.pg_mandato;
              aAssManMan.CD_CDS_COLL:=aMan.CD_CDS;
              aAssManMan.ESERCIZIO_COLL:=aMan.esercizio;
              aAssManMan.PG_MANDATO_COLL:=aMan.pg_mandato;
              aAssManMan.DACR:=aMan.DACR;
              aAssManMan.UTCR:=aMan.UTCR;
              aAssManMan.DUVA:=aMan.DACR;
              aAssManMan.UTUV:=aMan.UTCR;
              aAssManMan.PG_VER_REC:=1;
          cnrctb038.ins_ASS_MANDATO_MANDATO (aAssManMan);
        cnrctb300.leggiMandatoReversale(aMan.CD_CDS,
                                      aMan.ESERCIZIO,
                          aMan.PG_MANDATO,
                          'MAN',
                          'I',
                          aMan.utuv);
      end if;
 end;

 PROCEDURE checkRevDisassocMan
 (
  aCdCdsMan varchar2,
  aEsMan number,
  aPgMan number,
  aCdCdsRev varchar2,
  aEsRev number,
  aPgRev number
 ) IS
 BEGIN
  for aComp in (select a.* from compenso a, mandato_riga b where
           b.cd_cds_doc_amm = a.cd_cds
     and b.cd_uo_doc_amm = a.cd_unita_organizzativa
     and b.cd_tipo_documento_amm = CNRCTB100.TI_COMPENSO
     and b.pg_doc_amm = a.pg_compenso
     and b.esercizio_doc_amm = a.esercizio
     and b.cd_cds = aCdCdsMan
     and b.esercizio = aEsMan
     and b.pg_mandato = aPgMan) loop
   for aCori in (select a.* from contributo_ritenuta a, reversale_riga b
    where
         a.cd_cds = aComp.cd_cds
     and a.esercizio = aComp.esercizio
     and a.cd_unita_organizzativa = aComp.cd_unita_organizzativa
     and a.pg_compenso = aComp.pg_compenso
     and b.cd_cds = a.cd_cds_accertamento
     and b.esercizio_accertamento = a.esercizio_accertamento
     and b.esercizio_ori_accertamento = a.esercizio_ori_accertamento
     and b.pg_accertamento = a.pg_accertamento
     and b.pg_accertamento_scadenzario = a.pg_accertamento_scadenzario
     and b.esercizio_doc_amm = a.esercizio
     and b.cd_cds = aCdCdsRev
     and b.esercizio = aEsRev
     and b.pg_reversale = aPgRev) loop
    -- Verifica che la reversale non sia relativa al compenso di cui aPgMan ? il mandato principale
    IBMERR001.RAISE_ERR_GENERICO('La reversale n. '||aPgRev||' non é scollegabile dal mandato n.'||aPgMan||' cds:'||aCdCdsMan||' es.:'||aEsMan);
   end loop;
  end loop;
  -- Se la reversale ? collegata a generico di versamento ENTRATA non pu? essere scollegata dal mandato
  declare
   aRRL reversale_riga%rowtype;
  begin
    select * into aRRL from reversale_riga where
          esercizio = aEsRev
    and cd_cds = aCdCdsRev
    and pg_reversale = aPgRev
     for update nowait;
    if aRRL.cd_tipo_documento_amm = CNRCTB100.TI_GEN_CORI_VER_ENTRATA then
       IBMERR001.RAISE_ERR_GENERICO('La reversale n. '||aPgRev||' non é scollegabile dal mandato n.'||aPgMan||' cds:'||aCdCdsMan||' es.:'||aEsMan);
    end if;
  end;
 END;


 PROCEDURE checkReversaliAssociate
   (
    inCdsMandato MANDATO.cd_cds%TYPE,
    inEsercizioMandato MANDATO.esercizio%TYPE,
    inPgMandato MANDATO.pg_mandato%TYPE,
    inImRitenute IN OUT NUMBER
   ) IS
     aImRitenute NUMBER(15,2);
     aImTmp NUMBER(15,2);
     aMan mandato%rowtype;
   BEGIN
    begin
   select * into aMan from mandato where
        cd_cds = inCdsMandato
    and esercizio = inEsercizioMandato
    and pg_mandato = inPgMandato
   for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Mandato non trovato n.'||inPgMandato||' cds:'||inCdsMandato||' es.:'||inEsercizioMandato);
  end;
    select nvl(sum(b.im_reversale),0) into aImTmp from ass_mandato_reversale a, reversale b where
        a.cd_cds_mandato = inCdsMandato
    and a.esercizio_mandato = inEsercizioMandato
    and a.pg_mandato = inPgMandato
    and a.cd_cds_reversale = inCdsMandato
    and a.esercizio_reversale = inEsercizioMandato
    and b.cd_cds = a.cd_cds_reversale
    and b.esercizio = a.esercizio_reversale
    and b.pg_reversale = a.pg_reversale
    and b.stato = CNRCTB038.STATO_AUT_EME;
    aImRitenute:=aImTmp;
  if aImRitenute > aMan.im_mandato then
   IBMERR001.RAISE_ERR_GENERICO('L''importo delle ritenute supera l''importo del mandato n.'||inPgMandato||' cds:'||inCdsMandato||' es.:'||inEsercizioMandato);
  end if;
    inImRitenute := aImRitenute;
 END checkReversaliAssociate;

 --
 -- Pre-post name: Generazione reversale
 -- Pre condizione: Sono stati definiti i dati di testata e delle righe della reversale
 -- Post condizione:
 --  La reversale e le sue righe vengono inserita; per ogni riga viene calcolato il fl_pgiro;
 --  viene creata la reversale_terzo selezioando il tipo bollo do default; vengono aggiornati gli
 --  importi associati a doc.contabili delle scadenze degli accertamenti delle righe delle reversali;
 --  vengono aggiornati i saldi delle voci.
 --

procedure GENERAREVERSALE(
   aRev IN OUT reversale%rowtype,
   aListaRev IN OUT CNRCTB038.righeReversaleList
 ) is
  sReversaleTerzo reversale_terzo%rowtype;
  sCodiceTerzo mandato_riga.CD_TERZO%type;
  desc_errore varchar2(2000);
  aTipoBolloE tipo_bollo%rowtype;
  aAcc accertamento%rowtype;
  tesoreria_unica char(1):='N';
begin
   begin
       select * into aTipoBolloE from tipo_bollo where
            ti_entrata_spesa in ('*',CNRCTB001.GESTIONE_ENTRATE)
      and fl_cancellato='N'
      and fl_default='Y';
    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Tipo bollo di default non trovato');
    end;
    begin
       select fl_tesoreria_unica into tesoreria_unica from parametri_cnr
       where
            esercizio =aRev.esercizio;

    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Configurazione gestione tesoreria mancante');
    end;
   if (aListaRev.count > 0) then
      if(tesoreria_unica='N') then
           aRev.pg_reversale   := CNRCTB018.getNextNumDocCont(aRev.cd_tipo_documento_cont, aRev.esercizio, aRev.cd_cds, aRev.utcr);
       else
           aRev.pg_reversale   := CNRCTB018.getNextNumDocCont(aRev.cd_tipo_documento_cont, aRev.esercizio, cnrctb020.getCDCDSENTE(aRev.esercizio), aRev.utcr);
       end if;
    for aInd in 1..aListaRev.count loop
        -- controllo se il l'accertamento specificata sulle righe ? su partita di giro ed eventualemente aggiorno la riga della reversale di conseguenza
        begin
           select * into aAcc from accertamento where
                cd_cds = aListaRev(aInd).cd_cds
                  and esercizio = aListaRev(aInd).esercizio_accertamento
                  and esercizio_originale = aListaRev(aInd).esercizio_ori_accertamento
                  and pg_accertamento = aListaRev(aInd).pg_accertamento
             for update nowait;
        exception when NO_DATA_FOUND then
          IBMERR001.RAISE_ERR_GENERICO('Accertamento a cui collegare la riga di reversale non trovato');
        end;
        aListaRev(aInd).fl_pgiro:=aAcc.fl_pgiro;
        end loop;
  -- Impostazione dello STATO_COGE - se non impostato viene messo a X
      if aRev.STATO_COGE is null then
       aRev.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
    end if;
 -- Troncamento della data di registrazione
    aRev.dt_emissione:=trunc(aRev.dt_emissione);
 -- Impostazione di UTUV DUVA e PG_VER_REC per la testata della reversale
      aRev.UTUV := aRev.UTCR;
      aRev.DUVA := aRev.DUVA;
      aRev.PG_VER_REC := 1;
  -- Inserimento della testata della reversale
        cnrctb038.ins_REVERSALE(aRev);
      for i in 1..aListaRev.count loop
         aListaRev(i).pg_reversale:= aRev.pg_reversale;
           -- Impostazione di UTUV DUVA e PG_VER_REC
         aListaRev(i).UTUV:= aListaRev(i).UTCR;
         aListaRev(i).DUVA:= aListaRev(i).DACR;
         aListaRev(i).PG_VER_REC:= 1;
       -- Inserimento riga
        cnrctb038.ins_REVERSALE_RIGA(aListaRev(i));

              -- 23.05.2007 Stanislao Fusco
                        -- Inserita procedura che pu? inserire la riga automatica SIOPE
                        Inserisci_SIOPE_automatico (aListaRev(i));

      sCodiceTerzo := aListaRev(i).CD_TERZO;
    end loop;
      updScadAccertamento(aRev);
--DBMS_Output.PUT_LINE ('R 3');
      updSaldoCapitoliR(aRev,'I','A');
      sReversaleTerzo.CD_CDS := aRev.CD_CDS;
      sReversaleTerzo.CD_TERZO := sCodiceTerzo;
      sReversaleTerzo.CD_TIPO_BOLLO := aTipoBolloE.cd_tipo_bollo;
      sReversaleTerzo.DACR := aRev.DACR;
      sReversaleTerzo.DUVA := aRev.DUVA;
      sReversaleTerzo.ESERCIZIO := aRev.ESERCIZIO;
      sReversaleTerzo.PG_REVERSALE := aRev.PG_REVERSALE;
      sReversaleTerzo.PG_VER_REC := 1;
      sReversaleTerzo.UTCR := aRev.UTCR;
      sReversaleTerzo.UTUV := aRev.UTUV;
      cnrctb038.ins_REVERSALE_TERZO(sReversaleTerzo);
    cnrctb300.leggiMandatoReversale(aRev.CD_CDS,
                                      aRev.ESERCIZIO,
                          aRev.PG_REVERSALE,
                          'REV',
                          'I',
                          aRev.utuv);
  end if;
 end;


 -- crea il dettaglio di un sospeso di entrata associato alla reversale
 -- e aggiorna l'importo associato della testata del sospeso

procedure GENERADETT_ETR_SOSPESO(
   aRev IN  reversale%rowtype,
   aSospeso IN OUT sospeso%rowtype,
   aUser varchar2
 ) is
   aSospesoDet sospeso_det_etr%rowtype;
   aTSNow date;
 begin

   aTSNow:=sysdate;

   begin
   select * into aSospeso from sospeso a
   where
        cd_cds = aSospeso.cd_cds
        and esercizio = aSospeso.esercizio
      and ti_entrata_spesa = aSospeso.ti_entrata_spesa
    and ti_sospeso_riscontro = aSospeso.ti_sospeso_riscontro
    and cd_sospeso = aSospeso.cd_sospeso
     for update nowait;
  exception when NO_DATA_FOUND then
   IBMERR001.RAISE_ERR_GENERICO('Il sospeso non é stato trovato');
  end;

  if (aSospeso.im_sospeso - aSospeso.im_associato) < aRev.im_reversale then
     IBMERR001.RAISE_ERR_GENERICO('La disponibilità del sospeso é inferiore all''importo della reversale');
  end if;

   aSospesoDet.CD_CDS:=aSospeso.cd_cds;
   aSospesoDet.ESERCIZIO:=aRev.esercizio;
   aSospesoDet.PG_REVERSALE:=aRev.pg_reversale;
   aSospesoDet.TI_ENTRATA_SPESA:=aSospeso.ti_entrata_spesa;
   aSospesoDet.TI_SOSPESO_RISCONTRO:=aSospeso.ti_sospeso_riscontro;
   aSospesoDet.CD_SOSPESO:=aSospeso.cd_sospeso;
   aSospesoDet.IM_ASSOCIATO:=aRev.im_reversale;
   aSospesoDet.STATO:=cnrctb038.STATO_SOSPESO_DET_DEFAULT;
   aSospesoDet.DACR:=aTSNow;
   aSospesoDet.UTCR:=aUser;
   aSospesoDet.UTUV:=aUser;
   aSospesoDet.DUVA:=aTSNow;
   aSospesoDet.PG_VER_REC:=1;
   aSospesoDet.CD_CDS_REVERSALE:=aRev.cd_cds;
   cnrctb038.INS_SOSPESO_DET_ETR( aSospesoDet );

   update sospeso
      set
     im_associato = im_associato+ aRev.im_reversale,cd_cds_origine =aRev.cd_cds,
     utuv=aUser,
     duva=aTSNow,
     pg_ver_rec=pg_ver_rec+1
   where
      cd_cds = aSospeso.cd_cds
      and esercizio = aSospeso.esercizio
    and ti_entrata_spesa = aSospeso.ti_entrata_spesa
    and ti_sospeso_riscontro = aSospeso.ti_sospeso_riscontro
    and cd_sospeso = aSospeso.cd_sospeso;
   end;

   -- Non aggiorna l'importo associato a DOC amm su accertamento
  procedure modificaRevProvvPgiro(aRev IN OUT reversale%rowtype, aTSNow date, aUser varchar2) is
   aLocRev reversale%rowtype;
   aLocRevRiga reversale_riga%rowtype;
   aAcc accertamento%rowtype;
   aSaldo voce_f_saldi_cmp%rowtype;
   aSaldoCdrLinea voce_f_saldi_cdr_linea%Rowtype;
   parametriCnr parametri_cnr%rowtype;
  begin
    begin
   select * into aLocRev from reversale where
        cd_cds = aRev.cd_cds
      and esercizio = aRev.esercizio
      and pg_reversale = aRev.pg_reversale
   for update nowait;
   select * into aLocRevRiga from reversale_riga where
        cd_cds = aRev.cd_cds
      and esercizio = aRev.esercizio
      and pg_reversale = aRev.pg_reversale
   for update nowait;
    exception
   when NO_DATA_FOUND then
        IBMERR001.RAISE_ERR_GENERICO('Reversale non trovata');
   when TOO_MANY_ROWS then
        IBMERR001.RAISE_ERR_GENERICO('La reversale provvisoria con più righe non é modificabile');
  end;

    begin
     select * into aAcc from accertamento where
           cd_cds = aLocRevRiga.cd_cds
       and esercizio = aLocRevRiga.esercizio_accertamento
       and esercizio_originale = aLocRevRiga.esercizio_ori_accertamento
       and pg_accertamento = aLocRevRiga.pg_accertamento
       and fl_pgiro = 'Y'
   for update nowait;
    exception when NO_DATA_FOUND then
     IBMERR001.RAISE_ERR_GENERICO('Accertamento su partita di giro a cui collegare la riga di reversale non trovato');
    end;

  update reversale set
   im_reversale = aRev.im_reversale,
   duva=aTSNow,
   utuv=aUser,
   pg_ver_rec=pg_ver_rec+1
  where cd_cds = aRev.cd_cds
    and esercizio = aRev.esercizio
    and pg_reversale = aRev.pg_reversale;

  update reversale_riga set
   im_reversale_riga = aRev.im_reversale,
   duva=aTSNow,
   utuv=aUser,
   pg_ver_rec=pg_ver_rec+1
  where cd_cds = aRev.cd_cds
    and esercizio = aRev.esercizio
    and pg_reversale = aRev.pg_reversale;

  update reversale_siope set
   importo = aRev.im_reversale,
   duva=aTSNow,
   utuv=aUser,
   pg_ver_rec=pg_ver_rec+1
  where cd_cds = aRev.cd_cds
    and esercizio = aRev.esercizio
    and pg_reversale = aRev.pg_reversale;
    if(parametriCnr.fl_nuovo_pdg='N') then
        begin
         select * into aSaldo from voce_f_saldi_cmp where
             CD_CDS=aAcc.cd_cds
         and ESERCIZIO=aAcc.esercizio
         and TI_APPARTENENZA=aAcc.ti_appartenenza
         and TI_GESTIONE=aAcc.ti_gestione
         and CD_VOCE=aAcc.cd_voce
         and TI_COMPETENZA_RESIDUO=CNRCTB054.TI_COMPETENZA
        for update nowait;
       exception when NO_DATA_FOUND then
        IBMERR001.RAISE_ERR_GENERICO('Capitolo finanziario non trovato:'||aAcc.cd_voce);
       end;

   -- Aggiorno VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
   CNRCTB054.aggiornaSaldi(aSaldo,'A',aRev.im_reversale-aLocRev.im_reversale,aUser,aTSNow);
   end if;
   for aListaScad in (select * from v_mandato_reversale_scad_voce
                     Where esercizio = aRev.esercizio
           And cd_cds = aRev.cd_cds
           And pg_documento = aRev.pg_reversale
           And ti_documento = 'R') loop
   Begin
    -- Aggiorno VOCE_F_SALDI_CDR_LINEA M.S. 19/12/2005
    aSaldoCdrLinea.ESERCIZIO := aListaScad.ESERCIZIO;
    aSaldoCdrLinea.ESERCIZIO_RES := aListaScad.ESERCIZIO_ORIGINALE;
    aSaldoCdrLinea.CD_CENTRO_RESPONSABILITA := aListaScad.CD_CENTRO_RESPONSABILITA;
    aSaldoCdrLinea.CD_LINEA_ATTIVITA := aListaScad.CD_LINEA_ATTIVITA;
    aSaldoCdrLinea.TI_APPARTENENZA := aListaScad.TI_APPARTENENZA;
    aSaldoCdrLinea.TI_GESTIONE := aListaScad.TI_GESTIONE;
    aSaldoCdrLinea.CD_VOCE := aListaScad.CD_VOCE;

    CNRCTB054.RESET_IMPORTI_SALDI (aSaldoCdrLinea);

    If aListaScad.CD_TIPO_DOCUMENTO_CONT In (CNRCTB018.TI_DOC_OBB, CNRCTB018.TI_DOC_OBB_RES_PRO, CNRCTB018.TI_DOC_OBB_PGIRO_RES,
                                             CNRCTB018.TI_DOC_OBB_PGIRO, CNRCTB018.TI_DOC_IMP, CNRCTB018.TI_DOC_IMP_RES,
                                             CNRCTB018.TI_DOC_ACC_RES, CNRCTB018.TI_DOC_ACC_PGIRO, CNRCTB018.TI_DOC_ACC_PGIRO_RES,
                                             CNRCTB018.TI_DOC_ACC_SIST, CNRCTB018.TI_DOC_ACC) Then
         aSaldocdrlinea.IM_MANDATI_REVERSALI_PRO := aListaScad.IM_VOCE;
    Elsif aListaScad.CD_TIPO_DOCUMENTO_CONT = CNRCTB018.TI_DOC_OBB_RES_IMPRO Then
         aSaldocdrlinea.IM_MANDATI_REVERSALI_IMP := aListaScad.IM_VOCE;
    End If;

    aSaldoCdrLinea.UTUV := aUser;

    CNRCTB054.crea_aggiorna_saldi(aSaldoCdrLinea, '037.modificaRevProvvPgiro', 'N');
   End;
   End Loop;
  end;

 Procedure generaRevProvvPgiro(aRev IN OUT reversale%rowtype, aRevRiga IN OUT reversale_riga%rowtype, aTSNow date, aUser varchar2) is
   aReversaleTerzo reversale_terzo%rowtype;
   sCodiceTerzo number(8);
   aTipoBolloE tipo_bollo%rowtype;
   aAcc accertamento%rowtype;
   tesoreria_unica char(1):='N';
  begin
    begin
        select * into aTipoBolloE from tipo_bollo where
            ti_entrata_spesa in ('*',CNRCTB001.GESTIONE_ENTRATE)
      and fl_cancellato='N'
      and fl_default='Y';
    exception when NO_DATA_FOUND then
        IBMERR001.RAISE_ERR_GENERICO('Tipo bollo di default non trovato');
    end;

    begin
       select fl_tesoreria_unica into tesoreria_unica from parametri_cnr
       where
            esercizio =aRev.esercizio;

    exception when NO_DATA_FOUND then
       IBMERR001.RAISE_ERR_GENERICO('Configurazione gestione tesoreria mancante');
    end;
    if aRev.cd_tipo_documento_cont is null or aRev.cd_tipo_documento_cont <> CNRCTB018.TI_DOC_REV_PROVV then
     IBMERR001.RAISE_ERR_GENERICO('Il tipo di reversale non é specificato o non é il tipo provvisorio');
    end if;
    if(tesoreria_unica='N') then
           aRev.pg_reversale   := CNRCTB018.getNextNumDocCont(aRev.cd_tipo_documento_cont, aRev.esercizio, aRev.cd_cds, aRev.utcr);
       else
           aRev.pg_reversale   := CNRCTB018.getNextNumDocCont(aRev.cd_tipo_documento_cont, aRev.esercizio, cnrctb020.getCDCDSENTE(aRev.esercizio), aRev.utcr);
       end if;

    -- controllo se il l'accertamento specificata sulle righe ? su partita di giro ed eventualemente aggiorno la riga della reversale di conseguenza
    begin
     select * into aAcc from accertamento where
           cd_cds = aRevRiga.cd_cds
       and esercizio = aRevRiga.esercizio_accertamento
       and esercizio_originale = aRevRiga.esercizio_ori_accertamento
       and pg_accertamento = aRevRiga.pg_accertamento
       and fl_pgiro = 'Y'
   for update nowait;
    exception when NO_DATA_FOUND then
     IBMERR001.RAISE_ERR_GENERICO('Accertamento su partita di giro a cui collegare la riga di reversale non trovato');
    end;
  -- Impostazione dello STATO_COGE - se non impostato viene messo a X
  if aRev.STATO_COGE is null then
   aRev.STATO_COGE := CNRCTB100.STATO_COEP_EXC;
  end if;
  -- Troncamento della data di registrazione
  aRev.dt_emissione:=trunc(aRev.dt_emissione);
  -- Impostazione di UTUV DUVA e PG_VER_REC per la testata della reversale
    aRev.UTUV := aRev.UTCR;
    aRev.DUVA := aRev.DUVA;
    aRev.PG_VER_REC := 1;
  -- Inserimento della testata della reversale
    cnrctb038.ins_REVERSALE(aRev);
    aRevRiga.pg_reversale:= aRev.pg_reversale;
  -- Impostazione di UTUV DUVA e PG_VER_REC
  aRevRiga.UTUV:= aRevRiga.UTCR;
  aRevRiga.DUVA:= aRevRiga.DACR;
  aRevRiga.PG_VER_REC:= 1;
    -- Inserimento riga
  cnrctb038.ins_REVERSALE_RIGA(aRevRiga);

        -- 23.05.2007 Stanislao Fusco
        -- Inserita procedura che pu? inserire la riga automatica SIOPE
        Inserisci_SIOPE_automatico (aRevRiga);

  sCodiceTerzo := aRevRiga.CD_TERZO;
    updScadAccertamento(aRev);
--DBMS_Output.PUT_LINE ('R 4');
    updSaldoCapitoliR(aRev,'I','A');
    aReversaleTerzo.CD_CDS := aRev.CD_CDS;
    aReversaleTerzo.CD_TERZO := sCodiceTerzo;
    aReversaleTerzo.CD_TIPO_BOLLO := aTipoBolloE.cd_tipo_bollo;
    aReversaleTerzo.DACR := aRev.DACR;
    aReversaleTerzo.DUVA := aRev.DUVA;
    aReversaleTerzo.ESERCIZIO := aRev.ESERCIZIO;
    aReversaleTerzo.PG_REVERSALE := aRev.PG_REVERSALE;
    aReversaleTerzo.PG_VER_REC := 1;
    aReversaleTerzo.UTCR := aRev.UTCR;
    aReversaleTerzo.UTUV := aRev.UTUV;
    cnrctb038.ins_REVERSALE_TERZO(aReversaleTerzo);
  end;


Procedure Inserisci_SIOPE_automatico (aNewManRiga In mandato_riga%Rowtype) Is
   aEV                  elemento_voce%Rowtype;
   aAnagrafico          anagrafico%Rowtype;
   aCD_SIOPE            codici_siope.cd_SIOPE%Type;
   aMandato_SIOPE       mandato_siope%rowtype;
   aRecLiqIVA           LIQUIDAZIONE_IVA%Rowtype;
   aRecManAccreditamento  MANDATO%Rowtype;
   MY_CHIAVE_SECONDARIA CONFIGURAZIONE_CNR.CD_CHIAVE_SECONDARIA%Type;
   aObb                 obbligazione%Rowtype;

Begin -- DELLA PROCEDURA

-- recupero tutta l'obbligazione della riga del mandato (SERVE DOPO IN DIVERSI PUNTI)

    Select * Into aObb
    From  obbligazione
    Where cd_cds              = aNewManRiga.cd_cds And
          esercizio           = aNewManRiga.ESERCIZIO_OBBLIGAZIONE And
          esercizio_originale = aNewManRiga.ESERCIZIO_ORI_OBBLIGAZIONE And
          pg_obbligazione     = aNewManRiga.PG_OBBLIGAZIONE;

-- ============================================================================================
--              SE SI TRATTA DI MANDATI DI ACCREDITAMENTO I CODICI SONO FISSI (CONF_CNR)
-- ============================================================================================

Begin
  Select *
  Into  aRecManAccreditamento
  From  Mandato
  Where CD_CDS = aNewManRiga.CD_CDS And
        ESERCIZIO = aNewManRiga.ESERCIZIO And
        PG_MANDATO = aNewManRiga.PG_MANDATO And
        TI_MANDATO = CNRCTB038.TI_MAN_ACCRED;

  MY_CHIAVE_SECONDARIA := 'MANDATO_ACCREDITAMENTO';
  aCD_SIOPE := CNRCTB015.getVal01PerChiave(aNewManRiga.esercizio, 'CODICE_SIOPE_DEFAULT', MY_CHIAVE_SECONDARIA);

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('MANDATO '||aNewManRiga.CD_CDS||' '||aNewManRiga.ESERCIZIO||' '||aNewManRiga.PG_MANDATO||' '||
                      ' Riga '||aNewManRiga.DS_MANDATO_RIGA||' - ACCREDITAMENTO - CODICE SIOPE FISSO '||aCD_SIOPE);
End If;

Exception
  When No_Data_Found Then aCD_SIOPE := Null;
End;

-- ======================================================================================================
--  SE SI TRATTA DI MANDATI DI LIQUIDAZIONE IVA COMMERCIALE/ISTITUZIONALE I CODICI SONO FISSI (CONF_CNR)
-- ======================================================================================================

If aCD_SIOPE Is Null Then

 Begin
    -- Cerco il doc. amm. della riga di mandato su LIQUIDAZIONE_IVA

    Select  *
    Into    aRecLiqIVA
    From    LIQUIDAZIONE_IVA
    Where   CD_TIPO_DOCUMENTO = aNewManRiga.CD_TIPO_DOCUMENTO_AMM And
            CD_CDS_DOC_AMM    = aNewManRiga.CD_CDS_DOC_AMM        And
            CD_UO_DOC_AMM     = aNewManRiga.CD_UO_DOC_AMM         And
            ESERCIZIO_DOC_AMM = aNewManRiga.ESERCIZIO_DOC_AMM     And
            PG_DOC_AMM        = aNewManRiga.PG_DOC_AMM            And
            STATO             = 'D';

    If aRecLiqIVA.CD_CDS = CNRCTB020.GETCDCDSENTE (aNewManRiga.esercizio) Then
       If aRecLiqIVA.TIPO_LIQUIDAZIONE = 'C' Then
            MY_CHIAVE_SECONDARIA := 'MANDATI_SAC_IVA_COMMERCIALE';
       Elsif aRecLiqIVA.TIPO_LIQUIDAZIONE In ('I', 'S', 'X') Then
            MY_CHIAVE_SECONDARIA := 'MANDATI_SAC_IVA_ISTITUZIONALE';
       Elsif aRecLiqIVA.TIPO_LIQUIDAZIONE In ('P') Then
            MY_CHIAVE_SECONDARIA := 'MANDATI_SAC_IVA_SPLIT';
       End If;
    Else
       If aRecLiqIVA.TIPO_LIQUIDAZIONE = 'C' Then
            MY_CHIAVE_SECONDARIA := 'MANDATI_ISTITUTI_IVA_COMMERCIALE';
       Elsif aRecLiqIVA.TIPO_LIQUIDAZIONE In ('I', 'S', 'X', 'P') Then
            MY_CHIAVE_SECONDARIA := 'MANDATI_ISTITUTI_IVA_ISTITUZIONALE';
       End If;
    End If;

    -- se c'? recupero il Codice SIOPE da Configuazione in base al tipo di Liquidazione

    aCD_SIOPE := CNRCTB015.getVal01PerChiave(aNewManRiga.esercizio, 'CODICE_SIOPE_DEFAULT', MY_CHIAVE_SECONDARIA);

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('MANDATO '||aNewManRiga.CD_CDS||' '||aNewManRiga.ESERCIZIO||' '||aNewManRiga.PG_MANDATO||' '||
                      ' Riga '||aNewManRiga.DS_MANDATO_RIGA||' - '||MY_CHIAVE_SECONDARIA||' - CODICE SIOPE FISSO '||aCD_SIOPE);
End If;

 Exception
   When No_Data_Found Then aCD_SIOPE := Null;
 End;

End If; -- SIOPE ANCORA NULL

-- ==========================================================================================================
--    SE SI TRATTA DI TRASFERIMENTI O VERSAMENTI DI RITENUTE RECUPERO IL CODICE SIOPE DAL CODICE TRIBUTO
-- ==========================================================================================================

If aCD_SIOPE Is Null Then

 Begin

--Dbms_Output.PUT_LINE ('TIPO OBB '||aObb.CD_TIPO_DOCUMENTO_CONT||' '||
                    --' OBB '||aObb.CD_CDS||' '||aObb.ESERCIZIO||' '||aObb.ESERCIZIO_ORIGINALE||' '||aObb.PG_OBBLIGAZIONE||
                    --' OBB ORIGINALE '||aObb.CD_CDS_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_ORI_RIPORTO||' '||aObb.PG_OBBLIGAZIONE_ORI_RIPORTO);

    If aObb.CD_TIPO_DOCUMENTO_CONT = cnrctb018.TI_DOC_OBB_PGIRO Then

    -- se ? una partita di giro di competenza cerco il codice siope associato al codice tributo
    -- che trovo su contributo ritenuta con la partita di giro di entrata collegata a quella di spesa
    -- del mandato di versamento

       Select ASS.CD_SIOPE_S
       Into   aCD_SIOPE
       From   ASS_TIPO_CONTR_RITENUTA_SIOPE ASS, CONTRIBUTO_RITENUTA CR, ASS_OBB_ACR_PGIRO ASSPGIRO
       Where  ASSPGIRO.CD_CDS                     = aObb.CD_CDS And
              ASSPGIRO.ESERCIZIO                  = aObb.ESERCIZIO And
              ASSPGIRO.ESERCIZIO_ORI_OBBLIGAZIONE = aObb.ESERCIZIO_ORIGINALE And
              ASSPGIRO.PG_OBBLIGAZIONE            = aObb.PG_OBBLIGAZIONE And
              CR.CD_CDS_ACCERTAMENTO              = ASSPGIRO.CD_CDS And
              CR.ESERCIZIO_ACCERTAMENTO           = ASSPGIRO.ESERCIZIO And
              CR.ESERCIZIO_ORI_ACCERTAMENTO       = ASSPGIRO.ESERCIZIO_ORI_ACCERTAMENTO And
              CR.PG_ACCERTAMENTO                  = ASSPGIRO.PG_ACCERTAMENTO And
              CR.CD_CONTRIBUTO_RITENUTA           = ASS.CD_CONTRIBUTO_RITENUTA And
              CR.DT_INI_VALIDITA                  = ASS.DT_INI_VALIDITA And
              ASS.ESERCIZIO                       = aNewManRiga.ESERCIZIO;

    Elsif aObb.CD_TIPO_DOCUMENTO_CONT = cnrctb018.TI_DOC_OBB_PGIRO_RES Then

    -- se ? una partita di giro residua cerco il codice siope associato al codice tributo
    -- che trovo su contributo ritenuta con la partita di giro di entrata collegata a quella di spesa
    -- (dell'anno precedente, cio? originale) del mandato di versamento

       Select ASS.CD_SIOPE_S
       Into   aCD_SIOPE
       From   ASS_TIPO_CONTR_RITENUTA_SIOPE ASS, CONTRIBUTO_RITENUTA CR, ASS_OBB_ACR_PGIRO ASSPGIRO
       Where  ASSPGIRO.CD_CDS                     = aObb.CD_CDS_ORI_RIPORTO And
              ASSPGIRO.ESERCIZIO                  = aObb.ESERCIZIO_ORI_RIPORTO And
              ASSPGIRO.ESERCIZIO_ORI_OBBLIGAZIONE = aObb.ESERCIZIO_ORI_ORI_RIPORTO And
              ASSPGIRO.PG_OBBLIGAZIONE            = aObb.PG_OBBLIGAZIONE_ORI_RIPORTO And
              CR.CD_CDS_ACCERTAMENTO              = ASSPGIRO.CD_CDS And
              CR.ESERCIZIO_ACCERTAMENTO           = ASSPGIRO.ESERCIZIO And
              CR.ESERCIZIO_ORI_ACCERTAMENTO       = ASSPGIRO.ESERCIZIO_ORI_ACCERTAMENTO And
              CR.PG_ACCERTAMENTO                  = ASSPGIRO.PG_ACCERTAMENTO And
              CR.CD_CONTRIBUTO_RITENUTA           = ASS.CD_CONTRIBUTO_RITENUTA And
              CR.DT_INI_VALIDITA                  = ASS.DT_INI_VALIDITA And
              ASS.ESERCIZIO                       = aNewManRiga.ESERCIZIO;

    End If;

If aCD_SIOPE Is Not Null Then
Dbms_Output.PUT_LINE ('MANDATO '||aNewManRiga.CD_CDS||' '||aNewManRiga.ESERCIZIO||' '||aNewManRiga.PG_MANDATO||' '||
                      ' Riga '||aNewManRiga.DS_MANDATO_RIGA||
--                    ' OBB '||aObb.CD_CDS||' '||aObb.ESERCIZIO||' '||aObb.ESERCIZIO_ORIGINALE||' '||aObb.PG_OBBLIGAZIONE||
--                    ' OBB ORIGINALE '||aObb.CD_CDS_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_ORI_RIPORTO||' '||aObb.PG_OBBLIGAZIONE_ORI_RIPORTO||
                      ' - VERSAMENTO RITENUTE - CODICE SIOPE FISSO '||Nvl(aCD_SIOPE, 'nullo'));
End If;

 Exception
    When No_Data_Found Then aCD_SIOPE := Null;
 End;

End If; -- SIOPE ANCORA NULL

-- ==========================================================================================================
--                              RECUPERO IL CODICE SIOPE DALL'ELEMENTO VOCE
-- ==========================================================================================================

If aCD_SIOPE Is Null Then

 Begin
       -- determino l'elemento voce dell'impegno

       Select EV.*
       Into   aEV
       From   elemento_voce EV
       Where  aObb.ESERCIZIO           = EV.ESERCIZIO       And
              aObb.TI_APPARTENENZA     = EV.TI_APPARTENENZA And
              aObb.TI_GESTIONE         = EV.TI_GESTIONE     And
              aObb.CD_ELEMENTO_VOCE    = EV.CD_ELEMENTO_VOCE;

       -- determino l'ANAGRAFICA del mandato per poter fare il controllo di congruit? della tipologia ISTAT

       Select anagrafico.*
       Into   aAnagrafico
       From   ANAGRAFICO, TERZO
       Where  aNewManRiga.cd_terzo = terzo.cd_terzo And
              terzo.cd_anag        = anagrafico.cd_anag;

       If aEv.FL_CHECK_TERZO_SIOPE = 'Y' Then

          Select CS.CD_SIOPE
          Into   aCD_SIOPE
          From   ASS_EV_SIOPE ASS, CODICI_SIOPE CS, ASS_TIPOLOGIA_ISTAT_SIOPE ASS_TIPO
          Where  ASS.ESERCIZIO               = aEV.ESERCIZIO        And
                 ASS.TI_APPARTENENZA         = aEV.TI_APPARTENENZA  And
                 ASS.TI_GESTIONE             = aEV.TI_GESTIONE      And
                 ASS.CD_ELEMENTO_VOCE        = aEV.CD_ELEMENTO_VOCE And
                 ASS.ESERCIZIO_SIOPE         = CS.ESERCIZIO         And
                 ASS.TI_GESTIONE_SIOPE       = CS.TI_GESTIONE       And
                 ASS.CD_SIOPE                = CS.CD_SIOPE          And
                 ASS_TIPO.ESERCIZIO_SIOPE    = CS.ESERCIZIO         And
                 ASS_TIPO.TI_GESTIONE_SIOPE  = CS.TI_GESTIONE       And
                 ASS_TIPO.CD_SIOPE           = CS.CD_SIOPE          And
                 ASS_TIPO.PG_TIPOLOGIA       = aAnagrafico.PG_TIPOLOGIA;

       Elsif aEv.FL_CHECK_TERZO_SIOPE = 'N' Then

          Select CD_SIOPE
          Into   aCD_SIOPE
          From   ASS_EV_SIOPE
          Where  ESERCIZIO        = aEV.ESERCIZIO And
                 TI_APPARTENENZA  = aEV.TI_APPARTENENZA And
                 TI_GESTIONE      = aEV.TI_GESTIONE And
                 CD_ELEMENTO_VOCE = aEV.CD_ELEMENTO_VOCE;
                  --And                  Rownum < 2; -- da togliere

       End If;

       Exception
         -- SE TROVO PIU' DI UN CODICE SIOPE DISPONIBILE (O NESSUNO) NON INSERISCO NULLA IN AUTOMATICO
         -- E SE LA PIANGE L'UTENTE

         When Too_Many_Rows Then aCD_SIOPE := Null;
         When No_Data_Found Then aCD_SIOPE := Null;
       End; -- END RICERCA SIOPE SU ELEMENTO_VOCE

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('MANDATO '||aNewManRiga.CD_CDS||' '||aNewManRiga.ESERCIZIO||' '||aNewManRiga.PG_MANDATO||' '||
                      ' Riga '||aNewManRiga.DS_MANDATO_RIGA||
                      ' - RECUPERO TRADIZIONALE DA ELEMENTO VOCE - CODICE SIOPE '||aCD_SIOPE);
End If;

End If; -- SIOPE ANCORA VUOTO


-- ===================================================================================================
-- ALLA FINE, DOPO AVER DETERMINATO IL CODICE SIOPE DEL CASO (E SOLO SE E' IN GRADO DI DETERMINARLO),
-- EFFETTUA L'INSERIMENTO VERO E PROPRIO
-- ===================================================================================================

If aCD_SIOPE Is Not Null Then
   aMandato_SIOPE.CD_CDS                      := aNewManRiga.CD_CDS;
   aMandato_SIOPE.ESERCIZIO                   := aNewManRiga.ESERCIZIO;
   aMandato_SIOPE.PG_MANDATO                  := aNewManRiga.PG_MANDATO;
   aMandato_SIOPE.ESERCIZIO_OBBLIGAZIONE      := aNewManRiga.ESERCIZIO_OBBLIGAZIONE;
   aMandato_SIOPE.ESERCIZIO_ORI_OBBLIGAZIONE  := aNewManRiga.ESERCIZIO_ORI_OBBLIGAZIONE;
   aMandato_SIOPE.PG_OBBLIGAZIONE             := aNewManRiga.PG_OBBLIGAZIONE;
   aMandato_SIOPE.PG_OBBLIGAZIONE_SCADENZARIO := aNewManRiga.PG_OBBLIGAZIONE_SCADENZARIO;
   aMandato_SIOPE.CD_CDS_DOC_AMM              := aNewManRiga.CD_CDS_DOC_AMM;
   aMandato_SIOPE.CD_UO_DOC_AMM               := aNewManRiga.CD_UO_DOC_AMM;
   aMandato_SIOPE.ESERCIZIO_DOC_AMM           := aNewManRiga.ESERCIZIO_DOC_AMM;
   aMandato_SIOPE.CD_TIPO_DOCUMENTO_AMM       := aNewManRiga.CD_TIPO_DOCUMENTO_AMM;
   aMandato_SIOPE.PG_DOC_AMM                  := aNewManRiga.PG_DOC_AMM;
   aMandato_SIOPE.ESERCIZIO_SIOPE             := aNewManRiga.ESERCIZIO;
   aMandato_SIOPE.TI_GESTIONE                 := CNRCTB001.GESTIONE_SPESE;
   aMandato_SIOPE.CD_SIOPE                    := aCD_SIOPE;
   aMandato_SIOPE.IMPORTO                     := aNewManRiga.IM_MANDATO_RIGA;
   aMandato_SIOPE.UTCR                        := aNewManRiga.UTCR;
   aMandato_SIOPE.DACR                        := aNewManRiga.DACR;
   aMandato_SIOPE.UTUV                        := aNewManRiga.UTUV;
   aMandato_SIOPE.DUVA                        := aNewManRiga.DUVA;
   aMandato_SIOPE.PG_VER_REC                  := aNewManRiga.PG_VER_REC;

   cnrctb038.ins_MANDATO_SIOPE(aMandato_SIOPE);

Else
  Dbms_Output.PUT_LINE ('MANDATO '||aNewManRiga.CD_CDS||' '||aNewManRiga.ESERCIZIO||' '||aNewManRiga.PG_MANDATO||' '||
                      ' Riga '||aNewManRiga.DS_MANDATO_RIGA||' NESSUN CODICE SIOPE RECUPERATO');
End If;

End; -- DELLA PROCEDURA


Procedure Inserisci_SIOPE_automatico (aNewRevRiga In reversale_riga%Rowtype) Is
   aEV                  Elemento_voce%Rowtype;
   aAnagrafico          Anagrafico%Rowtype;
   aCD_SIOPE            Codici_siope.cd_SIOPE%Type;
   aReversale_SIOPE     Reversale_siope%rowtype;
   aRecLiqIvaCentro     LIQUIDAZIONE_IVA_CENTRO%Rowtype;
   aRecRevTrasferimento REVERSALE%Rowtype;
   MY_CHIAVE_SECONDARIA CONFIGURAZIONE_CNR.CD_CHIAVE_SECONDARIA%Type;
   aAcc                 accertamento%Rowtype;

Begin -- DELLA PROCEDURA

-- recupero tutto l'accertamento della riga della reversale (SERVE DOPO IN DIVERSI PUNTI)

    Select * Into aAcc
    From  accertamento
    Where cd_cds              = aNewRevRiga.CD_CDS And
          esercizio           = aNewRevRiga.ESERCIZIO_ACCERTAMENTO And
          esercizio_originale = aNewRevRiga.ESERCIZIO_ORI_ACCERTAMENTO And
          pg_accertamento     = aNewRevRiga.PG_ACCERTAMENTO;

-- ============================================================================================
--              SE SI TRATTA DI REVERSALE DI TRASFERIMENTO I CODICI SONO FISSI (CONF_CNR)
-- ============================================================================================

Begin
  Select *
  Into aRecRevTrasferimento
  From Reversale
  Where CD_CDS = aNewRevRiga.CD_CDS
  And   ESERCIZIO = aNewRevRiga.ESERCIZIO
  And   PG_REVERSALE = aNewRevRiga.PG_REVERSALE
  And   TI_REVERSALE = 'A';

  MY_CHIAVE_SECONDARIA := 'REVERSALE_TRASFERIMENTO';
  aCD_SIOPE := CNRCTB015.getVal01PerChiave(aNewRevRiga.esercizio, 'CODICE_SIOPE_DEFAULT', MY_CHIAVE_SECONDARIA);

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('REVERSALE '||aNewRevRiga.CD_CDS||' '||aNewRevRiga.ESERCIZIO||' '||aNewRevRiga.PG_REVERSALE
                        ||' '||' DESCR '||aNewRevRiga.DS_REVERSALE_RIGA||
                        ' REVERSALE_TRASFERIMENTO - CODICE SIOPE '||aCD_SIOPE);
End If;


Exception
  When No_Data_Found Then aCD_SIOPE := Null;
End;

-- ======================================================================================================
--  SE SI TRATTA DI REVERSALI DI LIQUIDAZIONE IVA COMMERCIALE/ISTITUZIONALE I CODICI SONO FISSI (CONF_CNR)
-- ======================================================================================================

If aCD_SIOPE Is Null Then

  Begin -- DEL RECUPERO DEL CODICE SIOPE

  Select  *
  Into    aRecLiqIvaCentro
  From    LIQUIDAZIONE_IVA_CENTRO
  Where   CD_CDS_OBB_ACCENTR        = aNewRevRiga.CD_CDS And
          ESERCIZIO_OBB_ACCENTR     = aNewRevRiga.ESERCIZIO_ACCERTAMENTO And
          PG_OBB_ACCENTR            = aNewRevRiga.PG_ACCERTAMENTO And
          ESERCIZIO_ORI_OBB_ACCENTR = aNewRevRiga.ESERCIZIO_ORI_ACCERTAMENTO And
          STATO             = 'C';

  If aRecLiqIvaCentro.TIPO_LIQUIDAZIONE = 'C' Then
          MY_CHIAVE_SECONDARIA := 'REVERSALI_SAC_IVA_COMMERCIALE';
  Elsif aRecLiqIvaCentro.TIPO_LIQUIDAZIONE In ('I', 'S' ,'X', 'P') Then
          MY_CHIAVE_SECONDARIA := 'REVERSALI_SAC_IVA_ISTITUZIONALE';
  End If;

  aCD_SIOPE := CNRCTB015.getVal01PerChiave(aNewRevRiga.esercizio, 'CODICE_SIOPE_DEFAULT', MY_CHIAVE_SECONDARIA);

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('REVERSALE '||aNewRevRiga.CD_CDS||' '||aNewRevRiga.ESERCIZIO||' '||aNewRevRiga.PG_REVERSALE
                        ||' '||' DESCR '||aNewRevRiga.DS_REVERSALE_RIGA||MY_CHIAVE_SECONDARIA||
                        ' CODICE SIOPE '||aCD_SIOPE);
End If;


  Exception
    When No_Data_Found Then aCD_SIOPE := Null;
  End;

End If; -- SIOPE ANCORA NULL

-- ==========================================================================================================
--    SE SI TRATTA DI REVERSALI PER L'INCASSO DI TRASFERIMENTI DI RITENUTE RECUPERO IL CODICE SIOPE
--    DAL CODICE TRIBUTO
-- ==========================================================================================================

If aCD_SIOPE Is Null Then

 Begin

--Dbms_Output.PUT_LINE ('TIPO OBB '||aObb.CD_TIPO_DOCUMENTO_CONT||' '||
                    --' OBB '||aObb.CD_CDS||' '||aObb.ESERCIZIO||' '||aObb.ESERCIZIO_ORIGINALE||' '||aObb.PG_OBBLIGAZIONE||
                    --' OBB ORIGINALE '||aObb.CD_CDS_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_ORI_RIPORTO||' '||aObb.PG_OBBLIGAZIONE_ORI_RIPORTO);

    If aAcc.CD_TIPO_DOCUMENTO_CONT = cnrctb018.TI_DOC_ACC_PGIRO Then

    -- se ? una partita di giro di entrata di competenza cerco il codice siope associato al codice tributo
    -- che trovo su contributo ritenuta con la partita di giro che sta sulla riga di reversale

       Select ASS.CD_SIOPE_E
       Into   aCD_SIOPE
       From   ASS_TIPO_CONTR_RITENUTA_SIOPE ASS, CONTRIBUTO_RITENUTA CR
       Where  CR.CD_CDS_ACCERTAMENTO              = aAcc.CD_CDS And
              CR.ESERCIZIO_ACCERTAMENTO           = aAcc.ESERCIZIO And
              CR.ESERCIZIO_ORI_ACCERTAMENTO       = aAcc.ESERCIZIO_ORIGINALE And
              CR.PG_ACCERTAMENTO                  = aAcc.PG_ACCERTAMENTO And
              CR.CD_CONTRIBUTO_RITENUTA           = ASS.CD_CONTRIBUTO_RITENUTA And
              CR.DT_INI_VALIDITA                  = ASS.DT_INI_VALIDITA And
              ASS.ESERCIZIO                       = aNewRevRiga.ESERCIZIO;

    Elsif aAcc.CD_TIPO_DOCUMENTO_CONT = cnrctb018.TI_DOC_ACC_PGIRO_RES Then

    -- se ? una partita di giro residua cerco il codice siope associato al codice tributo
    -- che trovo su contributo ritenuta con la partita di giro di entrata (dell'anno precedente,
    -- cio? originale) della reversale

       Select ASS.CD_SIOPE_E
       Into   aCD_SIOPE
       From   ASS_TIPO_CONTR_RITENUTA_SIOPE ASS, CONTRIBUTO_RITENUTA CR
       Where  CR.CD_CDS_ACCERTAMENTO              = aAcc.CD_CDS And
              CR.ESERCIZIO_ACCERTAMENTO           = aAcc.ESERCIZIO And
              CR.ESERCIZIO_ORI_ACCERTAMENTO       = aAcc.ESERCIZIO_ORIGINALE And
              CR.PG_ACCERTAMENTO                  = aAcc.PG_ACCERTAMENTO And
              CR.CD_CONTRIBUTO_RITENUTA           = ASS.CD_CONTRIBUTO_RITENUTA And
              CR.DT_INI_VALIDITA                  = ASS.DT_INI_VALIDITA And
              ASS.ESERCIZIO                       = aNewRevRiga.ESERCIZIO;

    End If;

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('REVERSALE '||aNewRevRiga.CD_CDS||' '||aNewRevRiga.ESERCIZIO||' '||aNewRevRiga.PG_REVERSALE
                        ||' '||' DESCR '||aNewRevRiga.DS_REVERSALE_RIGA||
                        ' RITENUTE CODICE SIOPE '||aCD_SIOPE);
End If;

/*If aCD_SIOPE Is Not Null Then
Dbms_Output.PUT_LINE ('MANDATO '||aNewManRiga.CD_CDS||' '||aNewManRiga.ESERCIZIO||' '||aNewManRiga.PG_MANDATO||' '||
                      ' Riga '||aNewManRiga.DS_MANDATO_RIGA||
--                    ' OBB '||aObb.CD_CDS||' '||aObb.ESERCIZIO||' '||aObb.ESERCIZIO_ORIGINALE||' '||aObb.PG_OBBLIGAZIONE||
--                    ' OBB ORIGINALE '||aObb.CD_CDS_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_RIPORTO||' '||aObb.ESERCIZIO_ORI_ORI_RIPORTO||' '||aObb.PG_OBBLIGAZIONE_ORI_RIPORTO||
                      ' - VERSAMENTO RITENUTE - CODICE SIOPE FISSO '||Nvl(aCD_SIOPE, 'nullo'));
End If;
*/
 Exception
    When No_Data_Found Then aCD_SIOPE := Null;
 End;

End If; -- SIOPE ANCORA NULL


-- ==========================================================================================================
--                              RECUPERO IL CODICE SIOPE DALL'ELEMENTO VOCE
-- ==========================================================================================================

If aCD_SIOPE Is Null Then

     Begin

     -- determino l'elemento voce dell'impegno

     Select EV.*
     Into   aEV
     From   elemento_voce EV, accertamento ACC
     Where  ACC.cd_cds              = aNewRevRiga.cd_cds And
            ACC.ESERCIZIO           = aNewRevRiga.ESERCIZIO_ACCERTAMENTO And
            ACC.ESERCIZIO_ORIGINALE = aNewRevRiga.ESERCIZIO_ORI_ACCERTAMENTO And
            ACC.PG_ACCERTAMENTO     = aNewRevRiga.PG_ACCERTAMENTO And
            ACC.ESERCIZIO           = EV.ESERCIZIO       And
            ACC.TI_APPARTENENZA     = EV.TI_APPARTENENZA And
            ACC.TI_GESTIONE         = EV.TI_GESTIONE     And
            ACC.CD_ELEMENTO_VOCE    = EV.CD_ELEMENTO_VOCE;

     -- determino l'ANAGRAFICA del mandato per poter fare il controllo di congruit? della tipologia ISTAT

     Select anagrafico.*
     Into   aAnagrafico
     From   ANAGRAFICO, TERZO
     Where  aNewRevRiga.cd_terzo = terzo.cd_terzo And
            terzo.cd_anag        = anagrafico.cd_anag;

     If aEv.FL_CHECK_TERZO_SIOPE = 'Y' Then

        Select CS.CD_SIOPE
        Into   aCD_SIOPE
        From   ASS_EV_SIOPE ASS, CODICI_SIOPE CS, ASS_TIPOLOGIA_ISTAT_SIOPE ASS_TIPO
        Where  ASS.ESERCIZIO               = aEV.ESERCIZIO        And
               ASS.TI_APPARTENENZA         = aEV.TI_APPARTENENZA  And
               ASS.TI_GESTIONE             = aEV.TI_GESTIONE      And
               ASS.CD_ELEMENTO_VOCE        = aEV.CD_ELEMENTO_VOCE And
               ASS.ESERCIZIO_SIOPE         = CS.ESERCIZIO         And
               ASS.TI_GESTIONE_SIOPE       = CS.TI_GESTIONE       And
               ASS.CD_SIOPE                = CS.CD_SIOPE          And
               ASS_TIPO.ESERCIZIO_SIOPE    = CS.ESERCIZIO         And
               ASS_TIPO.TI_GESTIONE_SIOPE  = CS.TI_GESTIONE       And
               ASS_TIPO.CD_SIOPE           = CS.CD_SIOPE          And
               ASS_TIPO.PG_TIPOLOGIA       = aAnagrafico.PG_TIPOLOGIA;

     Elsif aEv.FL_CHECK_TERZO_SIOPE = 'N' Then

        Select CD_SIOPE
        Into   aCD_SIOPE
        From   ASS_EV_SIOPE
        Where  ESERCIZIO        = aEV.ESERCIZIO And
               TI_APPARTENENZA  = aEV.TI_APPARTENENZA And
               TI_GESTIONE      = aEV.TI_GESTIONE And
               CD_ELEMENTO_VOCE = aEV.CD_ELEMENTO_VOCE;

     End If;

If aCD_SIOPE Is Not Null Then
  Dbms_Output.PUT_LINE ('REVERSALE '||aNewRevRiga.CD_CDS||' '||aNewRevRiga.ESERCIZIO||' '||aNewRevRiga.PG_REVERSALE
                        ||' '||' DESCR '||aNewRevRiga.DS_REVERSALE_RIGA||
                        ' RECUPERO TRADIZIONALE '||aCD_SIOPE);
End If;


     Exception
       -- SE TROVO PIU' DI UN CODICE SIOPE DISPONIBILE (O NESSUNO) NON INSERISCO NULLA IN AUTOMATICO
       -- E SE LA PIANGE L'UTENTE

       When Too_Many_Rows Then aCD_SIOPE := Null;
       When No_Data_Found Then aCD_SIOPE := Null;
     End; -- SIOPE DA ELEMENTO_VOCE

End If;   -- SIOPE ANCORA VUOTO

-- ===================================================================================================
-- ALLA FINE, DOPO AVER DETERMINATO IL CODICE SIOPE DEL CASO (E SOLO SE E' IN GRADO DI DETERMINARLO),
-- EFFETTUA L'INSERIMENTO VERO E PROPRIO
-- ===================================================================================================

If aCD_SIOPE Is Not Null Then

      aReversale_SIOPE.CD_CDS                      := aNewRevRiga.CD_CDS;
      aReversale_SIOPE.ESERCIZIO                   := aNewRevRiga.ESERCIZIO;
      aReversale_SIOPE.PG_REVERSALE                := aNewRevRiga.PG_REVERSALE;
      aReversale_SIOPE.ESERCIZIO_ACCERTAMENTO      := aNewRevRiga.ESERCIZIO_ACCERTAMENTO;
      aReversale_SIOPE.ESERCIZIO_ORI_ACCERTAMENTO  := aNewRevRiga.ESERCIZIO_ORI_ACCERTAMENTO;
      aReversale_SIOPE.PG_ACCERTAMENTO             := aNewRevRiga.PG_ACCERTAMENTO;
      aReversale_SIOPE.PG_ACCERTAMENTO_SCADENZARIO := aNewRevRiga.PG_ACCERTAMENTO_SCADENZARIO;
      aReversale_SIOPE.CD_CDS_DOC_AMM              := aNewRevRiga.CD_CDS_DOC_AMM;
      aReversale_SIOPE.CD_UO_DOC_AMM               := aNewRevRiga.CD_UO_DOC_AMM;
      aReversale_SIOPE.ESERCIZIO_DOC_AMM           := aNewRevRiga.ESERCIZIO_DOC_AMM;
      aReversale_SIOPE.CD_TIPO_DOCUMENTO_AMM       := aNewRevRiga.CD_TIPO_DOCUMENTO_AMM;
      aReversale_SIOPE.PG_DOC_AMM                  := aNewRevRiga.PG_DOC_AMM;
      aReversale_SIOPE.ESERCIZIO_SIOPE             := aNewRevRiga.ESERCIZIO;
      aReversale_SIOPE.TI_GESTIONE                 := CNRCTB001.GESTIONE_ENTRATE;
      aReversale_SIOPE.CD_SIOPE                    := aCD_SIOPE;
      aReversale_SIOPE.IMPORTO                     := aNewRevRiga.IM_REVERSALE_RIGA;
      aReversale_SIOPE.UTCR                        := aNewRevRiga.UTCR;
      aReversale_SIOPE.DACR                        := aNewRevRiga.DACR;
      aReversale_SIOPE.UTUV                        := aNewRevRiga.UTUV;
      aReversale_SIOPE.DUVA                        := aNewRevRiga.DUVA;
      aReversale_SIOPE.PG_VER_REC                  := aNewRevRiga.PG_VER_REC;

      cnrctb038.ins_REVERSALE_SIOPE(aReversale_SIOPE);

End If;

End; -- DELLA PROCEDURA

PROCEDURE verificaTracciabilitaPag
   (aEs    NUMBER,
    aDataEmis DATE,
    aCdModPag VARCHAR2,
    aCdTipoDocAmm VARCHAR2,
    aImMandatoNetto NUMBER) IS
   aIm01   number;
   aDt01   date;
   aDt02   date;
   var     varchar2(1);

Begin
   if aDataEmis is null or aCdModPag is null or aCdTipoDocAmm is null or aImMandatoNetto is null then
    IBMERR001.RAISE_ERR_GENERICO('Alcuni parametri per la verifica della tracciabilit? dei pagamenti non sono valorizzati');
   end if;

   aIm01:= cnrctb015.getIm01PerChiave(0, cPKCONFIG, cSKCONFIG);
   aDt01:= cnrctb015.getDt01PerChiave(0, cPKCONFIG, cSKCONFIG);
   aDt02:= cnrctb015.getDt02PerChiave(0, cPKCONFIG, cSKCONFIG);
   if aIm01 is null or aDt01 is null or aDt02 is null then
    IBMERR001.RAISE_ERR_GENERICO('Parametri per la tracciabilit? dei pagamenti non definiti in CONFIGURAZIONE_CNR per esercizio: '||(0)||', chiave primaria: '||cPKCONFIG||', chiave secondaria: '||cSKCONFIG);
   end if;
--PIPE.SEND_MESSAGE('aImMandatoNetto = '||aImMandatoNetto);
  if aDataEmis < aDt01 OR aDataEmis > aDt02 OR aImMandatoNetto <= aIm01 then
    return;
  end if;
--PIPE.SEND_MESSAGE('aCdTipoDocAmm = '||aCdTipoDocAmm);
--PIPE.SEND_MESSAGE('aCdModPag = '||aCdModPag);
     Begin
        select '1'
        into var
        from ass_doc_amm_rif_mod
        where cd_tipo_documento_amm = aCdTipoDocAmm
          and cd_modalita_pag = aCdModPag;
     Exception
        when no_data_found then
            IBMERR001.RAISE_ERR_GENERICO('Non é possibile procedere. Nel rispetto della tracciabilità dei pagamenti, per la tipologia di documento: '||aCdTipoDocAmm||', non é ammissibile la modalità di pagamento: '||aCdModPag);
     End;
End;

end;




© 2015 - 2024 Weber Informatics LLC | Privacy Policy