Aggiunto plugin Presentazioni bancarie in Scadenzario

This commit is contained in:
MatteoPistorello 2021-12-01 12:27:56 +01:00
parent 7815054a2e
commit 04409436ed
23 changed files with 2411 additions and 4 deletions

View File

@ -58,7 +58,9 @@
"symfony/translation": "^3.3",
"symfony/var-dumper": "^3.3",
"thenetworg/oauth2-azure": "^2.0",
"willdurand/geocoder": "^3.3"
"willdurand/geocoder": "^3.3",
"digitick/sepa-xml": "^1.6",
"wdog/sdd_ita": "dev-master"
},
"require-dev": {
"codeception/codeception": "^3.0",
@ -114,7 +116,8 @@
"Plugins\\ListinoClienti\\": ["plugins/listino_clienti/custom/src/", "plugins/listino_clienti/src/"],
"Plugins\\ListinoFornitori\\": ["plugins/listino_fornitori/custom/src/", "plugins/listino_fornitori/src/"],
"Plugins\\ComponentiImpianti\\": ["plugins/componenti/custom/src/", "plugins/componenti/src/"],
"Modules\\StatoEmail\\": ["modules/stato_email/custom/src/", "modules/stato_email/src/"]
"Modules\\StatoEmail\\": ["modules/stato_email/custom/src/", "modules/stato_email/src/"],
"Plugins\\PresentazioniBancarie\\": ["plugins/presentazioni_bancarie/custom/src/", "plugins/presentazioni_bancarie/src/"]
},
"files": [
"lib/functions.php",
@ -124,13 +127,19 @@
"lib/deprecated.php"
]
},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/wdog/sdd_ita"
}
],
"config": {
"sort-packages": true,
"optimize-autoloader": false,
"apcu-autoloader": true,
"prefer-stable": true,
"platform": {
"php": "5.6.4"
"php": "7.1"
}
}
}

View File

@ -0,0 +1,93 @@
<?php
use Carbon\Carbon;
use Plugins\PresentazioniBancarie\Gestore;
use Modules\Scadenzario\Scadenza;
include_once __DIR__.'/init.php';
switch (filter('op')) {
case 'generate':
$id_scadenze = filter('scadenze');
$sequenze = (array)filter('sequenze');
$codice_sequenza = [];
foreach($sequenze AS $sequenza){
$id_scadenza = explode('-', $sequenza)[0];
$codice = explode('-', $sequenza)[1];
$codice_sequenza[$id_scadenza] = $codice;
}
$data = new Carbon();
$azienda = Gestore::getAzienda();
// Individuazione delle scadenze indicate
$scadenze = Scadenza::with('documento')->whereIn('id', $id_scadenze)->get();
if ($scadenze->isEmpty()) {
echo json_encode([
'files' => [],
'scadenze' => [],
]);
}
// Iterazione tra le scadenze selezionate
$scadenze_completate = [];
$gestori_esportazione = [];
foreach ($scadenze as $key => $scadenza) {
$documento = $scadenza->documento;
if (empty($documento)) {
continue;
}
// Individuazione altre scadenze del documento
$scadenze_documento = $documento->scadenze->sortBy('scadenza');
$pos = $scadenze_documento->search(function ($item, $key) use ($scadenza) {
return $item->id == $scadenza->id;
});
// Generazione della descrizione del pagamento
$descrizione = $documento->getReference();
if ($scadenze_documento->count() > 1) {
$descrizione .= tr('_DOC_, pagamento _NUM_/_TOT_', [
'_DOC_' => $descrizione,
'_NUM_' => $pos + 1,
'_TOT_' => $scadenze_documento->count(),
]);
}
// Controllo sulla banca aziendale collegata alla scadenza
$banca_azienda = Gestore::getBancaAzienda($scadenza);
if (!isset($gestori_esportazione[$banca_azienda->id])) {
$gestori_esportazione[$banca_azienda->id] = new Gestore($azienda, $banca_azienda);
}
// Delegazione per la gestione
$completato = $gestori_esportazione[$banca_azienda->id]->aggiungi($scadenza, $scadenza->id, $descrizione, $codice_sequenza[$scadenza->id]);
// Salvataggio dell'esportazione
if ($completato) {
$scadenza->presentazioni_exported_at = $data;
$scadenza->save();
$scadenze_completate[] = $scadenza->id;
}
}
/**
* Salvataggio dei file nei diversi formati.
*/
$files = [];
foreach ($gestori_esportazione as $gestore) {
$files = array_merge($files, $gestore->esporta($plugin->upload_directory));
}
echo json_encode([
'files' => $files,
'scadenze' => $scadenze_completate,
]);
break;
}

View File

@ -0,0 +1,50 @@
<?php
include_once __DIR__.'/init.php';
if (!empty($records)) {
include $structure->filepath('generate.php');
return;
}
echo '
<div class="row">
<div class="col-md-3">
{[ "type": "checkbox", "label": "'.tr('Esporta già pagati').'", "name": "pagati", "help": "'.tr('Seleziona per esportare le scadenze già pagate tra quelle selezionate').'" ]}
</div>
<div class="col-md-3">
{[ "type": "checkbox", "label": "'.tr('Esporta già processati').'", "name": "processati", "help": "'.tr('Seleziona per esportare nuovamente le scadenze esportate in precedenze tra quelle selezionate').'" ]}
</div>
</div>
<div class="row">
<div class="col-md-12 text-right">
<button type="button" class="btn btn-warning" onclick="esporta(this)">
<i class="fa fa-download"></i> '.tr('Esporta').'
</button>
</div>
</div>
<script>
function getRecords() {
let table = $(".main-records[id^=main]").first();
let datatable = getTable("#" + table.attr("id"));
return datatable.getSelectedRows();
}
function esporta(button) {
let records = getRecords();
if (!records.length) {
swal("'.tr('Errore').'", "'.tr('Selezione assente!').'", "error");
return;
}
let pagati = input("pagati").get();
let processati = input("processati").get();
redirect("'.base_path().'/editor.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&records=" + records + "&pagati=" + pagati + "&processati=" + processati);
}
</script>';

View File

