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];
|
2019-01-25 15:54:56 +01:00
|
|
|
$pieces = explode('_', $filename);
|
2018-12-14 12:50:44 +01:00
|
|
|
|
2019-01-25 15:54:56 +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
|
2019-07-18 18:33:56 +02:00
|
|
|
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)
|
2020-06-04 13:22:44 +02:00
|
|
|
// 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
|
|
|
|
2019-03-12 17:00:05 +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);
|
2020-06-04 13:22:44 +02:00
|
|
|
|
|
|
|
//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
|
|
|
}
|