# NAME CBI::Wrapper - Handle the Italian CBI fixed length file format. # VERSION version 0.02 # SYNOPSIS Allow the handling of the Italian CBI fixed length file format. Core based on [https://github.com/eLBati/CBI](https://github.com/eLBati/CBI). This code is designed mainly to help writing "Ricevute bancarie (Ri.ba)" data to files. A typical usage is: use CBI::Wrapper; my $header = { ... }; my $disposals = [{ ... }]; my $cbi = new CBI::Wrapper({header => $header, disposals => $disposals}); $cbi->create_flow({flow_type => 'RICEVUTE_BANCARIE'}); $cbi->print('./outfile.cbi'); # DESCRIPTION `CBI::Wrapper` is a Perl module that allow the handling of the Italian CBI fixed length file format, mainly to write "Ricevute bancarie (Ri.ba)" data to files. Features include: - Creation of a flow from header and disposals data. - Write the desired data on cbi file. - Load a cbi file. **Note:** For now only the Ri.ba format is supported. # LINKS - [Original Python code](https://github.com/eLBati/CBI) - [Interbank Corporate Banking](https://www.cbi-org.eu/) # CONSTRUCTOR AND STARTUP ## new() Creates and returns a new CBI::Wrapper object. If the constructor is called without params, the content of header and disposals won't be defined and you won't be able to create a flow. You can: - Pass params to the constructor: my $cbi = new CBI::Wrapper ({header => $header, disposals => $disposals}); - Pass header and disposals as params to ["create\_RIBA()"](#create_riba) - Use the setters ["set\_header({...})"](#set_header) and ["set\_disposals(\[{...}\])"](#set_disposals) # SETTERS AND GETTERS ## set\_header($header) Load the header passed as param. This param is an hashref like this: my $header = { mittente => '*****', # SIA code sender ricevente => substr(IBAN_CREDITOR, 5, 5), # ABI code creditor data_creazione => 'YYYY-MM-DD', # Creation date nome_supporto => '*****', # Unique value campo_a_disposizione => '', # Can be empty # market place keys tipo_flusso => '', # qualificatore_flusso => '', # soggetto_veicolatore => '', # ABI code Gateway bank codice_divisa => 'E', # currency E = euro }; ## get\_header() Return the current header hashref. ## set\_disposals($disposals) Load the disposals passed as param. This param is an arrayref containing the disposals to insert in the flow. This hashref is like this: my $disposal = { # Record 14 data => 'YYYY-MM-DD', # due date importo => EEEE.CC, # amount in Euro with two decimal numbers cod_abi_banca_assuntrice => substr(IBAN_CREDITOR, 5, 5), cab_banca_assuntrice => substr(IBAN_CREDITOR, 10, 5), conto => substr(IBAN_CREDITOR, 15, 12), cod_abi_banca_domiciliataria => substr(IBAN_DEBTOR, 5, 5), cab_banca_domiciliataria => substr(IBAN_DEBTOR, 10, 5), cod_azienda => '*****', # Same as 'mittente' in header. cod_cliente_debitore => '', # Debtor code private to the creditor (optional) flag_tipo_debitore => '', # 'B' if the debtor is a bank. #Record 20 rag_soc_creditore => '*****', # Creditor company name indirizzo_creditore => '*****', # Creditor address cap_citta_creditore => '*****', # Creditor ZIP code and city rif_creditore => '*****', # Creditor other data #30 nome_debitore => '*****', # Debtor name or company name CF_debitore => '*****', # Debtor CF/PI #40 indirizzo_debitore => '*****', # Debtor address cap_debitore => '*****', # Debtor ZIP code comune_sigla_pv_debitore => '*****', # Debtor city and province abbreviation compl_indirizzo => '', #50 descrizione => '*****', # Disposal description PIVA_creditore => '*****', # Creditor PI #51 numero_ricevuta => $i++, # Disposal number in flow denom_creditore => substr($info_creditore->{ragione_sociale},0,20), # Creditor company name provincia_bollo => '', num_autorizzazione => '', data_autorizzazione => '', #70 indicatori_di_circuito => '', # circuit markers indicatore_richiesta_incasso => '114', # document type + flag outcome notification + flag print nofication chiavi_di_controllo => '', # control keys }; ## get\_disposals() Return the current disposals arrayref. ## set\_flow\_CBI($CBI\_flow) Set the current CBI::Wrapper::Flow object. ## get\_flow\_CBI() Get the current CBI::Wrapper::Flow object. ## append\_disposal($disposal) Append the [disposal hashref](#disposal_hashref) passed as param to the current disposals. # FLOW CREATION ## create\_flow() Create a new flow from the current header and disposals. If the current header or disposals are undefined, return 0. You can set a new current header and disposals calling this method with params like this: $cbi->create_flow({header => $header, disposals => $disposals, flow_type => $flow_type }); # PRINTING AND LOADING FILES ## print($filename) Prints the current CBI::Wrapper::Flow object to a file with the filename passed as param. The current CBI::Wrapper::Flow object is defined when - ["create\_flow()"](#create_flow) is called; - a CBI::Wrapper::Flow is passed with ["set\_flow\_CBI($CBI\_flow)"](#set_flow_cbi-cbi_flow); - a file is [loaded](#load-filename). ## load($filename) Load a file with the filename passed as param. This will set a new current CBI::Wrapper::Flow object with the file content. This will **NOT** set the current header and disposals. # OTHER CBI FLOWS You can configure other flows (es. MAV) editing CBI::Wrapper/RecordMapping.pm In that file every disposal config is like this: my $IB = [ {from => 1, to => 1, name => 'filler1', type => 'an', truncate => 'no'}, ]; where - from is the starting column - to is the ending column - type is the field data type (n = numeric, an = string) - truncate denotes if the string content will be truncated automatically (if length > field length) or if an error will be thrown. # ONLINE RESOURCES - Official documentation [https://www.cbi-org.eu/My-Menu/Servizio-CBI-Documentazione/Servizio-CBI-Documentazione-Standard](https://www.cbi-org.eu/My-Menu/Servizio-CBI-Documentazione/Servizio-CBI-Documentazione-Standard) (Registration required) # ACKNOWLEDGEMENTS Lorenzo Battistini - Author of the Python module from which this code is derived. # AUTHOR Samuele Bonino <samuele.bonino at resbinaria.com> # COPYRIGHT AND LICENSE Copyright (C) 2022 Res Binaria Di Paolo Capaldo () Original python code: Copyright (C) 2012 Agile Business Group sagl () Copyright (C) 2012 Domsense srl () Copyright (C) 2012 Associazione OpenERP Italia All Rights Reserved This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see .