@ -0,0 +1,309 @@
<?php
use Plugins\PresentazioniBancarie\Gestore;
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
use Modules\Scadenzario\Scadenza;
include_once __DIR__.'/init.php';
echo '
<style>
.select2-selection__rendered {
line-height: 21px !important;
}
.select2-container .select2-selection--single {
height: 25px !important;
}
.select2-selection__arrow {
height: 24px !important;
position: absolute !important;
top: -1px !important;
}
</style>
<script>
$(document).ready(function () {
$("#pulsanti .pull-right").hide();
})
</script>
<p>'.tr('Riepilogo di esportazione per i pagamenti ai fornitori').'.</p>';
// Azienda predefinita
$azienda = Anagrafica::find(setting('Azienda predefinita'));
$banca_azienda = Gestore::getBancaPredefinitaAzienda();
if (empty($banca_azienda)) {
echo '
<div class="alert alert-warning">
<i class="fa fa-warning"></i>
'.tr("L'anagrafica Azienda non ha impostati i campi Codice IBAN e BIC per l'esecuzione dei pagamenti").'.
'.Modules::link('Anagrafiche', $azienda->id, tr('Imposta'), null, 'class="btn btn-warning pull-right"').'
<div class="clearfix"></div>
</div>';
}
$scadenze = Scadenza::with('documento')->whereIn('id', $records);
// Filtro per scadenze pagate
$esporta_pagati = get('pagati');
if (!$esporta_pagati) {
$scadenze = $scadenze->whereRaw('ABS(pagato) < ABS(da_pagare)');
}
// Filtro per scadenze esportate in precedenza
$esporta_processati = get('processati');
if (!$esporta_processati) {
$scadenze = $scadenze->whereNull('presentazioni_exported_at');
}
// Lettura delle informazioni
$scadenze = $scadenze->get();
$id_scadenze = $scadenze->pluck('id');
$raggruppamento = $scadenze->groupBy('documento.idanagrafica');
if ($raggruppamento->isEmpty()) {
echo '
<p>'.tr('Nessun pagamento disponibile secondo la selezione effettuata').'.</p>';
return;
}
foreach ($raggruppamento as $id_anagrafica => $scadenze_anagrafica) {
$anagrafica = $scadenze_anagrafica->first()->documento->anagrafica;
echo '
<h3>
'.$anagrafica->ragione_sociale;
$banca_controparte = Banca::where('id_anagrafica', $anagrafica->id)
->where('predefined', 1)
->first();
if (empty($banca_controparte)) {
echo '
</h3>
<p>'.tr('Banca predefinita non impostata').'.</p>';
continue;
}
echo '
</h3>
<table class="table table-condensed table-striped">
<thead>
<tr>
<th>'.tr('Causale').'</th>
<th class="text-center">'.tr('Data').'</th>
<th class="text-center">'.tr('Totale').'</th>
</tr>
</thead>
<tbody>';
$scadenze = $scadenze_anagrafica->sortBy('scadenza');
foreach ($scadenze as $scadenza) {
$totale = abs($scadenza->da_pagare) - abs($scadenza->pagato);
echo '
<tr>
<td>
<span>
'.$scadenza->descrizione.'
</span>';
$data_esportazione = $scadenza->presentazioni_exported_at;
if (!empty($data_esportazione)) {
echo '
<span class="badge pull-right">'.tr('Esportato in data: _DATE_', [
'_DATE_' => timestampFormat($data_esportazione),
]).'</span>';
}
$banca_controparte = Gestore::getBancaControparte($scadenza);
if ($database->tableExists('co_mandati_sepa')) {
$rs_mandato = $dbo->fetchArray('SELECT * FROM co_mandati_sepa WHERE id_banca = '.prepare($banca_controparte->id));
} else{
$rs_mandato = false;
}
$is_rid = in_array($scadenza->documento->pagamento['codice_modalita_pagamento_fe'],["MP09", "MP10", "MP11"]);
$is_riba = in_array($scadenza->documento->pagamento['codice_modalita_pagamento_fe'],["MP12"]);
$is_sepa = in_array($scadenza->documento->pagamento['codice_modalita_pagamento_fe'],["MP19", "MP20", "MP21"]);
$documento = $scadenza->documento;
$pagamento = $documento->pagamento;
if ($is_rid) {
if(!$rs_mandato){
echo '
<span class="label label-danger">'.tr('Id mandato mancante').'</span>';
}
if(!$banca_azienda->creditor_id){
echo '
<span class="label label-danger">'.tr('Id creditore mancante').'</span>';
}
} else if($is_riba && empty($banca_azienda->codice_sia)){
echo '
<span class="label label-danger">'.tr('Codice SIA banca emittente mancante').'</span>';
}
if ($is_sepa) {
//Prima, successiva, singola
$scadenze_antecedenti = $dbo->fetchArray("SELECT * FROM co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id INNER JOIN co_pagamenti ON co_documenti.idpagamento=co_pagamenti.id WHERE co_documenti.idanagrafica=".prepare($id_anagrafica)." AND codice_modalita_pagamento_fe IN('MP19','MP20','MP21') AND data_emissione<".prepare($scadenza->data_emissione));
$check_successiva = '';
$check_prima = '';
$check_singola = '';
if(sizeof($scadenze_antecedenti)>0){
$check_successiva = 'selected';
}else{
$check_prima = 'selected';
}
if (sizeof($rs_mandato)>0) {
if($rs_mandato[0]['singola_disposizione']=='1'){
$check_singola = 'selected';
$check_successiva = '';
$check_prima = '';
}
}
echo '
<span class="pull-right" style="margin-right:15px;">
<select class="sequenza" name="sequenza[]" data-idscadenza="'.$scadenza->id.'" style="width:300px;">
<option value="">- Seleziona una sequenza -</option>
<option value="FRST" '.$check_prima.'>Prima di una serie di disposizioni</option>
<option value="RCUR" '.$check_successiva.'>Successiva di una serie di disposizioni di incasso</option>
<option value="FNAL">Ultima di una serie di disposizioni</option>
<option value="OOFF" '.$check_singola.'>Singola diposizione non ripetuta</option>
</select>
</span>';
}
echo '
</td>
<td class="text-center">
'.dateFormat($scadenza->scadenza).'
</td>
<td class="text-right">
'.moneyFormat($totale).'
</td>
</tr>';
}
echo '
</tbody>
</table>';
}
echo '
<div class="row">
<div class="col-md-12 text-right">
<button type="button" class="btn btn-primary '.(!empty($banca_azienda) ? '' : 'disabled').'" onclick="esporta(this)">
<i class="fa fa-download"></i> '.tr('Esporta').'
</button>
</div>
</div>
<div class="row hidden" id="info">
<div class="col-md-12">
<p>'.tr('Le scadenze selezionate sono state esportate nei seguenti file').':</p>
<ul id="files"></ul>
</div>
<div class="col-md-12 text-right">
<button type="button" id="registrazione_contabile" class="btn btn-primary" onclick="registraPagamenti(this)">
<i class="fa fa-save"></i> '.tr('Registrazione contabile').'
</button>
</div>
</div>';
$modulo_prima_nota = Modules::get('Prima nota');
echo '
<script>
$(".sequenza").select2();
function esporta(button) {
let restore = buttonLoading(button);
//Creo un array con i valori di sequenza
var inputs = $(".sequenza");
var sequenze = new Array();
for(var i = 0; i < inputs.length; i++){
if($(inputs[i]).val()){
sequenze[i] = $(inputs[i]).data("idscadenza")+"-"+$(inputs[i]).val();
}
}
$.ajax({
url: globals.rootdir + "/actions.php",
cache: false,
type: "POST",
dataType: "json",
data: {
id_module: globals.id_module,
id_plugin: "'.$id_plugin.'",
scadenze: ['.implode(',', $id_scadenze->toArray()).'],
sequenze: sequenze,
op: "generate",
},
}).then(function(response) {
buttonRestore(button, restore);
if (response.scadenze.length) {
$(button).addClass("hidden");
$("#info").removeClass("hidden");
// Salvataggio delle scadenze esportate correttamente
$("#registrazione_contabile").data("scadenze", response.scadenze);
// Creazione dei link per il download dei file
let fileList = $("#files");
for(const file of response.files){
fileList.append(`<li>
<a href="` + file + `" target="_blank">` + file + `</a>
<button type="button" class="btn btn-xs btn-info" onclick="scaricaFile(\'` + file + `\')">
<i class="fa fa-download"></i>
</button>
</li>`)
}
} else {
swal({
title: "'.tr('Impossibile esportare le scadenze indicate!').'",
type: "error",
})
}
});
}
function scaricaFile(file) {
fetch(file)
.then(resp => resp.blob())
.then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement("a");
a.style.display = "none";
a.href = url;
// the filename you want
a.download = file.split("/").pop();
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
})
.catch(() => swal("'.tr('Errore').'", "'.tr('Errore durante il download').'", "error"));
}
function registraPagamenti(button) {
let scadenze = $(button).data("scadenze");
openModal("'.tr('Registrazione contabile pagamento').'", globals.rootdir + "/add.php?id_module='.$modulo_prima_nota['id'].'&id_records=" + scadenze.join(";"));
}
</script>';

View File

@ -0,0 +1,7 @@
<?php
include_once __DIR__.'/../../core.php';
$records = get('records', true);
$records = $records ? explode(',', $records) : [];
$record = $records[0] ?: null;

View File

@ -0,0 +1,416 @@
<?php
namespace Plugins\PresentazioniBancarie;
use Carbon\Carbon;
use DateTime;
use Plugins\PresentazioniBancarie\RiBa\Intestazione;
use Plugins\PresentazioniBancarie\RiBa\RiBa;
use Plugins\PresentazioniBancarie\RiBa\Ricevuta;
use Digitick\Sepa\PaymentInformation;
use Digitick\Sepa\TransferFile\Factory\TransferFileFacadeFactory;
use Exception;
use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
use Modules\Scadenzario\Scadenza;
use Sdd\DirectDebit as DirectDebitCBI;
use Sdd\DirectDebit\GroupHeader as HeaderCBI;
use Sdd\DirectDebit\Payment as PaymentCBI;
use Sdd\DirectDebit\PaymentInformation as PaymentInformationCBI;
class Gestore
{
/**
* @var Anagrafica|null
*/
protected static $azienda_predefinita;
/**
* @var Banca|null
*/
protected static $banca_predefinita_azienda;
protected $id_riba;
protected $id_debito_diretto;
protected $id_credito_diretto;
protected $riba;
protected $debito_diretto;
protected $credito_diretto;
protected $numero_transazioni_debito_diretto = 0;
protected $totale_debito_diretto = 0;
/**
* @var Anagrafica
*/
private $azienda;
/**
* @var Banca
*/
private $banca_azienda;
public function __construct(Anagrafica $azienda, Banca $banca_azienda)
{
$this->azienda = $azienda;
$this->banca_azienda = $banca_azienda;
$this->id_riba = random_string();
$this->initRiBa();
$this->id_credito_diretto = random_string();
$this->initCreditoDiretto();
$this->id_debito_diretto = random_string();
$this->initDebitoDiretto();
}
/**
* Inizializzazione del formato per il sistema RiBa.
*/
public function initRiBa()
{
$iban = $this->banca_azienda->iban;
$conto = substr($iban, 15, 12);
$abi_assuntrice = substr($iban, 5, 5);
$cab_assuntrice = substr($iban, 10, 5);
$data = new Carbon();
$supporto = $data->format('dmYHis');
// Generazione intestazione
$intestazione = new Intestazione();
$intestazione->codice_sia = $this->banca_azienda['codice_sia'];
$intestazione->conto = $conto;
$intestazione->abi = $abi_assuntrice;
$intestazione->cab = $cab_assuntrice;
$intestazione->data_creazione = $data->format('dmy');
$intestazione->nome_supporto = $supporto;
$intestazione->cap_citta_prov_creditore = strtoupper($this->azienda['cap'].' '.$this->azienda['citta'].' '.$this->azienda['provincia']);
$intestazione->ragione_soc1_creditore = strtoupper($this->azienda->ragione_sociale);
$intestazione->indirizzo_creditore = strtoupper($this->azienda['indirizzo']);
$intestazione->identificativo_creditore = !empty($this->azienda->partita_iva) ? $this->azienda->partita_iva : $this->azienda->codice_fiscale;
$this->riba = new RiBa($intestazione);
}
/**
* Inizializzazione del formato per il credito diretto.
*
* @source https://github.com/php-sepa-xml/php-sepa-xml/blob/master/doc/direct_credit.md
*/
public function initCreditoDiretto()
{
$this->credito_diretto = TransferFileFacadeFactory::createCustomerCredit($this->id_credito_diretto, $this->azienda->ragione_sociale);
}
/**
* Inizializzazione del formato per il debito diretto.
*
* @source https://github.com/php-sepa-xml/php-sepa-xml/blob/master/doc/direct_debit.md
*/
public function initDebitoDirettoSEPA()
{
$this->debito_diretto = TransferFileFacadeFactory::createDirectDebit($this->id_debito_diretto, $this->azienda->ragione_sociale);
}
/**
* Inizializzazione del formato per il debito diretto.
*
* @source https://github.com/wdog/sdd_ita/blob/master/tests/DirectDebitTest.php
*/
public function initDebitoDiretto()
{
$this->debito_diretto = new DirectDebitCBI();
}
public function aggiungi(Scadenza $scadenza, int $identifier, string $descrizione, string $codice_sequenza = null)
{
$documento = $scadenza->documento;
$controparte = $documento->anagrafica;
$banca_controparte = self::getBancaControparte($scadenza);
if (empty($banca_controparte)) {
return false;
}
$pagamento = $documento->pagamento;
$direzione = $documento->direzione;
$totale = (abs($scadenza->da_pagare) - abs($scadenza->pagato));
$is_credito_diretto = $direzione == 'uscita' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21']);
$is_debito_diretto = $direzione == 'entrata' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21']) && !empty($this->banca_azienda->creditor_id); // Mandato SEPA disponibile
$is_riba = $direzione == 'entrata' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP12']) && !empty($this->banca_azienda->codice_sia);
if(in_array($pagamento->codice_modalita_pagamento_fe, ['MP19', 'MP21'])){
$method = 'B2B';
}else if(in_array($pagamento->codice_modalita_pagamento_fe, ['MP20'])){
$method = 'CORE';
}
if ($is_credito_diretto) {
return $this->aggiungiCreditoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza);
} elseif ($is_debito_diretto) {
return $this->aggiungiDebitoDiretto($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza, $method, $codice_sequenza);
} elseif ($is_riba) {
$totale = $totale*100;
return $this->aggiungiRiBa($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza);
}
return false;
}
public function aggiungiRiBa(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, int $totale, DateTime $data_prevista)
{
$data_scadenza = $data_prevista->format('dmy');
// Dati banca cliente
$abi_cliente = substr($banca_controparte['iban'], 5, 5);
$cab_cliente = substr($banca_controparte['iban'], 10, 5);
$descrizione_banca = $banca_controparte['nome'].' '.$banca_controparte['filiale'];
// Aggiunta codice CIG CUP se presenti
if (!empty($controparte['cig'])) {
$descrizione .= ' CIG:'.$controparte['cig'];
}
if (!empty($controparte['cup'])) {
$descrizione .= ' CUP:'.$controparte['cup'];
}
// Salvataggio della singola ricevuta nel RiBa
$ricevuta = new Ricevuta();
$ricevuta->numero_ricevuta = $identifier;
$ricevuta->scadenza = $data_scadenza;
$ricevuta->importo = $totale;
$ricevuta->abi_banca = $abi_cliente;
$ricevuta->cab_banca = $cab_cliente;
$ricevuta->codice_cliente = $controparte['codice'];
//controlli sulla ragione sociale
$ragione_sociale = utf8_decode($controparte['ragione_sociale']);
// Sostituzione di alcuni simboli noti
$replaces = [
'&#039;' => "'",
'&quot;' => "'",
'&amp;' => '&',
];
$ragione_sociale = str_replace(array_keys($replaces), array_values($replaces), $ragione_sociale);
$ricevuta->nome_debitore = strtoupper($ragione_sociale);
$ricevuta->identificativo_debitore = !empty($controparte->partita_iva) ? $controparte->partita_iva : $controparte->codice_fiscale;
$ricevuta->indirizzo_debitore = strtoupper($controparte['indirizzo']);
$ricevuta->cap_debitore = $controparte['cap'];
$ricevuta->comune_debitore = strtoupper($controparte['citta']);
$ricevuta->provincia_debitore = $controparte['provincia'];
$ricevuta->descrizione_banca = $descrizione_banca;
$ricevuta->descrizione = strtoupper($descrizione);
$this->riba->addRicevuta($ricevuta);
return true;
}
public function aggiungiCreditoDiretto(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, $totale, DateTime $data_prevista)
{
$id = 'pagamento_'.$identifier;
// Esportazione del pagamento
$this->credito_diretto->addPaymentInfo($id, [
'id' => $identifier,
'dueDate' => $data_prevista->format('dmy'),
'debtorName' => $this->azienda->ragione_sociale,
'debtorAccountIBAN' => $this->banca_azienda->iban,
'debtorAgentBIC' => $this->banca_azienda->bic,
]);
$this->credito_diretto->addTransfer($id, [
'amount' => $totale,
'creditorIban' => $banca_controparte->iban,
'creditorBic' => $banca_controparte->bic,
'creditorName' => $controparte->ragione_sociale,
'remittanceInformation' => $descrizione,
]);
return true;
}
public function aggiungiDebitoDirettoSEPA(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, $totale, DateTime $data_prevista)
{
$id = 'pagamento_'.$identifier;
$this->debito_diretto->addPaymentInfo($id, [
'id' => $identifier,
'dueDate' => $data_prevista->format('Y-m-d'),
'creditorName' => $this->azienda->ragione_sociale,
'creditorAccountIBAN' => $this->banca_azienda->iban,
'creditorAgentBIC' => $this->banca_azienda->bic,
'seqType' => PaymentInformation::S_ONEOFF,
'creditorId' => $this->banca_azienda->creditor_id,
'localInstrumentCode' => 'CORE', // default. optional.
]);
// Add a Single Transaction to the named payment
$mandato = $this->getMandato($banca_controparte);
$this->debito_diretto->addTransfer($id, [
'amount' => $totale,
'debtorName' => $controparte->ragione_sociale,
'debtorIban' => $banca_controparte->iban,
'debtorBic' => $banca_controparte->bic,
'debtorMandate' => $mandato['id_mandato'],
'debtorMandateSignDate' => $mandato['data_firma_mandato'],
'remittanceInformation' => $descrizione,
]);
return true;
}
public function aggiungiDebitoDiretto(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, $totale, DateTime $data_prevista, $method, $codice_sequenza)
{
$paymentInformation = new PaymentInformationCBI();
$paymentInformation
->setCreditorName($this->azienda->ragione_sociale)
->setCreditorIBAN($this->banca_azienda->iban)
->setCreditorId($this->banca_azienda->creditor_id)
->setPaymentInformationIdentification($identifier)
->setRequestedExecutionDate($data_prevista->format('Y-m-d'))
->setLocalMethod($method)
->setServiceLevel('SEPA')
->setSeqType(($codice_sequenza!=''?$codice_sequenza:'RCUR'));
$mandato = $this->getMandato($banca_controparte);
$payment = new PaymentCBI();
$payment
->setInstrId($identifier)
->setAmount($totale)
->setEndToEndId($identifier.$this->numero_transazioni_debito_diretto)
->setDebtorIBAN($banca_controparte->iban)
->setDebtorName(htmlentities($controparte->ragione_sociale))
->setMndt($mandato['id_mandato'])
->setMndtDate($mandato['data_firma_mandato'])
->setRemittanceInformation($descrizione);
$paymentInformation->addPayments([$payment]);
$this->debito_diretto->addPaymentInformation($paymentInformation);
++$this->numero_transazioni_debito_diretto;
$this->totale_debito_diretto += $totale;
return true;
}
public static function getBancaControparte(Scadenza $scadenza): ?Banca
{
$documento = $scadenza->documento;
$anagrafica = $documento->anagrafica;
$banca_controparte = $documento->id_banca_controparte ? Banca::find($documento->id_banca_controparte) : null;
if (empty($banca_controparte)) {
$banca_controparte = Banca::where('id_anagrafica', $anagrafica->id)
->where('predefined', 1)
->first();
}
return $banca_controparte;
}
public static function getBancaAzienda(Scadenza $scadenza): Banca
{
$documento = $scadenza->documento;
return $documento->id_banca_azienda ? Banca::find($documento->id_banca_azienda) : self::getBancaPredefinitaAzienda();
}
public static function getBancaPredefinitaAzienda(): Banca
{
if (!isset(self::$banca_predefinita_azienda)) {
self::$banca_predefinita_azienda = Banca::where('id_anagrafica', self::getAzienda()->id)
->where('predefined', 1)
->first();
}
return self::$banca_predefinita_azienda;
}
public static function getAzienda(): Anagrafica
{
if (!isset(self::$azienda_predefinita)) {
self::$azienda_predefinita = Anagrafica::find(setting('Azienda predefinita'));
}
return self::$azienda_predefinita;
}
public function esporta(string $path): array
{
/**
* Salvataggio dei file nei diversi formati.
*/
$files = [];
// File per il pagamento delle vendite RiBa
try {
$content = $this->riba->asCBI();
// Generazione filename
$filename = $this->id_riba.'.txt';
$file = $path.'/'.$filename;
$files[] = base_url().'/'.$file;
// Salvataggio del file
file_put_contents(base_dir().'/'.$file, $content);
} catch (Exception $e) {
}
// File per il pagamento degli acquisti SEPA
try {
$xml = $this->credito_diretto->asXML();
// Generazione filename
$filename = $this->id_credito_diretto.'.xml';
$file = $path.'/'.$filename;
$files[] = base_url().'/'.$file;
// Salvataggio del file
file_put_contents(base_dir().'/'.$file, $xml);
} catch (Exception $e) {
}
// File per il pagamento delle vendite SEPA CBI
try {
$groupHeader = new HeaderCBI();
$groupHeader->setControlSum($this->totale_debito_diretto)
->setInitiatingPartyName($this->azienda->ragione_sociale)
->setOrgHeaderId('ABC') // Codice Unico CBI
->setOrgHeaderIssr('CBI')
->setMessageIdentification($this->id_debito_diretto)
->setNumberOfTransactions($this->numero_transazioni_debito_diretto);
$this->debito_diretto->setGroupHeader($groupHeader);
$xml = $this->debito_diretto->xml();
// Generazione filename
$filename = $this->id_debito_diretto.'.xml';
$file = $path.'/'.$filename;
$files[] = base_url().'/'.$file;
// Salvataggio del file
file_put_contents(base_dir().'/'.$file, $xml);
} catch (Exception $e) {
}
return $files;
}
protected function getMandato(Banca $banca)
{
if (database()->tableExists('co_mandati_sepa')) {
return database()->fetchOne('SELECT * FROM co_mandati_sepa WHERE id_banca = '.prepare($banca->id));
} else{
return [];
}
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa;
abstract class Elemento
{
protected $dati = [];
public function __get($name)
{
$method = $this->getCamelCase($name);
if (method_exists($this, 'get'.$method)) {
return $this->{'get'.$name}();
}
return $this->{$name};
}
public function __set($name, $value)
{
$method = $this->getCamelCase($name);
if (method_exists($this, 'set'.$method)) {
$this->{'set'.$name}($value);
} else {
$this->{$name} = $value;
}
}
/**
* @return array
*/
abstract public function toCbiFormat();
/**
* @param string $string
*
* @return string
*/
protected function getCamelCase($string)
{
$words = str_replace('_', ' ', $string);
$upper = ucwords($words);
$name = str_replace(' ', '', $upper);
return $name;
}
}

View File

@ -0,0 +1,101 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa;
/**
* Classe per gestire l'intestazione del RiBa.
*
* @property int $abi
* @property int $cab
* @property string $conto
* @property string $data_creazione
* @property string $nome_supporto
* @property string $codice_divisa
* @property string $ragione_soc1_creditore
* @property string $ragione_soc2_creditore
* @property string $indirizzo_creditore
* @property string $cap_citta_prov_creditore
* @property string $identificativo_creditore
* @property string $codice_sia
* @property bool $eol
*/
class Intestazione extends Elemento
{
/**
* Codice ABI della banca del creditore.
*
* @var int Valore numerico di 5 cifre
*/
protected $abi;
/**
* Codice CAB della banca del creditore.
*
* @var int Valore numerico di 5 cifre
*
* @property
*/
protected $cab;
/**
* @var string Valore alfanumerico di 12 cifre
*/
protected $conto;
/**
* @var string Valore numerico di 6 cifre in formato ggmmaa
*/
protected $data_creazione;
/**
* @var string Valore alfanumerico di 20 cifre
*/
protected $nome_supporto;
/**
* @var string Valore alfanumerico di 1 cifra, opzionale (default "E")
*/
protected $codice_divisa = 'E';
/**
* @var string Valore alfanumerico di 24 cifre
*/
protected $ragione_soc1_creditore;
/**
* @var string Valore alfanumerico di 24 cifre
*/
protected $ragione_soc2_creditore;
/**
* @var string Valore alfanumerico di 24 cifre
*/
protected $indirizzo_creditore;
/**
* @var string Valore alfanumerico di 24 cifre
*/
protected $cap_citta_prov_creditore;
/**
* @var string Valore alfanumerico di 16 cifre, opzionale (default "")
*/
protected $identificativo_creditore = '';
/**
* @var string Valore alfanumerico di 5 cifre
*/
protected $codice_sia;
/**
* @var bool true per aggiungere i caratteri di fine rigo
*/
protected $eol = true;
public function toCbiFormat()
{
return [
$this->abi,
$this->cab,
$this->conto,
$this->data_creazione,
$this->nome_supporto,
$this->codice_divisa,
$this->ragione_soc1_creditore,
$this->ragione_soc2_creditore,
$this->indirizzo_creditore,
$this->cap_citta_prov_creditore,
$this->identificativo_creditore,
$this->codice_sia,
$this->eol,
];
}
}

View File

@ -0,0 +1,151 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
abstract class BaseRecord implements RecordInterface
{
protected $dati = [];
/**
* Costruttore predefinito, che inizializza le informazioni interne al record in modo autonomo secondo la relativa struttura.
*/
public function __construct()
{
$struttura = static::getStruttura();
// Inizializzazione di tutti i campi
foreach ($struttura as $nome => $campo) {
$this->{$nome} = $campo['valore'] ?: '';
}
}
public function __get($name)
{
$method = $this->getCamelCase($name);
if (method_exists($this, 'get'.$method)) {
return $this->{'get'.$name}();
}
return $this->get($name);
}
public function __set($name, $value)
{
$method = $this->getCamelCase($name);
if (method_exists($this, 'set'.$method)) {
$this->{'set'.$name}($value);
} else {
$this->set($name, $value);
}
}
public function toCBI(): string
{
$contenuto = ' '.static::getCodice();
$struttura = static::getStruttura();
// Informazioni sui campi disponibili
$contenuti = [];
foreach ($struttura as $nome => $campo) {
$contenuti[$campo['inizio']] = $this->{$nome};
}
// Sort per indici
ksort($contenuti);
// Completamento dei filler
foreach ($contenuti as $inizio => $string) {
$dimensione_contenuto = strlen($contenuto) + 1;
if ($dimensione_contenuto != $inizio) {
$contenuto .= str_repeat(' ', $inizio - $dimensione_contenuto);
}
$contenuto .= $string;
}
// Filler finale per la riga
$contenuto .= str_repeat(' ', 120 - strlen($contenuto));
return $contenuto;
}
public function fromCBI(string $contenuto): void
{
$struttura = static::getStruttura();
// Informazioni sui campi disponibili
foreach ($struttura as $nome => $campo) {
$string = substr($contenuto, $campo['inizio'] - 1, $campo['dimensione']);
// Aggiunta del contenuto al record
$this->{$nome} = trim($string);
}
}
public function get(string $name): ?string
{
return isset($this->dati[$name]) ? $this->dati[$name] : null;
}
public function set(string $name, ?string $value): void
{
$struttura = static::getStruttura();
$record = $struttura[$name];
if (empty($record)) {
return;
}
// Pad automatico sulla base del tipo
if ($record['tipo'] == 'string') {
$value = $this->padString($value, $record['dimensione']);
} elseif ($record['tipo'] == 'numeric') {
$value = $this->padNumber($value, $record['dimensione']);
} elseif ($record['tipo'] == 'constant') {
$value = $record['valore'];
}
$this->dati[$name] = $value;
}
/**
* @return string
*/
protected function padString(?string $string, int $length)
{
// Sostituzione di alcuni simboli noti
$replaces = [
'&#039;' => "'",
'&quot;' => "'",
'&amp;' => '&',
];
$string = str_replace(array_keys($replaces), array_values($replaces), $string);
$string = substr($string, 0, $length);
return str_pad($string, $length);
}
/**
* @return string
*/
protected function padNumber(?string $string, int $length)
{
$string = substr($string, 0, $length);
return str_pad($string, $length, '0', STR_PAD_LEFT);
}
/**
* @return string
*/
protected function getCamelCase(string $string)
{
$words = str_replace('_', ' ', $string);
$upper = ucwords($words);
$name = str_replace(' ', '', $upper);
return $name;
}
}

View File

@ -0,0 +1,118 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 14 del formato CBI.
*
* @property string numero_progressivo Numero della disposizione all'interno del flusso. Inizia con 1 ed è progressivo di 1.
* @property string data_pagamento Data di scadenza, nel formato GGMMAA,
* @property string causale Assume valore fisso "30000".
* @property string importo Importo della ricevuta in centesimi di Euro.
* @property string segno assume valore fisso " - ".
* @property string abi_assuntrice Codice ABI della banca assuntrice delle ricevute; deve corrispondere a quello presente sul record di testa.
* @property string cab_assuntrice Codice CAB dello sportello della banca.
* @property string conto_assuntrice Conto corrente che il cliente chiede di
* @property string abi_domiciliataria Codice ABI della banca domiciliataria.
* @property string cab_domiciliataria Codice CAB dello sportello della banca.
* @property string codice_azienda_creditrice Codice SIA del cliente ordinante; tale codice, se presente, deve essere valorizzato su tutte le singole disposizioni contenute nel medesimo supporto logico, e deve contenere sempre il medesimo valore. Questo può essere diverso dal codice SIA dellazienda mittente indicato sul record di testa, e non necessariamente è censito tra i codici SIA riportati nelle tabelle di routing dei Centri Applicativi (cfr. par.3.6.4 sez. I).
* @property string tipo_codice_creditrice Assume il valore fisso "4".
* @property string codice_cliente_debitore Codice con il quale il debitore è conosciuto dal creditore.
* @property string flag_tipo_debitore Nel caso il debitore sia una Banca deve assumere il valore "B" (il codice ABI è indicato in pos. 70-74).
* @property string codice_divisa Questo campo deve coincidere con quello
omonimo del record di testa.
*/
class Record14 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'data_pagamento' => [
'inizio' => 23,
'dimensione' => 6,
'tipo' => 'string',
],
'causale' => [
'inizio' => 29,
'dimensione' => 5,
'tipo' => 'constant',
'valore' => '30000',
],
'importo' => [
'inizio' => 34,
'dimensione' => 13,
'tipo' => 'numeric',
],
'segno' => [
'inizio' => 47,
'dimensione' => 1,
'tipo' => 'constant',
'valore' => '-',
],
'abi_assuntrice' => [
'inizio' => 48,
'dimensione' => 5,
'tipo' => 'numeric',
],
'cab_assuntrice' => [
'inizio' => 53,
'dimensione' => 5,
'tipo' => 'numeric',
],
'conto_assuntrice' => [
'inizio' => 58,
'dimensione' => 12,
'tipo' => 'numeric',
],
'abi_domiciliataria' => [
'inizio' => 70,
'dimensione' => 5,
'tipo' => 'numeric',
],
'cab_domiciliataria' => [
'inizio' => 75,
'dimensione' => 5,
'tipo' => 'numeric',
],
'codice_azienda_creditrice' => [
'inizio' => 92,
'dimensione' => 5,
'tipo' => 'string',
],
'tipo_codice_creditrice' => [
'inizio' => 97,
'dimensione' => 1,
'tipo' => 'constant',
'valore' => '4',
],
'codice_cliente_debitore' => [
'inizio' => 98,
'dimensione' => 16,
'tipo' => 'string',
],
'flag_tipo_debitore' => [
'inizio' => 114,
'dimensione' => 1,
'tipo' => 'string',
],
'codice_divisa' => [
'inizio' => 120,
'dimensione' => 1,
'tipo' => 'constant',
'valore' => 'E',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '14';
}
}

View File

@ -0,0 +1,53 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 20 del formato CBI.
*
* @property string numero_progressivo Numero progressivo della ricevuta, uguale a quello indicato per il record 14 della disposizione.
* @property string descrizione_creditore_1 Descrizione del creditore (24 caratteri alfanumerici).
* @property string descrizione_creditore_2 Descrizione del creditore (24 caratteri alfanumerici).
* @property string descrizione_creditore_3 Descrizione del creditore (24 caratteri alfanumerici).
* @property string descrizione_creditore_4 Descrizione del creditore (24 caratteri alfanumerici).
*/
class Record20 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'descrizione_creditore_1' => [
'inizio' => 11,
'dimensione' => 24,
'tipo' => 'string',
],
'descrizione_creditore_2' => [
'inizio' => 35,
'dimensione' => 24,
'tipo' => 'string',
],
'descrizione_creditore_3' => [
'inizio' => 59,
'dimensione' => 24,
'tipo' => 'string',
],
'descrizione_creditore_4' => [
'inizio' => 83,
'dimensione' => 24,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '20';
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 30 del formato CBI.
*
* @property string numero_progressivo Numero progressivo della ricevuta, uguale a quello indicato per il record 14 della disposizione.
* @property string descrizione_debitore_1 Descrizione del debitore (30 caratteri alfanumerici).
* @property string descrizione_debitore_2 Descrizione del debitore (30 caratteri alfanumerici).
* @property string codice_fiscale_debitore Codice fiscale del cliente debitore; il controllo è di validità; pertanto va verificata la presenza del CIN e la sua correttezza. Il campo non è sottoposto ad alcun controllo di presenza formale sulla validità nel caso in cui il codice ABI della Banca domiciliataria (pos. 70-74, rec. 14) sia uno dei seguenti: 03034 03145 03171 - 03178 - 03195 03225 - 03530 06067 08540 - 3262 1.
*/
class Record30 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'descrizione_debitore_1' => [
'inizio' => 11,
'dimensione' => 30,
'tipo' => 'string',
],
'descrizione_debitore_2' => [
'inizio' => 41,
'dimensione' => 30,
'tipo' => 'string',
],
'codice_fiscale_debitore' => [
'inizio' => 71,
'dimensione' => 16,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '30';
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 40 del formato CBI.
*
* @property string numero_progressivo Numero progressivo della ricevuta, uguale a quello indicato per il record 14 della disposizione.
* @property string indirizzo_debitore Via, numero civico e/o nome della frazione.
* @property string cap_debitore Codice di avviamento postale.
* @property string comune_debitore Comune del debitore.
* @property string provincia_debitore Sigla della provincia del debitore.
* @property string banca_domiciliataria Banca/sportello domiciliataria: eventuale denominazione in chiaro della banca/sportello domiciliataria/o.
*/
class Record40 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'indirizzo_debitore' => [
'inizio' => 11,
'dimensione' => 30,
'tipo' => 'string',
],
'cap_debitore' => [
'inizio' => 41,
'dimensione' => 5,
'tipo' => 'string',
],
'comune_debitore' => [
'inizio' => 46,
'dimensione' => 23,
'tipo' => 'string',
],
'provincia_debitore' => [
'inizio' => 69,
'dimensione' => 2,
'tipo' => 'string',
],
'banca_domiciliataria' => [
'inizio' => 71,
'dimensione' => 50,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '40';
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 50 del formato CBI.
*
* @property string numero_progressivo Numero progressivo della ricevuta, uguale a quello indicato per il record 14 della disposizione.
* @property string riferimento_debito_1 Riferimenti al debito.
* @property string riferimento_debito_2 Riferimenti al debito.
* @property string codice_fiscale_creditore Codice fiscale/Partita IVA del creditore. Se il campo è valorizzato, il controllo è di validità pertanto va verificata la presenza del CIN e la sua correttezza. Lobbligatorietà viene meno nel caso in cui il campo 82 del tipo record 70 delle “Riba presentate da clientela non residente” sia valorizzato a 1.
*/
class Record50 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'riferimento_debito_1' => [
'inizio' => 11,
'dimensione' => 40,
'tipo' => 'string',
],
'riferimento_debito_2' => [
'inizio' => 51,
'dimensione' => 40,
'tipo' => 'string',
],
'codice_fiscale_creditore' => [
'inizio' => 101,
'dimensione' => 16,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '50';
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 51 del formato CBI.
*
* @property string numero_progressivo Numero progressivo della ricevuta, uguale a quello indicato per il record 14 della disposizione.
* @property string numero_ricevuta Numero ricevuta attribuito dal creditore.
* @property string denominazione_creditore Denominazione sociale del creditore in forma abbreviata.
* @property string provincia_bollo_virtuale Provincia dell'Intendenza di Finanza che ha autorizzato il pagamento del bollo in modo virtuale.
* @property string numero_autorizzazione_bollo_virtuale Numero dell'autorizzazione concessa dall'Intendenza di Finanza.
* @property string data_autorizzazione_bollo_virtuale Data (nel formato GGMMAA) di concessione dell'autorizzazione da parte della Intendenza di Finanza.
*/
class Record51 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'numero_ricevuta' => [
'inizio' => 11,
'dimensione' => 10,
'tipo' => 'numeric',
],
'denominazione_creditore' => [
'inizio' => 21,
'dimensione' => 20,
'tipo' => 'string',
],
'provincia_bollo_virtuale' => [
'inizio' => 41,
'dimensione' => 15,
'tipo' => 'string',
],
'numero_autorizzazione_bollo_virtuale' => [
'inizio' => 56,
'dimensione' => 10,
'tipo' => 'string',
],
'data_autorizzazione_bollo_virtuale' => [
'inizio' => 66,
'dimensione' => 6,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '51';
}
}

View File

@ -0,0 +1,59 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record 70 del formato CBI.
*
* @property string numero_progressivo Numero progressivo della ricevuta, uguale a quello indicato per il record 14 della disposizione.
* @property string indicatori_circuito Campo a disposizione per altri circuiti (Teleincassi, Reteincassi, ecc.) da valorizzare secondo gli standard propri di ogni circuito.
* @property string tipo_documento_per_debitore Indica il tipo di documento da rilasciare al debitore al momento dell'esazione dell'incasso; assume i seguenti valori: 1 = ricevuta bancaria; 2 = Conferma d'ordine di bonifico; 0 o blank = il cliente chiede alla Banca di comportarsi secondo accordi bilaterali predefiniti.
* @property string flag_richiesta_esito Assume i seguenti valori: 1 = é richiesta la notifica del pagato; 2 = non é richiesta la notifica del pagato; 0 o blank = il cliente chiede alla Banca di comportarsi secondo accordi bilaterali predefiniti.
* @property string flag_stampa_avviso Indica chi é incaricato della stampa e invio dell'avviso di pagamento; può assumere i
* @property string chiavi_controllo Campo a disposizione, valorizzabile dall'Azienda previ accordi diretti con la Banca Assuntrice.
*/
class Record70 extends BaseRecord
{
public static $struttura = [
'numero_progressivo' => [
'inizio' => 4,
'dimensione' => 7,
'tipo' => 'numeric',
],
'indicatori_circuito' => [
'inizio' => 89,
'dimensione' => 12,
'tipo' => 'string',
],
'tipo_documento_per_debitore' => [
'inizio' => 101,
'dimensione' => 1,
'tipo' => 'string',
],
'flag_richiesta_esito' => [
'inizio' => 102,
'dimensione' => 1,
'tipo' => 'string',
],
'flag_stampa_avviso' => [
'inizio' => 103,
'dimensione' => 1,
'tipo' => 'string',
],
'chiavi_controllo' => [
'inizio' => 104,
'dimensione' => 17,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return '70';
}
}

View File

@ -0,0 +1,90 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record EF del formato CBI.
*
* @property string codice_sia_mittente Codice assegnato dalla Sia all'Azienda Mittente; deve essere censito in associazione alla Banca Proponente presso il Centro Applicativo mittente.
* @property string abi_assuntrice Codice ABI della banca assuntrice cui devono essere inviate le disposizioni; deve essere presente nella tabella Centri Applicativi in associazione al Centro Applicativo destinatario del flusso.
* @property string data_creazione Data di creazione del 'flusso' da parte dell'Azienda mittente nel formato GGMMAA.
* @property string nome_supporto Campo di libera composizione da parte dell'Azienda Mittente; dev'essere univoco nell'ambito della data di creazione e a parità di mittente e ricevente.
* @property string campo_a_disposizione Campo a disposizione dell'Azienda mittente.
* @property string numero_disposizioni Numero delle disposizioni (ricevute Ri.Ba. contenute nel flusso).
* @property string totale_importi_negativi Importo totale in centesimi di Euro - delle disposizioni contenute nel flusso.
* @property string totale_importi_positivi Valorizzato con "zeri" per RiBa.
* @property string numero_record Numero dei record che compongono il flusso (comprensivo dei record di testa e di coda).
* @property string codice_divisa Assume il valore fisso "E" (Euro).
* @property string giornata_applicativa Questo campo è di interesse soltanto nella tratta tra Centri Applicativi. Data della giornata applicativa in cui il supporto logico é stato elaborato presso il Centro Applicativo mittente (nel formato GGMMAA).
*/
class RecordEF extends BaseRecord
{
public static $struttura = [
'codice_sia_mittente' => [
'inizio' => 4,
'dimensione' => 5,
'tipo' => 'numeric',
],
'abi_assuntrice' => [
'inizio' => 9,
'dimensione' => 5,
'tipo' => 'numeric',
],
'data_creazione' => [
'inizio' => 14,
'dimensione' => 6,
'tipo' => 'string',
],
'nome_supporto' => [
'inizio' => 20,
'dimensione' => 20,
'tipo' => 'string',
],
'campo_a_disposizione' => [
'inizio' => 40,
'dimensione' => 6,
'tipo' => 'string',
],
'numero_disposizioni' => [
'inizio' => 46,
'dimensione' => 7,
'tipo' => 'numeric',
],
'totale_importi_negativi' => [
'inizio' => 53,
'dimensione' => 15,
'tipo' => 'numeric',
],
'totale_importi_positivi' => [
'inizio' => 68,
'dimensione' => 15,
'tipo' => 'numeric',
],
'numero_record' => [
'inizio' => 83,
'dimensione' => 7,
'tipo' => 'numeric',
],
'codice_divisa' => [
'inizio' => 114,
'dimensione' => 1,
'tipo' => 'constant',
'valore' => 'E',
],
'giornata_applicativa' => [
'inizio' => 115,
'dimensione' => 6,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return 'EF';
}
}

View File

@ -0,0 +1,85 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
/**
* Classe dedicata alla gestione dei dati per il record IB del formato CBI.
*
* @property string codice_sia_mittente Codice assegnato dalla Sia all'Azienda Mittente; deve essere censito in associazione alla Banca Proponente presso il Centro Applicativo codice_sia_mittente.
* @property string abi_assuntrice Codice ABI della banca assuntrice cui devono essere inviate le disposizioni; deve essere presente nella tabella Centri Applicativi in associazione al Centro Applicativo destinatario del flusso.
* @property string data_creazione Data di creazione del 'flusso' da parte dell'Azienda codice_sia_mittente nel formato GGMMAA.
* @property string nome_supporto Campo di libera composizione da parte dell'Azienda Mittente; dev'essere univoco nell'ambito della data di creazione e a parità di codice_sia_mittente e abi_assuntrice.
* @property string campo_a_disposizione Campo a disposizione dell'Azienda codice_sia_mittente.
* @property string tipo_flusso Assume il valore: "1" = operazioni generate nellambito di attività Market Place.
* @property string qualificatore_flusso Assume il valore fisso "$".
* @property string soggetto_veicolare Se i due campi tipo_flusso e qualificatore_flusso sono valorizzati con i valori previsti, deve essere indicato il codice ABI della Banca Gateway MP.
* @property string codice_divisa Assume il valore fisso "E" (Euro).
* @property string centro_applicativo Questo campo è di interesse soltanto della tratta tra Centri Applicativi. Codice ABI del Centro Applicativo destinatario del supporto.
*/
class RecordIB extends BaseRecord
{
public static $struttura = [
'codice_sia_mittente' => [
'inizio' => 4,
'dimensione' => 5,
'tipo' => 'numeric',
],
'abi_assuntrice' => [
'inizio' => 9,
'dimensione' => 5,
'tipo' => 'numeric',
],
'data_creazione' => [
'inizio' => 14,
'dimensione' => 6,
'tipo' => 'string',
],
'nome_supporto' => [
'inizio' => 20,
'dimensione' => 20,
'tipo' => 'string',
],
'campo_a_disposizione' => [
'inizio' => 40,
'dimensione' => 6,
'tipo' => 'string',
],
'tipo_flusso' => [
'inizio' => 105,
'dimensione' => 1,
'tipo' => 'string',
],
'qualificatore_flusso' => [
'inizio' => 106,
'dimensione' => 1,
'tipo' => 'constant',
'valore' => '$',
],
'soggetto_veicolare' => [
'inizio' => 107,
'dimensione' => 5,
'tipo' => 'string',
],
'codice_divisa' => [
'inizio' => 114,
'dimensione' => 1,
'tipo' => 'constant',
'valore' => 'E',
],
'centro_applicativo' => [
'inizio' => 116,
'dimensione' => 5,
'tipo' => 'string',
],
];
public static function getStruttura(): array
{
return static::$struttura;
}
public static function getCodice(): string
{
return 'IB';
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa\Records;
interface RecordInterface
{
public static function getStruttura(): array;
public static function getCodice(): string;
public function get(string $name): ?string;
public function set(string $name, ?string $value): void;
public function toCBI(): string;
public function fromCBI(string $contenuto): void;
}

View File

@ -0,0 +1,206 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa;
use Plugins\PresentazioniBancarie\RiBa\Records\Record14;
use Plugins\PresentazioniBancarie\RiBa\Records\Record20;
use Plugins\PresentazioniBancarie\RiBa\Records\Record30;
use Plugins\PresentazioniBancarie\RiBa\Records\Record40;
use Plugins\PresentazioniBancarie\RiBa\Records\Record50;
use Plugins\PresentazioniBancarie\RiBa\Records\Record51;
use Plugins\PresentazioniBancarie\RiBa\Records\Record70;
use Plugins\PresentazioniBancarie\RiBa\Records\RecordEF;
use Plugins\PresentazioniBancarie\RiBa\Records\RecordIB;
use InvalidArgumentException;
class RiBa
{
/**
* @var Intestazione
*/
protected $intestazione;
/**
* @var Ricevuta[]
*/
protected $ricevute = [];
public function __construct(Intestazione $intestazione)
{
$this->intestazione = $intestazione;
}
public function addRicevuta(Ricevuta $ricevuta)
{
$this->ricevute[] = $ricevuta;
}
/**
* @return Intestazione
*/
public function getIntestazione()
{
return $this->intestazione;
}
/**
* @return RiBa
*/
public function setIntestazione(Intestazione $intestazione)
{
$this->intestazione = $intestazione;
return $this;
}
/**
* @return Ricevuta[]
*/
public function getRicevute()
{
return $this->ricevute;
}
/**
* @param Ricevuta[] $ricevute
*
* @return RiBa
*/
public function setRicevute($ricevute)
{
$this->ricevute = $ricevute;
return $this;
}
public function asCBI()
{
$eol = "\r\n";
$intestazione = $this->intestazione;
$ricevute = $this->ricevute;
$contenuto = '';
// Verifica sulla presenza di ricevute
if (empty($ricevute)) {
throw new \Exception();
}
// Record IB
$ib = new RecordIB();
$ib->codice_sia_mittente = $intestazione->codice_sia;
$ib->abi_assuntrice = $intestazione->abi;
$ib->nome_supporto = $intestazione->nome_supporto;
$ib->data_creazione = $intestazione->data_creazione;
$ib->tipo_flusso = 1;
$ib->soggetto_veicolare = $intestazione->abi;
$contenuto .= $ib->toCBI().$eol;
// Iterazione tra le ricevute interne al RiBa
$progressivo = 0;
$totale = 0;
foreach ($ricevute as $ricevuta) {
++$progressivo;
$totale += $ricevuta->importo;
// Record 14
$r14 = new Record14();
$r14->numero_progressivo = $progressivo;
$r14->data_pagamento = $ricevuta->scadenza;
$r14->abi_assuntrice = $intestazione->abi;
$r14->cab_assuntrice = $intestazione->cab;
$r14->conto_assuntrice = $intestazione->conto;
$r14->codice_azienda_creditrice = $intestazione->codice_sia;
$r14->abi_domiciliataria = $ricevuta->abi_banca;
$r14->cab_domiciliataria = $ricevuta->cab_banca;
$r14->importo = $ricevuta->importo;
$r14->codice_cliente_debitore = $ricevuta->codice_cliente;
$contenuto .= $r14->toCBI().$eol;
// Record 20
$r20 = new Record20();
$r20->numero_progressivo = $progressivo;
$r20->descrizione_creditore_1 = $intestazione->ragione_soc1_creditore;
$r20->descrizione_creditore_2 = $intestazione->ragione_soc2_creditore;
$r20->descrizione_creditore_3 = $intestazione->indirizzo_creditore;
$r20->descrizione_creditore_4 = $intestazione->cap_citta_prov_creditore;
$contenuto .= $r20->toCBI().$eol;
// Record 30
$r30 = new Record30();
$r30->numero_progressivo = $progressivo;
$r30->descrizione_debitore_1 = $ricevuta->nome_debitore;
//$r30->descrizione_debitore_2 = $ricevuta->indirizzo_debitore;
$r30->codice_fiscale_debitore = $ricevuta->identificativo_debitore;
$contenuto .= $r30->toCBI().$eol;
// Record 40
$r40 = new Record40();
$r40->numero_progressivo = $progressivo;
$r40->indirizzo_debitore = $ricevuta->indirizzo_debitore;
$r40->cap_debitore = $ricevuta->cap_debitore;
$r40->comune_debitore = $ricevuta->comune_debitore;
$r40->provincia_debitore = $ricevuta->provincia_debitore;
$r40->banca_domiciliataria = $ricevuta->descrizione_banca;
$contenuto .= $r40->toCBI().$eol;
// Record 50
$r50 = new Record50();
$r50->numero_progressivo = $progressivo;
$r50->codice_fiscale_creditore = $intestazione->identificativo_creditore;
$r50->riferimento_debito_1 = $ricevuta->descrizione;
$r50->riferimento_debito_2 = $ricevuta->descrizione_origine;
$contenuto .= $r50->toCBI().$eol;
// Record 51
$r51 = new Record51();
$r51->numero_progressivo = $progressivo;
$r51->numero_ricevuta = $ricevuta->numero_ricevuta;
$r51->denominazione_creditore = $intestazione->ragione_soc1_creditore;
$contenuto .= $r51->toCBI().$eol;
// Record 70
$r70 = new Record70();
$r70->numero_progressivo = $progressivo;
$contenuto .= $r70->toCBI().$eol;
}
// Record 70
$ef = new RecordEF();
$ef->codice_sia_mittente = $intestazione->codice_sia;
$ef->abi_assuntrice = $intestazione->abi;
$ef->nome_supporto = $intestazione->nome_supporto;
$ef->data_creazione = $intestazione->data_creazione;
$ef->numero_disposizioni = $progressivo;
$ef->totale_importi_negativi = $totale;
$ef->numero_record = $progressivo * 7 + 2;
$contenuto .= $ef->toCBI().$eol;
return $contenuto;
}
public function asRibaAbiCbi()
{
$formato_intestazione = $this->intestazione->toCbiFormat();
// Trasformazione delle ricevute nel formato relativo
$formato_ricevute = [];
foreach ($this->ricevute as $ricevuta) {
$formato_ricevute[] = $ricevuta->toCbiFormat();
}
// Eccezione in caso di assenza di ricevute interne
if (empty($formato_ricevute)) {
throw new InvalidArgumentException();
}
$cbi = new RibaAbiCbi();
return $cbi->creaFile($formato_intestazione, $formato_ricevute);
}
}

View File

@ -0,0 +1,265 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa;
/**
* Questa classe genera il file RiBa standard ABI-CBI passando alla funzione "creaFile".
*
* @source GAzie - Gestione Azienda <http://gazie.sourceforge.net>
*
* @license GPL-2.0
* @copyright Copyright (C) 2004-2020 - Antonio De Vincentiis Montesilvano (PE) (http://www.devincentiis.it)
*/
class RibaAbiCbi
{
protected $progressivo = 0;
protected $assuntrice;
protected $data;
protected $valuta;
protected $supporto;
protected $totale;
protected $creditore;
protected $sia_code;
protected $cab_ass;
/**
* @param array $intestazione = [
* [0] => abi_assuntrice variabile lunghezza 5 numerico
* [1] => cab_assuntrice variabile lunghezza 5 numerico
* [2] => conto variabile lunghezza 12 alfanumerico
* [3] => data_creazione variabile lunghezza 6 numerico formato GGMAA
* [4] => nome_supporto variabile lunghezza 20 alfanumerico
* [5] => codice_divisa variabile lunghezza 1 alfanumerico opzionale default "E"
* [6] => ragione_soc1_creditore variabile lunghezza 24 alfanumerico
* [7] => ragione_soc2_creditore variabile lunghezza 24 alfanumerico
* [8] => indirizzo_creditore variabile lunghezza 24 alfanumerico
* [9] => cap_citta_prov_creditore variabile lunghezza 24 alfanumerico
* [10] => codice_fiscale_creditore variabile lunghezza 16 alfanumerico opzionale default ""
* [11] => codice SIA 5 caratteri alfanumerici
* [12] => carry booleano true per aggiungere i caratteri di fine rigo chr(13) e chr(10)
* ]
* @param array $ricevute_bancarie = [
* [0] => numero ricevuta lunghezza 10 numerico
* [1] => scadenza lunghezza 6 numerico
* [2] => importo in centesimi di euro lunghezza 13 numerico
* [3] => nome debitore lunghezza 60 alfanumerico
* [4] => codice fiscale/partita iva debitore lunghezza 16 alfanumerico
* [5] => indirizzo debitore lunghezza 30 alfanumerico
* [6] => cap debitore lunghezza 5 numerico
* [7] => comune debitore lunghezza 25 alfanumerico
* [8] => abi banca domiciliataria lunghezza 5 numerico
* [9] => cab banca domiciliataria lunghezza 5 numerico
* [10] => descrizione banca domiciliataria lunghezza 50 alfanumerico
* [11] => codice cliente attribuito dal creditore lunghezza 16 numerico
* [12] => descrizione del debito lunghezza 40 alfanumerico (CIG CUP)
* [13] => provincia debitore lunghezza 2 alfanumerico
* [14] => descrizione del debito lunghezza 40 alfanumerico (Numero e data riferimento della fattura che ha generato l'effetto)
* ]
*
* @return string
*/
public function creaFile($intestazione, $ricevute_bancarie)
{
$eol = '';
if (isset($intestazione[12])) {
$eol = chr(13).chr(10);
}
$contenuto = $this->RecordIB($intestazione[0], $intestazione[3], $intestazione[4], $intestazione[5], $intestazione[11], $intestazione[1]).$eol;
foreach ($ricevute_bancarie as $ricevuta) { //estraggo le ricevute dall'array
++$this->progressivo;
$contenuto .= $this->Record14($ricevuta[1], $ricevuta[2], $intestazione[0], $intestazione[1], $intestazione[2], $ricevuta[8], $ricevuta[9], $ricevuta[11]).$eol;
$contenuto .= $this->Record20($intestazione[6], $intestazione[7], $intestazione[8], $intestazione[9]).$eol;
$contenuto .= $this->Record30($ricevuta[3], $ricevuta[4]).$eol;
$contenuto .= $this->Record40($ricevuta[5], $ricevuta[6], $ricevuta[7], $ricevuta[10], $ricevuta[13]).$eol;
$contenuto .= $this->Record50($ricevuta[12].' '.$ricevuta[14], $intestazione[10]).$eol;
$contenuto .= $this->Record51($ricevuta[0]).$eol;
$contenuto .= $this->Record70().$eol;
}
$contenuto .= $this->RecordEF().$eol;
return $contenuto;
}
/**
* @param string $string
* @param int $length
*
* @return string
*/
protected function padString($string, $length)
{
// Sostituzione di alcuni simboli noti
$replaces = [
'&#039;' => "'",
'&quot;' => "'",
'&amp;' => '&',
];
$string = str_replace(array_keys($replaces), array_values($replaces), $string);
return substr(str_pad($string, $length), 0, $length);
}
/**
* @param string $string
* @param int $length
*
* @return string
*/
protected function padNumber($string, $length)
{
return str_pad($string, $length, '0', STR_PAD_LEFT);
}
/**
* Record di testa.
*
* @param $abi_assuntrice
* @param $data_creazione
* @param $nome_supporto
* @param $codice_divisa
* @param $sia_code
* @param $cab_assuntrice
*
* @return string
*/
protected function RecordIB($abi_assuntrice, $data_creazione, $nome_supporto, $codice_divisa, $sia_code, $cab_assuntrice)
{
$this->assuntrice = $this->padNumber($abi_assuntrice, 5);
$this->cab_ass = $this->padNumber($cab_assuntrice, 5);
$this->data = str_pad($data_creazione, 6, '0');
$this->valuta = substr($codice_divisa, 0, 1);
$this->supporto = str_pad($nome_supporto, 20, '*', STR_PAD_LEFT);
$this->sia_code = $this->padNumber($sia_code, 5);
return ' IB'.$this->sia_code.$this->assuntrice.$this->data.$this->supporto.str_repeat(' ', 65).'1$'.$this->assuntrice.str_repeat(' ', 2).$this->valuta.str_repeat(' ', 6);
}
/**
* @param string $scadenza
* @param float $importo
* @param string $abi_assuntrice
* @param string $cab_assuntrice
* @param string $conto
* @param string $abi_domiciliataria
* @param string $cab_domiciliataria
* @param string $codice_cliente
*
* @return string
*/
protected function Record14($scadenza, $importo, $abi_assuntrice, $cab_assuntrice, $conto, $abi_domiciliataria, $cab_domiciliataria, $codice_cliente)
{
$this->totale += $importo;
return ' 14'.$this->padNumber($this->progressivo, 7)
.str_repeat(' ', 12).$scadenza.'30000'.$this->padNumber($importo, 13).'-'.$this->padNumber($abi_assuntrice, 5).$this->padNumber($cab_assuntrice, 5).str_pad($conto, 12)
.$this->padNumber($abi_domiciliataria, 5)
.$this->padNumber($cab_domiciliataria, 5)
.str_repeat(' ', 12).$this->sia_code.'4'.str_pad($codice_cliente, 16)
.str_repeat(' ', 6).$this->valuta;
}
/**
* @param string $ragione_soc1_creditore
* @param string $ragione_soc2_creditore
* @param string $indirizzo_creditore
* @param string $cap_citta_prov_creditore
*
* @return string
*/
protected function Record20($ragione_soc1_creditore, $ragione_soc2_creditore, $indirizzo_creditore, $cap_citta_prov_creditore)
{
$this->creditore = str_pad($ragione_soc1_creditore, 24);
return ' 20'.$this->padNumber($this->progressivo, 7)
.substr($this->creditore, 0, 24)
.$this->padString($ragione_soc2_creditore, 24)
.$this->padString($indirizzo_creditore, 24)
.$this->padString($cap_citta_prov_creditore, 24)
.str_repeat(' ', 14);
}
/**
* @param string $nome_debitore
* @param string $codice_fiscale_debitore
*
* @return string
*/
protected function Record30($nome_debitore, $codice_fiscale_debitore)
{
return ' 30'.$this->padNumber($this->progressivo, 7)
.$this->padString($nome_debitore, 60)
.str_pad($codice_fiscale_debitore, 16, ' ')
.str_repeat(' ', 34);
}
/**
* @param string $indirizzo_debitore
* @param string $cap_debitore
* @param string $comune_debitore
* @param string $descrizione_domiciliataria
* @param string $provincia_debitore
*
* @return string
*/
protected function Record40($indirizzo_debitore, $cap_debitore, $comune_debitore, $descrizione_domiciliataria = '', $provincia_debitore = '')
{
return ' 40'.$this->padNumber($this->progressivo, 7)
.$this->padString($indirizzo_debitore, 30)
.$this->padNumber(intval($cap_debitore), 5)
.$this->padString($comune_debitore, 22).' '.$this->padString($provincia_debitore, 2)
.$this->padString($descrizione_domiciliataria, 50);
}
/**
* @param string $descrizione_debito
* @param string $codice_fiscale_creditore
*
* @return string
*/
protected function Record50($descrizione_debito, $codice_fiscale_creditore)
{
return ' 50'.$this->padNumber($this->progressivo, 7)
.$this->padString($descrizione_debito, 80)
.str_repeat(' ', 10)
.str_pad($codice_fiscale_creditore, 16, ' ')
.str_repeat(' ', 4);
}
/**
* @param string $numero_ricevuta_creditore
*
* @return string
*/
protected function Record51($numero_ricevuta_creditore)
{
return ' 51'.$this->padNumber($this->progressivo, 7)
.$this->padNumber($numero_ricevuta_creditore, 10)
.substr($this->creditore, 0, 20)
.str_repeat(' ', 80);
}
/**
* @return string
*/
protected function Record70()
{
return ' 70'.$this->padNumber($this->progressivo, 7)
.str_repeat(' ', 110);
}
/**
* Record di coda.
*
* @return string
*/
protected function RecordEF()
{
return ' EF'.$this->sia_code.$this->assuntrice.$this->data.$this->supporto.str_repeat(' ', 6)
.$this->padNumber($this->progressivo, 7)
.$this->padNumber($this->totale, 15)
.str_repeat('0', 15)
.$this->padNumber($this->progressivo * 7 + 2, 7)
.str_repeat(' ', 24).$this->valuta.str_repeat(' ', 6);
}
}

View File

@ -0,0 +1,113 @@
<?php
namespace Plugins\PresentazioniBancarie\RiBa;
/**
* Classe per gestire i dati della ricevuta bancaria del RiBa.
*
* @property int $numero_ricevuta
* @property string $scadenza
* @property float $importo
* @property string $nome_debitore
* @property string $identificativo_debitore
* @property string $indirizzo_debitore
* @property int $cap_debitore
* @property string $comune_debitore
* @property int $abi_banca
* @property int $cab_banca
* @property string $descrizione_banca
* @property int $codice_cliente
* @property string $descrizione
* @property string $provincia_debitore
* @property string $descrizione_origine
*/
class Ricevuta extends Elemento
{
/**
* @var int Valore numerico di 10 cifre
*/
protected $numero_ricevuta;
/**
* @var string Valore numerico di 6 cifre
*/
protected $scadenza;
/**
* @var float Valore numerico di 13 cifre, con 2 cifre decimali
*/
protected $importo;
/**
* @var string Valore alfanumerico di 60 cifre
*/
protected $nome_debitore;
/**
* Codice fiscale oppure Partita IVA.
*
* @var string Valore alfanumerico di massimo 16 cifre
*/
protected $identificativo_debitore;
/**
* @var string Valore alfanumerico di 30 cifre
*/
protected $indirizzo_debitore;
/**
* @var int Valore numerico di 5 cifre
*/
protected $cap_debitore;
/**
* @var string Valore alfanumerico di 25 cifre
*/
protected $comune_debitore;
/**
* @var int Valore numerico di 5 cifre
*/
protected $abi_banca;
/**
* @var int Valore numerico di 5 cifre
*/
protected $cab_banca;
/**
* @var string Valore alfanumerico di 50 cifre
*/
protected $descrizione_banca;
/**
* Codice cliente attribuito dal creditore.
*
* @var int Valore numerico di 16 cifre
*/
protected $codice_cliente;
/**
* @var string Valore alfanumerico di 40 cifre, con i campi (CIG CUP)
*/
protected $descrizione;
/**
* @var string Valore alfanumerico di 2 cifre
*/
protected $provincia_debitore;
/**
* Numero e data riferimento della fattura che ha generato l'effetto.
*
* @var string Valore alfanumerico di 40 cifre
*/
protected $descrizione_origine;
public function toCbiFormat()
{
return [
$this->numero_ricevuta,
$this->scadenza,
$this->importo,
$this->nome_debitore,
$this->identificativo_debitore,
$this->indirizzo_debitore,
$this->cap_debitore,
$this->comune_debitore,
$this->abi_banca,
$this->cab_banca,
$this->descrizione_banca,
$this->codice_cliente,
$this->descrizione,
$this->provincia_debitore,
$this->descrizione_origine,
];
}
}

View File

@ -93,4 +93,9 @@ UPDATE `zz_views` SET `format` = '0' WHERE `zz_views`.`name` = 'Utente' AND id_m
-- Aggiunto plugin Movimenti in fatture di acquisto, vendita e anagrafiche
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Movimenti contabili', 'Movimenti contabili', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di acquisto'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di acquisto'), 'tab', '', '1', '1', '0', '', '', NULL, 'custom', 'movimenti_contabili', '');
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Movimenti contabili', 'Movimenti contabili', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di vendita'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Fatture di vendita'), 'tab', '', '1', '1', '0', '', '', NULL, 'custom', 'movimenti_contabili', '');
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Movimenti contabili', 'Movimenti contabili', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'), 'tab', '', '1', '1', '0', '', '', NULL, 'custom', 'movimenti_contabili', '');
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Movimenti contabili', 'Movimenti contabili', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Anagrafiche'), 'tab', '', '1', '1', '0', '', '', NULL, 'custom', 'movimenti_contabili', '');
-- Aggiunto plugin Presentazioni bancarie
ALTER TABLE `co_scadenziario` ADD `presentazioni_exported_at` TIMESTAMP NULL DEFAULT NULL;
INSERT INTO `zz_plugins` (`id`, `name`, `title`, `idmodule_from`, `idmodule_to`, `position`, `script`, `enabled`, `default`, `order`, `compatibility`, `version`, `options2`, `options`, `directory`, `help`) VALUES (NULL, 'Presentazioni Bancarie', 'Presentazioni Bancarie', (SELECT `id` FROM `zz_modules` WHERE `name` = 'Scadenzario'), (SELECT `id` FROM `zz_modules` WHERE `name` = 'Scadenzario'), 'tab_main', '', '1', '1', '0', '', '', NULL, 'custom', 'presentazioni_bancarie', '');