Preparazione file per flussi Ri.Ba secondo il tracciato CBI

 

La ricevuta bancaria è uno dei metodi di pagamento previsti per regolare i rapporti tra cliente e fornitore.
Il funzionamento è molto semplice, viene prodotto e stampato un tagliando, promemoria della scadenza di un debito.
Alla scadenza viene addebitato il conto del debitore e accreditato il conto del creditore.
Il normale flusso delle operazioni è :

  • L'azienda creditrice prepara il flusso Ri.Ba e lo invia alla banca
  • La banca o l'azienda, a seconda degli accordi stampano ed inviano gli avvisi al cliente
  • Alla scadenza la banca a seconda degli accordi intrapresi prepara un flusso per l'azienda cliente dell'esito di ciascun pagamento

Nell'esempio ho predisposto solamente la creazione del file Ri.Ba da inviare alla banca

Secondo gli accordi presi da banche e aziende clienti per ciascuna tipologia di comunicazione è prevista una struttura particolare che ne descrive le particolarità.

Tutti i flussi sono definiti con righe (records) a lunghezza fissa di 120 caratteri, la prima riga è il record di header del flusso, sostanzialmente contiene Le informazioni generali relative al flusso.

HEADER

Campo Valore Descrizione
Tipo Record IB Valore fisso "IB" come qualificatore flusso Ri.Ba
Mittente Codice SIA Azienda Codice sia dell'azienda Mittente
Ricevente Codice ABI Banca Codice abi della banca incasso Ri.Ba

Come ultima riga del flusso è prevista la presenza di un record di coda che ha lo scopo sostanziale di "validare" gli elementi presenti nel flusso certificando che il flusso è completo.

FOOTER

Campo Descrizione
Tipo Record Valore fisso "EF" come qualificatore di fine flusso
Mittente Codice sia dell'azienda Mittente
Ricevente Codice abi della banca incasso Ri.Ba
Importi Sommatoria degli importi dei documenti Ri.Ba
Numero Righe Conteggio delle righe presenti nel flusso
Numero Ricevute Numero Ri.Ba

Per ogni Ricevuta Bancaria sono previsti 7 records

Tipo Record
14
20
30
40
50
51
70

Ciascuno di questi descrive una parte delle informazioni riguardo il rapporto di credito / debito, chi deve pagare quando e dove.

La descrizione completa del tracciato Ri.Ba Cbi è codificata insieme a tutte le altre convenzioni di flusso nel documento "CBI-RIB-001.doc" scaricabile all'indirizzo Associazione CBI - Standard Tecnici

Per l'interfacciamento con i dati delle Ri.Ba ho utilizzato due tabelle

Tabella Descrizione
TestataDisposizioni Definizione dei dati generali per ciascun flusso, la chiave principale è un numero progressivo che è ridondato nelle righe come prima parte della PK
RigheDisposizioni Dettaglio invio riba, una riga contiene una scadenza la pk è composta dal progressivo invio e da un numero progressivo di riga.
La PK garantisce anche l'ordinamento dei dati nell'estrazione

Tramite il wizard di Visual Studio 2005 ho generato il DataSet tipizzato e i TableAdapters che ho utilizzato nella mia applicazione.

La realizzazione ha comportato la scrittura di un progetto con i moduli principali

Modulo Descrizione
MainForm Form principale dell'applicazione
GeneraDatiRibaForm Form Interfaccia per la creazione dei dati di prova
GeneraFileRibaForm Form Interfaccia creazione file flusso
DatiCbi Classe helper per file flusso

La form principale (MainForm)  contiene

Campo Descrizione
ImageMenu ImageList contenente le icone necessarie al programma
LvMenu Listview che interfaccia mainform con le altre 2 form, nel campo "Tag" dei ListViewItem ho impostato il nome del form da caricare tramite doppio click sull'icona corrispondente
ApriFormByName Metodo che consente di aprire una form con il nome
lvMenu_DoubleClick Gestore dell'evento doppio click sulla listview

 

Evento ApriFormByName

