openstamanager/plugins/receiptFE/src/Ricevuta.php

156 lines
4.1 KiB
PHP
Raw Normal View History

2018-12-14 12:50:44 +01:00
<?php
namespace Plugins\ReceiptFE;
2019-02-20 16:07:42 +01:00
use Modules;
2018-12-14 12:50:44 +01:00
use Modules\Fatture\Fattura;
2019-02-20 16:07:42 +01:00
use Plugins;
2018-12-14 12:50:44 +01:00
use UnexpectedValueException;
2019-02-20 16:07:42 +01:00
use Uploads;
2018-12-29 12:03:22 +01:00
use Util\XML;
2019-03-29 15:14:09 +01:00
use Util\Zip;
2018-12-14 12:50:44 +01:00
/**
* Classe per la gestione della fatturazione elettronica in XML.
*
* @since 2.4.2
*/
class Ricevuta
{
2019-02-20 16:07:42 +01:00
protected static $directory = null;
/** @var array Percorso del file XML */
protected $file = null;
/** @var array XML della ricevuta */
2018-12-14 12:50:44 +01:00
protected $xml = null;
2019-02-20 16:07:42 +01:00
/** @var array XML della ricevuta */
2018-12-14 12:50:44 +01:00
protected $fattura = null;
2019-02-20 16:07:42 +01:00
public function __construct($name)
2018-12-14 12:50:44 +01:00
{
2019-03-29 15:14:09 +01:00
$file = static::getImportDirectory().'/'.$name;
if (ends_with($name, '.zip')) {
$original_file = $file;
$extraction_dir = static::getImportDirectory().'/tmp';
Zip::extract($file, $extraction_dir);
$name = basename($name, '.zip').'.xml';
$file = static::getImportDirectory().'/'.$name;
copy($extraction_dir.'/'.$name, $file);
delete($original_file);
delete($extraction_dir);
}
$this->file = $file;
2019-02-20 16:07:42 +01:00
$this->xml = XML::readFile($this->file);
2018-12-14 12:50:44 +01:00
2019-02-20 16:07:42 +01:00
$filename = explode('.', $name)[0];
$pieces = explode('_', $filename);
2018-12-14 12:50:44 +01:00
$progressivo_invio = $pieces[1];
2018-12-14 12:50:44 +01:00
$this->fattura = Fattura::where([
'progressivo_invio' => $progressivo_invio,
])->first();
if (empty($this->fattura)) {
throw new UnexpectedValueException();
}
}
2019-02-20 16:07:42 +01:00
public static function store($filename, $content)
{
$directory = static::getImportDirectory();
$file = $directory.'/'.$filename;
directory($directory);
file_put_contents($file, $content);
return $filename;
}
public static function getImportDirectory()
{
if (!isset(self::$directory)) {
$plugin = Plugins::get('Ricevute FE');
self::$directory = DOCROOT.'/'.$plugin->upload_directory;
}
return self::$directory;
}
public function saveAllegato($codice)
{
$module = Modules::get('Fatture di vendita');
$info = [
'category' => tr('Fattura Elettronica'),
'id_module' => $module->id,
'id_record' => $this->fattura->id,
];
// Registrazione XML come allegato
Uploads::upload($this->file, array_merge($info, [
2019-02-20 16:07:42 +01:00
'name' => tr('Ricevuta _TYPE_', [
'_TYPE_' => $codice,
]),
'original' => basename($this->file),
]));
}
public function saveStato($codice)
{
$fattura = $this->getFattura();
// Modifica lo stato solo se la fattura non è già stata consegnata (per evitare problemi da doppi invii)
// In realtà per le PA potrebbe esserci lo stato NE (che può contenere un esito positivo EC01 o negativo EC02) successivo alla RC,
// quindi aggiungo eccezzione nel caso il nuovo codice della ricevuta sia NE.
//if ($fattura->codice_stato_fe == 'RC' and $codice != 'NE') {
//return;
//}
2019-02-20 16:07:42 +01:00
// Processo la ricevuta e salvo data ricezione, codice e messaggio
2019-02-20 16:07:42 +01:00
$descrizione = $this->xml['Destinatario']['Descrizione'];
$data = $this->xml['DataOraRicezione'];
2019-03-29 15:14:09 +01:00
$fattura->data_stato_fe = date('Y-m-d H:i:s', strtotime($data));
2019-02-20 16:07:42 +01:00
$fattura->codice_stato_fe = $codice;
2019-03-29 15:14:09 +01:00
$fattura->descrizione_ricevuta_fe = $descrizione;
2019-02-20 16:07:42 +01:00
$fattura->save();
}
public function save()
{
$name = basename($this->file);
$filename = explode('.', $name)[0];
$pieces = explode('_', $filename);
$codice = $pieces[2];
$this->saveAllegato($codice);
//In caso di Notifica Esito il codice è definito dal nodo <Esito> della ricevuta
if ($codice == 'NE'){
$this->xml = XML::readFile($this->file);
$codice = $this->xml['EsitoCommittente']['Esito'];
}
2019-02-20 16:07:42 +01:00
$this->saveStato($codice);
}
2018-12-14 12:50:44 +01:00
public function getFattura()
{
return $this->fattura;
}
2019-02-20 16:07:42 +01:00
public function delete()
{
delete($this->file);
}
2018-12-14 12:50:44 +01:00
}