Gestione esportazione xml scadenzario

This commit is contained in:
MatteoPistorello 2023-03-27 16:55:00 +02:00
parent c7481b916b
commit bcd57dfb2d
6 changed files with 360 additions and 11 deletions

View File

@ -46,7 +46,7 @@ switch (filter('op')) {
return $item->id == $scadenza->id;
});
// Generazione della descrizione del pagamento
// Generazione della descrizione del pagamento
if ($scadenze_documento->count() > 1) {
$descrizione .= tr('_DOC_, pagamento _NUM_/_TOT_', [
'_DOC_' => $descrizione,

View File

@ -0,0 +1,173 @@
<?php
namespace Plugins\PresentazioniBancarie\Cbi;
use DOMDocument;
use DOMXPath;
class CbiSepa
{
/**
* @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 Bonifico
*/
public function setIntestazione(Intestazione $intestazione)
{
$this->intestazione = $intestazione;
return $this;
}
/**
* @return Ricevuta[]
*/
public function getRicevute()
{
return $this->ricevute;
}
/**
* @param Ricevuta[] $ricevute
*
* @return Bonifico
*/
public function setRicevute($ricevute)
{
$this->ricevute = $ricevute;
return $this;
}
public function asXML()
{
global $rootdir;
$intestazione = $this->intestazione;
$ricevute = $this->ricevute;
$contenuto = '';
// Verifica sulla presenza di ricevute
if (empty($ricevute)) {
throw new \Exception();
}
$credtm = date('Y-m-d\TH:i:s');
$msgid = dechex(rand(100,999).date('siHdmY')).'-';
$content = file_get_contents(base_dir().'/plugins/presentazioni_bancarie/template/template_CBIPaymentRequest.xml');
$CtrlSum = 0.00;
$NbOfTxs = 1;
$domDoc = new DOMDocument;
$domDoc->preserveWhiteSpace = false;
$domDoc->formatOutput = true;
$domDoc->loadXML($content);
$xpath = new DOMXPath($domDoc);
$rootNamespace = $domDoc->lookupNamespaceUri($domDoc->namespaceURI);
$xpath->registerNamespace('x', $rootNamespace);
$results = $xpath->query("//x:GrpHdr/x:MsgId")->item(0);
$attrVal = $domDoc->createTextNode($msgid);
$results->appendChild($attrVal);
$results = $xpath->query("//x:GrpHdr/x:CreDtTm")->item(0);
$attrVal = $domDoc->createTextNode($credtm);
$results->appendChild($attrVal);
$results = $xpath->query("//x:GrpHdr/x:InitgPty/x:Nm")->item(0);
$attrVal = $domDoc->createTextNode($intestazione->descrizione_banca);
$results->appendChild($attrVal);
$results = $xpath->query("//x:GrpHdr/x:InitgPty/x:Id/x:OrgId/x:Othr/x:Id")->item(0);
$attrVal = $domDoc->createTextNode('SIA'.$intestazione->codice_sia);
$results->appendChild($attrVal);
$results = $xpath->query("//x:PmtInf/x:PmtInfId")->item(0);
$attrVal = $domDoc->createTextNode($msgid);
$results->appendChild($attrVal);
$results = $xpath->query("//x:PmtInf/x:ReqdExctnDt")->item(0);
$attrVal = $domDoc->createTextNode(substr($credtm,0,10));
$results->appendChild($attrVal);
$results = $xpath->query("//x:PmtInf/x:Dbtr/x:Nm")->item(0);
$attrVal = $domDoc->createTextNode($intestazione->descrizione_banca);
$results->appendChild($attrVal);
$results = $xpath->query("//x:PmtInf/x:Dbtr/x:Id/x:OrgId/x:Othr/x:Id")->item(0);
$attrVal = $domDoc->createTextNode($intestazione->identificativo_creditore);
$results->appendChild($attrVal);
$results = $xpath->query("//x:PmtInf/x:DbtrAcct/x:Id/x:IBAN")->item(0);
$attrVal = $domDoc->createTextNode($intestazione->iban);
$results->appendChild($attrVal);
$results = $xpath->query("//x:PmtInf/x:DbtrAgt/x:FinInstnId/x:ClrSysMmbId/x:MmbId")->item(0);
$attrVal = $domDoc->createTextNode($intestazione->abi);
$results->appendChild($attrVal);
// creo gli elementi dei singoli bonifici
foreach ($ricevute as $ricevuta) {
$PmtInf = $xpath->query("//x:PmtInf")->item(0);
$el = $domDoc->createElement("CdtTrfTxInf", "");
$el1 = $domDoc->createElement("PmtId", "");
$el2 = $domDoc->createElement("InstrId", $NbOfTxs);
$el1->appendChild($el2);
$el2 = $domDoc->createElement("EndToEndId", $msgid.$NbOfTxs);
$el1->appendChild($el2);
$el->appendChild($el1);
$el1 = $domDoc->createElement("PmtTpInf", "");
$el2 = $domDoc->createElement("CtgyPurp", "");
$el3 = $domDoc->createElement("Cd", $ricevuta->ctgypurp);
$el2->appendChild($el3);
$el1->appendChild($el2);
$el->appendChild($el1);
$el1 = $domDoc->createElement("Amt", "");
$el2 = $domDoc->createElement("InstdAmt", number_format(round($ricevuta->importo,2),2,'.',''));
$newel2 = $el1->appendChild($el2);
$newel2->setAttribute("Ccy", "EUR");
$el->appendChild($el1);
$el1 = $domDoc->createElement("Cdtr", "");
$el2 = $domDoc->createElement("Nm", $ricevuta->nome_debitore);
$el1->appendChild($el2);
$el->appendChild($el1);
$el1 = $domDoc->createElement("CdtrAcct", "");
$el2 = $domDoc->createElement("Id", "");
$el3 = $domDoc->createElement("IBAN", $ricevuta->iban);
$el2->appendChild($el3);
$el1->appendChild($el2);
$el->appendChild($el1);
$el1 = $domDoc->createElement("RmtInf", "");
$el2 = $domDoc->createElement("Ustrd", $ricevuta->descrizione);
$el1->appendChild($el2);
$el->appendChild($el1);
$PmtInf->appendChild($el);
$NbOfTxs++;
$CtrlSum += $ricevuta->importo;
}
$results = $xpath->query("//x:GrpHdr/x:NbOfTxs")->item(0);
$attrVal = $domDoc->createTextNode($NbOfTxs-1);
$results->appendChild($attrVal);
$results = $xpath->query("//x:GrpHdr/x:CtrlSum")->item(0);
$attrVal = $domDoc->createTextNode(number_format(round($CtrlSum,2),2,'.',''));
$results->appendChild($attrVal);
$contenuto = $domDoc->saveXML();
return $contenuto;
}
}

View File

@ -6,8 +6,8 @@ namespace Plugins\PresentazioniBancarie\Cbi;
* Classe per gestire l'intestazione del RiBa.
*
* @property int $abi
* @property int $soggetto_veicolatore
* @property int $cab
* @property string $iban
* @property string $conto
* @property string $data_creazione
* @property string $nome_supporto
@ -18,7 +18,9 @@ namespace Plugins\PresentazioniBancarie\Cbi;
* @property string $partita_iva_o_codice_fiscale_creditore
* @property string $identificativo_creditore
* @property string $codice_sia
* @property int $soggetto_veicolatore
* @property bool $eol
* @property string $descrizione_banca
*/
class Intestazione extends Elemento
{
@ -28,13 +30,6 @@ class Intestazione extends Elemento
* @var int Valore numerico di 5 cifre
*/
protected $abi;
/**
* Codice ABI del soggetto veicolatore.
*
* @var int Valore numerico di 5 cifre
*/
protected $soggetto_veicolatore;
/**
* Codice CAB della banca del creditore.
*
@ -43,6 +38,10 @@ class Intestazione extends Elemento
* @property
*/
protected $cab;
/**
* @var string Valore alfanumerico di 24 cifre
*/
protected $iban;
/**
* @var string Valore alfanumerico di 12 cifre
*/
@ -83,16 +82,27 @@ class Intestazione extends Elemento
* @var string Valore alfanumerico di 5 cifre
*/
protected $codice_sia;
/**
* Codice ABI del soggetto veicolatore.
*
* @var int Valore numerico di 5 cifre
*/
protected $soggetto_veicolatore;
/**
* @var bool true per aggiungere i caratteri di fine rigo
*/
protected $eol = true;
/**
* @var string Valore alfanumerico di 24 cifre
*/
protected $descrizione_banca;
public function toRibaAbiCbiFormat()
{
return [
$this->abi,
$this->cab,
$this->iban,
$this->conto,
$this->data_creazione,
$this->nome_supporto,
@ -105,6 +115,7 @@ class Intestazione extends Elemento
$this->codice_sia,
$this->soggetto_veicolatore,
$this->eol,
$this->descrizione_banca,
];
}
}

View File

@ -171,7 +171,7 @@ class RiBa
$contenuto .= $r70->toCBI().$eol;
}
// Record 70
// Record EF
$ef = new RecordEF();
$ef->codice_sia_mittente = $intestazione->codice_sia;
$ef->abi_assuntrice = $intestazione->abi;

View File

@ -7,6 +7,7 @@ use DateTime;
use Plugins\PresentazioniBancarie\Cbi\Intestazione;
use Plugins\PresentazioniBancarie\Cbi\RiBa;
use Plugins\PresentazioniBancarie\Cbi\Ricevuta;
use Plugins\PresentazioniBancarie\Cbi\CbiSepa;
use Digitick\Sepa\PaymentInformation;
use Digitick\Sepa\TransferFile\Factory\TransferFileFacadeFactory;
use Exception;
@ -31,12 +32,14 @@ class Gestore
protected static $banca_predefinita_azienda;
protected $id_riba;
protected $id_bonifico;
protected $id_debito_diretto;
protected $id_credito_diretto;
protected $riba;
protected $debito_diretto;
protected $credito_diretto;
protected $bonifico;
protected $numero_transazioni_debito_diretto = 0;
@ -59,6 +62,9 @@ class Gestore
$this->id_riba = random_string();
$this->initRiBa();
$this->id_bonifico = random_string();
$this->initBonifico();
$this->id_credito_diretto = random_string();
$this->initCreditoDiretto();
@ -95,6 +101,38 @@ class Gestore
$this->riba = new RiBa($intestazione);
}
/**
* Inizializzazione del formato per il sistema Bonifico.
*/
public function initBonifico()
{
$iban = $this->banca_azienda->iban;
$conto = substr($iban, 15, 12);
$abi_assuntrice = substr($iban, 5, 5);
$cab_assuntrice = substr($iban, 10, 5);
$descrizione_banca = $this->banca_azienda->nome.' '.$this->banca_azienda->filiale;
$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->iban = $iban;
$intestazione->data_creazione = $data->format('dmy');
$intestazione->nome_supporto = $supporto;
$intestazione->citta_creditore = strtoupper($this->azienda['cap'].' '.$this->azienda['citta'].' '.$this->azienda['provincia']);
$intestazione->ragione_sociale_creditore = strtoupper($this->azienda->ragione_sociale);
$intestazione->indirizzo_creditore = strtoupper($this->azienda['indirizzo']);
$intestazione->partita_iva_o_codice_fiscale_creditore = !empty($this->azienda->partita_iva) ? $this->azienda->partita_iva : $this->azienda->codice_fiscale;
$intestazione->descrizione_banca = $descrizione_banca;
$this->bonifico = new CbiSepa($intestazione);
}
/**
* Inizializzazione del formato per il credito diretto.
*
@ -140,9 +178,10 @@ class Gestore
$importo = $scadenza->da_pagare - $scadenza->pagato;
$totale = (abs($scadenza->da_pagare) - abs($scadenza->pagato));
$is_credito_diretto = ($direzione == 'uscita' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP05','MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21'])) || (empty($documento) && $importo < 0);
$is_credito_diretto = ($direzione == 'uscita' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP09', 'MP10', 'MP11', 'MP19', 'MP20', 'MP21'])) || (empty($documento) && $importo < 0 && $ctgypurp != "SALA");
$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);
$is_bonifico = $direzione == 'uscita' && in_array($pagamento->codice_modalita_pagamento_fe, ['MP05']) && !empty($this->banca_azienda->codice_sia) || (empty($documento) && $importo < 0 && $ctgypurp == "SALA");
if(in_array($pagamento->codice_modalita_pagamento_fe, ['MP19', 'MP21'])){
$method = 'B2B';
@ -157,6 +196,8 @@ class Gestore
} elseif ($is_riba) {
$totale = $totale*100;
return $this->aggiungiRiBa($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza);
} elseif ($is_bonifico) {
return $this->aggiungiBonifico($identifier, $controparte, $banca_controparte, $descrizione, $totale, $scadenza->scadenza, $ctgypurp);
}
return false;
@ -215,6 +256,61 @@ class Gestore
return true;
}
public function aggiungiBonifico(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, int $totale, DateTime $data_prevista, $ctgypurp)
{
$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->iban = $banca_controparte['iban'];
$ricevuta->codice_cliente = $controparte['codice'];
$ricevuta->ctgypurp = $ctgypurp;
//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->bonifico->addRicevuta($ricevuta);
return true;
}
public function aggiungiCreditoDiretto(int $identifier, Anagrafica $controparte, Banca $banca_controparte, string $descrizione, $totale, DateTime $data_prevista, $ctgypurp)
{
$id = 'pagamento_'.$identifier;
@ -374,6 +470,20 @@ class Gestore
} catch (Exception $e) {
}
// File per il pagamento delle vendite Bonifico
try {
$content = $this->bonifico->asXML();
// Generazione filename
$filename = $this->id_bonifico.'.xml';
$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();

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<CBIPaymentRequest xsi:schemaLocation="urn:CBI:xsd:CBIPaymentRequest.00.04.00 CBIPaymentRequest.00.04.00.xsd" xmlns="urn:CBI:xsd:CBIPaymentRequest.00.04.00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<GrpHdr>
<MsgId/>
<CreDtTm/>
<NbOfTxs/>
<CtrlSum/>
<InitgPty>
<Nm/>
<Id>
<OrgId>
<Othr>
<Id/>
<Issr>CBI</Issr>
</Othr>
</OrgId>
</Id>
</InitgPty>
</GrpHdr>
<PmtInf>
<PmtInfId/>
<PmtMtd>TRA</PmtMtd>
<BtchBookg>false</BtchBookg>
<PmtTpInf>
<InstrPrty>NORM</InstrPrty>
<SvcLvl>
<Cd>SEPA</Cd>
</SvcLvl>
</PmtTpInf>
<ReqdExctnDt/>
<Dbtr>
<Nm></Nm>
<Id>
<OrgId>
<Othr>
<Id/>
</Othr>
</OrgId>
</Id>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN/>
</Id>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<ClrSysMmbId>
<MmbId/>
</ClrSysMmbId>
</FinInstnId>
</DbtrAgt>
<ChrgBr>SLEV</ChrgBr>
</PmtInf>
</CBIPaymentRequest>