private void ApriFormByName(string formName, string namespaceName)
{
   string fullName = namespaceName;
   try
   {
       if (namespaceName == null)
           fullName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
       if (!fullName.EndsWith("."))
           fullName += ".";
       fullName += formName;
       Type oFormType = Type.GetType(fullName, true, true);
       ((Form)oFormType.GetConstructor(System.Type.EmptyTypes).Invoke(null)).Show();

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message + " " + ex.StackTrace);
    }
}

Evento lvMenu_DoubleClick

private void lvMenu_DoubleClick(object sender, EventArgs e)

{
   string nomeForm = (string)lvMenu.SelectedItems[0].Tag;
            ApriFormByName(nomeForm, null);

}

 

Generazione Dati di Prova

Questa form contiene una normalissima creazione di TestataDisposizioni e RigheDisposizioni con dati "random", nota: i dati sono palesemente falsati proprio perchè non possano in alcun modo ricondurre a situazioni reali. Eventuali utilizzatori in condizioni reali dovranno provvedere in proprio a inserire i dati nel database.

private void CreaDatiRiba()
{
     int righe = 0;
     righe = CheckValore(righeTextBox);
     if (righe <= 0)
        return;
     testataTableAdapter.Fill(dsDati.TestataDisposizioni);
    
     int idTestata = dsDati.TestataDisposizioni.Rows.Count;

     if (idTestata > 0)
     {
        idTestata = (int)dsDati.TestataDisposizioni.Rows[idTestata - 1]["IdInvio"];
     }

     idTestata += 1;

     daticbiDataSet.TestataDisposizioniRow drTestata = (daticbiDataSet.TestataDisposizioniRow)dsDati.TestataDisposizioni.NewRow();
     drTestata.AbiAzienda = rnd.Next(1, 99999);
     drTestata.CabAzienda = rnd.Next(1, 99999);
     dsDati.TestataDisposizioni.Rows.Add(drTestata);
     for (int k = 0; k < righe; k++)
     {
         daticbiDataSet.RigheDisposizioniRow drRighe = (daticbiDataSet.RigheDisposizioniRow)dsDati.RigheDisposizioni.NewRow();     

          dsDati.RigheDisposizioni.Rows.Add(drRighe);
     }
     testataTableAdapter.Update(dsDati.TestataDisposizioni);
     righeTableAdapter.Update(dsDati.RigheDisposizioni);
     MessageBox.Show("Dati generati");

}

 Generazione File flusso Riba

Si tratta di una classe che contiene i campi:

Nome Descrizione
fileButton Sostituisce la label del campo "nome del file" con un clic si apre la finestra di dialogo "SaveFileDialog" che consente di scegliere il nome del file da generare
fileTextBox Gestisce il nome del file
invioComboBox In collegamento con la datatable TestateDisposizioni
generaButton Attiva la creazione del file Ri.Ba

 

Classe DatiCbiRiba

Si tratta di una classe costruita appositamente per fornire una interfaccia tra le tabelle TestataDisposizioni e RigheDisposizioni.
Le uniche cose degne di nota sono i metodi:

Nome Descrizione
RecordIB() Genera il testo del record header
RecordEF() Genera il testo del record footer
Record14() Genera il testo del record 14
Record20() Genera il testo del record 20
Record30() Genera il testo del record 30
Record40() Genera il testo del record 40
Record50() Genera il testo del record 50
Record51() Genera il testo del record 51
Record70() Genera il testo del record 70

 

Avvertenza:

Il flusso generato dal programma non ha mai avuto il "battesimo del fuoco", data la complessità sono convinto che ci siano alcuni (speriamo pochi) errori.
Ringrazio in anticipo se qualcuno farà questa prova e me ne comunicherà il risultato.

 

Riferimenti:

Esempio C#
Esempio VB.NET
Associazione CBI - Standard Tecnici
System.Text Namespace

Print | posted on sabato 19 gennaio 2008 18:00

Feedback

# Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Il blog di Luciano Bastianello at 19/01/2008 18:16
Gravatar

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Massimo at 13/09/2008 23:52
Gravatar Ciao,
mi domandavo se c'era anche un versione per il visual basic 6 della tua gestione delle riba.
grazie
Massimo RAlli
Maxralli@tiscali.it

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by ELENA at 04/02/2009 17:45
Gravatar CIAO
TI CHIEDO COME POSSO FARE IN MODO CHE INVECE DEI DATI DI PROVA MI COMPAIANO DATI REALI, MAGARI IMPORTATI DA UN FOGLIO EXCEL. HO PROVATO A MODIFICARE I REPORT PER FILE CBI DI BONIFICI. ORA NON SO PERò PIù COME MUOVERMI.
GRAZIE MILLE.
ELENA
elena.sassaro@libero.it

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luciano Bastianello at 04/02/2009 18:25
Gravatar Ho l'intenzione di pubblicare tutti i file cbi.
Ancora non so se e quando finirò, non ho tanto tempo da dedicare a questa cosa.
per quanto riguarda i dati, c'è una tabella, carica su questa i tuoi dati al posto di quella popolata automaticamente da me e da lì fai la tua estrazione.
Ti ricordo che il programma non ha mai avuto il battesimo del fuoco (e cioè lavorare in produzione con dei dati veri e con una vera banca).

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by SANDRA at 24/02/2009 17:08
Gravatar Per le ricevute bancarie è perfetto...ho provato ad inserire i dati sulla tabella....mi piacerebbe trovare il modo di fare anche i bonifici...se riesci a pubblicare i file oppure se mi dai una dritta per modificare il codice...

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luciano Bastianello at 24/02/2009 17:32
Gravatar Putroppo non ho tempo di fare un altro post, magari nel fine settimana ..
I record da creare sono in sequenza
Record 10
Record 16
Record 17
Record 20
Record 30
Record 40
Record 50/60
Record 70

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by SANDRA at 25/02/2009 13:17
Gravatar si ho provato a modificarli su DatiCbi.vb ma quando lancio TracciatiCbiVb.exe mi genera sempre i record della riba...probabilmente sbaglio qualcosa...l'applicazione devo lanciarla da TracciatiCbiVb\bin\Release? scusami ma mi piacerebbe riuscire a capirci qualcosa

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by emanuele at 09/03/2009 20:42
Gravatar avete disponibile qualche applicazione semplice x generare un file distinta bonifici estero secondo tracciato cbi? grazie, buona serata.

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Maurizio at 01/04/2009 21:20
Gravatar Ciao, articolo molto interessante, complimenti.
Mi permetto di segnalarti che la versione c# non è scaricabile..
Maurizio

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luigi at 18/05/2009 22:10
Gravatar Ciao, ho testato il progetto c# tutto ok.
Ho modificato la procedura di generazione dati per interagire con una base dati MSSQL esistente, nessuna modifica sostanziale alla procedura di generazione del file. Complimeti

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Angelo at 15/06/2009 20:43
Gravatar Qualcuno sa se i record per i flussi RID sono gli stessi di quelli delle Ri.Ba. (in particolare mi rivolgo all'autore che ha faticato per fare questa utile libreria).

grazie

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luciano Bastianello at 15/06/2009 20:50
Gravatar No, i record per i flussi RID sono diversi

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Paolo at 12/11/2009 13:57
Gravatar Complimenti per l'articolo.
Ho solo una domanda relativa a VB 2008 Express, nei settings per la daticbiConnectionString ho queste impostazioni:

Value:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\daticbi.mdb;Persist Security Info=True
Scope:Application

Per fare girare l'applicazione ho impostato le prorità del database su COPY IF NEWER quindi nella bin\debug è comparso il datasource e tutto è andato ok

ma in una situazione normale la mia |dataDirectory| portrebbe essere diversa dal path dell'eseguibile in questo caso come potevo cambiare il valore della daticbiConnectionString a run time?

Ciao Paolo.

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luca at 04/12/2009 21:12
Gravatar ciao a tutti , volevo chiedere una cosa inquanto non mi è molto chiara, questo programmino mi permette di caricare dati da un database già esistente??? oppure me lo devo creare??? poi genera un file di testo in cui ci sono tutte le ri.ba del mese per tutti i clienti??? in attesa vi ringrazio

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luciano Bastianello at 05/12/2009 09:47
Gravatar Il programma prevede anche una struttura d tabelle e un database di access.
Per arrivare ad alimentare il file riba puoi utilizzare il programma e impostare i dati nel dataase oppure riscrivere il programma perchè si connetta con i tuoi dati.

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Christian at 15/02/2010 16:56
Gravatar Buongiorno Luciano,

volevo gentilmente chiederti se hai approntato una versione anche per il tracciato record dei bonifici...ci sto impazzando da un mese ma ancora non ne ho ricavato nulla...:(

Grazei mille

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luciano Bastianello at 15/02/2010 16:58
Gravatar Ci sto lavorando ma .. visto che è per diletto non so dire quando finirò

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Christian at 17/02/2010 14:03
Gravatar Senti, possiamo sentirci in privato? Vorrei proporti una cosa
mandami la tua e-mail

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Christian at 17/02/2010 14:31
Gravatar questa se vuoi è la mia mail
lenocchietto@hotmail.com

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Maurizio at 22/02/2010 23:12
Gravatar Ciao Luciano, ottimo articolo e lavoro, ho usato il tuo progetto modificandolo per una mia esigenza, tutto bene fino all'inserimento della TESTATA, ma appena inserisco le righe prendendo i dati da una listview non li cicla così inserisce gli stassi dati per tutte le righe

come faccio a ciclare con la listview da qui in poi?
For k As Integer = 0 To righe - 1
Dim drRighe As daticbiDataSet.RigheDisposizioniRow = _
DirectCast(dsDati.RigheDisposizioni.NewRow(), daticbiDataSet.RigheDisposizioniRow)
drRighe.AbiCliente = rnd.[Next](1, 99999)
drRighe.CabCliente = rnd.[Next](1, 99999)
drRighe.CapDebitore = rnd.[Next](1, 99999).ToString()
drRighe.ChiaveControllo = " "
drRighe.CodiceDebitore = rnd.[Next](10000, 99999).ToString()
drRighe.CodiceFiscaleDebitore = GetCodiceFiscale()
drRighe.DataDocumento = DateTime.Now.AddDays(rnd.[Next](10, 90))
drRighe.DataScadenza = drRighe.DataDocumento.AddDays(60)
drRighe.DescrizioneDebitore = String.Format("Ragione sociale {0}", drRighe.CodiceDebitore)
drRighe.IdDisposizione = idTestata
drRighe.IdRiga = k + 1
drRighe.Importo = CDec(rnd.NextDouble()) * rnd.[Next](1000, 10000)
drRighe.IndirizzoDebitore = String.Format("Via Del debitore {0}", rnd.[Next](1, 250))
drRighe.LocalitaDebitore = String.Format("Località debitore {0}", drRighe.CodiceDebitore)
drRighe.NumeroDocumento = rnd.[Next](500, 500000).ToString()
drRighe.NumeroRicevuta = k + 1
drRighe.RichiestaEsito = 0
drRighe.SiglaProvincia = "XX"
drRighe.StampaAvviso = 0
drRighe.TipoCodice = 4
drRighe.TipoDocDebitore = 0
dsDati.RigheDisposizioni.Rows.Add(drRighe)
Next
TestataTableAdapter.Update(dsDati.TestataDisposizioni)
RigheTableAdapter.Update(dsDati.RigheDisposizioni)
MessageBox.Show("Dati generati")


Grazie e ancora complimenti

Maurizio

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luciano Bastianello at 22/02/2010 23:45
Gravatar Quanto chiedi è una cosa elementare:
Listview contiene la collection listviewitems
Puoi iterare quindi con
for each it as listviewitem in mylistview.listviewitems
oppure con
for i as integer = 0 to mylistviewitem.listviewitems.count - 1

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by massimo at 25/05/2010 15:36
Gravatar buongiorno,
devo costruire il file ri.ba
la soluzione e' ok
mi servono i tracciati record dettagliati con tutti i campi
lunghezza e tipo
maxi-schermo@libero.it

# re: Preparazione file per flussi Ri.Ba secondo il tracciato CBI

Left by Luca Martini at 18/03/2011 16:58
Gravatar Ciao provato e mi sembra corretto .
Nel record 40 manca la provincia del debitore ..ora vado avanti con i test.

Your comment:





 
Please add 5 and 6 and type the answer here:

Copyright © Luciano Bastianello

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski