From bcd57dfb2dff9ade9ebc30377e4c093185f74779 Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Mon, 27 Mar 2023 16:55:00 +0200 Subject: [PATCH] Gestione esportazione xml scadenzario --- plugins/presentazioni_bancarie/actions.php | 2 +- .../src/Cbi/CbiSepa.php | 173 ++++++++++++++++++ .../src/Cbi/Intestazione.php | 27 ++- .../presentazioni_bancarie/src/Cbi/RiBa.php | 2 +- .../presentazioni_bancarie/src/Gestore.php | 112 +++++++++++- .../template/template_CBIPaymentRequest.xml | 55 ++++++ 6 files changed, 360 insertions(+), 11 deletions(-) create mode 100644 plugins/presentazioni_bancarie/src/Cbi/CbiSepa.php create mode 100644 plugins/presentazioni_bancarie/template/template_CBIPaymentRequest.xml diff --git a/plugins/presentazioni_bancarie/actions.php b/plugins/presentazioni_bancarie/actions.php index b2d6aab85..cdc204d19 100644 --- a/plugins/presentazioni_bancarie/actions.php +++ b/plugins/presentazioni_bancarie/actions.php @@ -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, diff --git a/plugins/presentazioni_bancarie/src/Cbi/CbiSepa.php b/plugins/presentazioni_bancarie/src/Cbi/CbiSepa.php new file mode 100644 index 000000000..c72e7cc12 --- /dev/null +++ b/plugins/presentazioni_bancarie/src/Cbi/CbiSepa.php @@ -0,0 +1,173 @@ +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; + } +} diff --git a/plugins/presentazioni_bancarie/src/Cbi/Intestazione.php b/plugins/presentazioni_bancarie/src/Cbi/Intestazione.php index abe035c9e..6a0c1a2d2 100644 --- a/plugins/presentazioni_bancarie/src/Cbi/Intestazione.php +++ b/plugins/presentazioni_bancarie/src/Cbi/Intestazione.php @@ -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, ]; } } diff --git a/plugins/presentazioni_bancarie/src/Cbi/RiBa.php b/plugins/presentazioni_bancarie/src/Cbi/RiBa.php index e01c81b4a..1455815da 100644 --- a/plugins/presentazioni_bancarie/src/Cbi/RiBa.php +++ b/plugins/presentazioni_bancarie/src/Cbi/RiBa.php @@ -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; diff --git a/plugins/presentazioni_bancarie/src/Gestore.php b/plugins/presentazioni_bancarie/src/Gestore.php index dcd50aa9f..07bd3880d 100644 --- a/plugins/presentazioni_bancarie/src/Gestore.php +++ b/plugins/presentazioni_bancarie/src/Gestore.php @@ -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 = [ + ''' => "'", + '"' => "'", + '&' => '&', + ]; + $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(); diff --git a/plugins/presentazioni_bancarie/template/template_CBIPaymentRequest.xml b/plugins/presentazioni_bancarie/template/template_CBIPaymentRequest.xml new file mode 100644 index 000000000..a3f508b31 --- /dev/null +++ b/plugins/presentazioni_bancarie/template/template_CBIPaymentRequest.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + CBI + + + + + + + + TRA + false + + NORM + + SEPA + + + + + + + + + + + + + + + + + + + + + + + + + + SLEV + +