Aggiunto plugin Presentazioni bancarie in Scadenzario
This commit is contained in:
parent
7815054a2e
commit
04409436ed
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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>';
|
|
@ -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>';
|
|
@ -0,0 +1,7 @@
|
|||
<?php
|
||||
|
||||
include_once __DIR__.'/../../core.php';
|
||||
|
||||
$records = get('records', true);
|
||||
$records = $records ? explode(',', $records) : [];
|
||||
$record = $records[0] ?: null;
|
|
@ -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 = [
|
||||
''' => "'",
|
||||
'"' => "'",
|
||||
'&' => '&',
|
||||
];
|
||||
$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 [];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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 = [
|
||||
''' => "'",
|
||||
'"' => "'",
|
||||
'&' => '&',
|
||||
];
|
||||
$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;
|
||||
}
|
||||
}
|
|
@ -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 dell’azienda 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';
|
||||
}
|
||||
}
|
|
@ -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';
|
||||
}
|
||||
}
|
|
@ -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 né di presenza né 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';
|
||||
}
|
||||
}
|
|
@ -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';
|
||||
}
|
||||
}
|
|
@ -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. L’obbligatorietà 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';
|
||||
}
|
||||
}
|
|
@ -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';
|
||||
}
|
||||
}
|
|
@ -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';
|
||||
}
|
||||
}
|
|
@ -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';
|
||||
}
|
||||
}
|
|
@ -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 nell’ambito 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';
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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 = [
|
||||
''' => "'",
|
||||
'"' => "'",
|
||||
'&' => '&',
|
||||
];
|
||||
$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);
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
|
@ -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', '');
|
||||
|
|
Loading…
Reference in New Issue