diff --git a/lib/functions.php b/lib/functions.php
index 8cbce7bad..c728e66e8 100755
--- a/lib/functions.php
+++ b/lib/functions.php
@@ -62,7 +62,7 @@ function sanitizeFilename($filename)
/**
* Elimina i file indicati.
*
- * @param array $files
+ * @param array|string $files
*
* @return bool
*/
diff --git a/modules/fatture/src/Fattura.php b/modules/fatture/src/Fattura.php
index b2b2f64a2..08913e21e 100755
--- a/modules/fatture/src/Fattura.php
+++ b/modules/fatture/src/Fattura.php
@@ -24,6 +24,7 @@ use Carbon\Carbon;
use Common\Components\Description;
use Common\Document;
use Illuminate\Database\Eloquent\Builder;
+use Models\Upload;
use Modules\Anagrafiche\Anagrafica;
use Modules\Fatture\Gestori\Bollo as GestoreBollo;
use Modules\Fatture\Gestori\Movimenti as GestoreMovimenti;
@@ -460,6 +461,23 @@ class Fattura extends Document
})->sortBy('created_at');
}
+ /**
+ * Restituisce la ricevuta principale, impostata attraverso il campo aggiuntivo id_ricevuta_principale.
+ *
+ * @return Upload|null
+ */
+ public function getRicevutaPrincipale()
+ {
+ if (empty($this->id_ricevuta_principale)) {
+ return null;
+ }
+
+ return $this->getModule()
+ ->uploads($this->id)
+ ->where('id', $this->id_ricevuta_principale)
+ ->first();
+ }
+
/**
* Controlla se la fattura di acquisto è elettronica.
*
diff --git a/plugins/exportFE/actions.php b/plugins/exportFE/actions.php
index dd522e2d4..ba2c35f36 100755
--- a/plugins/exportFE/actions.php
+++ b/plugins/exportFE/actions.php
@@ -20,7 +20,6 @@
include_once __DIR__.'/init.php';
use Plugins\ExportFE\Interaction;
-use Plugins\ReceiptFE\Interaction as RecepitInteraction;
use Plugins\ReceiptFE\Ricevuta;
switch (filter('op')) {
@@ -62,23 +61,27 @@ switch (filter('op')) {
}
// Importazione ultima ricevuta individuata
- RecepitInteraction::getReceipt($last_recepit);
-
- $fattura = null;
- try {
- $receipt = new Ricevuta($last_recepit);
- $receipt->save();
-
- $fattura = $receipt->getFattura()->numero_esterno;
-
- $receipt->delete();
-
- RecepitInteraction::processReceipt($name);
- } catch (UnexpectedValueException $e) {
- }
+ $fattura = Ricevuta::process($last_recepit);
+ $numero_esterno = $fattura ? $fattura->numero_esterno : null;
echo json_encode([
'file' => $last_recepit,
+ 'fattura' => $numero_esterno,
+ ]);
+
+ break;
+
+ case 'gestione_ricevuta':
+ $name = filter('name');
+ $type = filter('type');
+
+ $cambia_stato = $type != 'download';
+ $fattura = Ricevuta::process($name, false);
+
+ $numero_esterno = $fattura ? $fattura->numero_esterno : null;
+
+ echo json_encode([
+ 'file' => $name,
'fattura' => $fattura,
]);
diff --git a/plugins/exportFE/edit.php b/plugins/exportFE/edit.php
index f324874a4..8a8021136 100755
--- a/plugins/exportFE/edit.php
+++ b/plugins/exportFE/edit.php
@@ -119,8 +119,8 @@ echo '
echo '
';
-// Messaggio esito invio
-$ultima_ricevuta = $fattura->getRicevute()->last();
+// Messaggio informativo sulla ricevuta principale impostata
+$ricevuta_principale = $fattura->getRicevutaPrincipale();
if (!empty($record['codice_stato_fe'])) {
if ($record['codice_stato_fe'] == 'GEN') {
echo '
@@ -141,9 +141,9 @@ if (!empty($record['codice_stato_fe'])) {
'.Translator::timestampToLocale($record['data_stato_fe']);
- if (!empty($ultima_ricevuta)) {
+ if (!empty($ricevuta_principale)) {
echo '
-
+
'.tr('Visualizza ricevuta').'
';
}
@@ -156,8 +156,8 @@ if (!empty($record['codice_stato_fe'])) {
';
// Lettura della ricevuta
- if (!empty($ultima_ricevuta) && $stato_fe['codice'] == 'NS') {
- $contenuto_ricevuta = \Util\XML::readFile($ultima_ricevuta->filepath);
+ if (!empty($ricevuta_principale) && $stato_fe['codice'] == 'NS') {
+ $contenuto_ricevuta = \Util\XML::readFile($ricevuta_principale->filepath);
$lista_errori = $contenuto_ricevuta['ListaErrori'];
if (!empty($lista_errori)) {
@@ -193,7 +193,7 @@ if (!empty($record['codice_stato_fe'])) {
echo '
';
diff --git a/plugins/receiptFE/actions.php b/plugins/receiptFE/actions.php
index 798ade2f4..e40cb2b12 100755
--- a/plugins/receiptFE/actions.php
+++ b/plugins/receiptFE/actions.php
@@ -29,24 +29,12 @@ switch (filter('op')) {
$results = [];
foreach ($list as $element) {
$name = $element['name'];
- Interaction::getReceipt($name);
-
- $fattura = null;
- try {
- $receipt = new Ricevuta($name);
- $receipt->save();
-
- $fattura = $receipt->getFattura()->numero_esterno;
-
- $receipt->delete();
-
- Interaction::processReceipt($name);
- } catch (UnexpectedValueException $e) {
- }
+ $fattura = Ricevuta::process($name);
+ $numero_esterno = $fattura ? $fattura->numero_esterno : null;
$results[] = [
'file' => $name,
- 'fattura' => $fattura,
+ 'fattura' => $numero_esterno,
];
}
@@ -63,20 +51,9 @@ switch (filter('op')) {
// no break
case 'prepare':
$name = $name ?: get('name');
- Interaction::getReceipt($name);
+ $fattura = Ricevuta::process($name);
- $fattura = null;
- try {
- $receipt = new Ricevuta($name);
- $receipt->save();
-
- $fattura = $receipt->getFattura()->numero_esterno;
-
- $receipt->delete();
-
- Interaction::processReceipt($name);
- } catch (UnexpectedValueException $e) {
- }
+ $numero_esterno = $fattura ? $fattura->numero_esterno : null;
echo json_encode([
'file' => $name,
diff --git a/plugins/receiptFE/src/ReceiptHook.php b/plugins/receiptFE/src/ReceiptHook.php
index 47f56f883..e8ef57efe 100755
--- a/plugins/receiptFE/src/ReceiptHook.php
+++ b/plugins/receiptFE/src/ReceiptHook.php
@@ -69,18 +69,11 @@ class ReceiptHook extends Manager
// Importazione ricevuta
$name = $element['name'];
- Interaction::getReceiptList($name);
-
- try {
- $receipt = new Ricevuta($name);
- $receipt->save();
-
- $receipt->delete();
- Interaction::processReceipt($name);
+ $fattura = Ricevuta::process($name);
+ if (!empty($fattura)) {
$completed[] = $element;
unset($todo[$i]);
- } catch (UnexpectedValueException $e) {
}
}
diff --git a/plugins/receiptFE/src/Ricevuta.php b/plugins/receiptFE/src/Ricevuta.php
index 48638debd..5438fc918 100755
--- a/plugins/receiptFE/src/Ricevuta.php
+++ b/plugins/receiptFE/src/Ricevuta.php
@@ -19,11 +19,10 @@
namespace Plugins\ReceiptFE;
-use Modules;
+use Models\Upload;
use Modules\Fatture\Fattura;
use Plugins;
use UnexpectedValueException;
-use Uploads;
use Util\XML;
use Util\Zip;
@@ -48,6 +47,7 @@ class Ricevuta
{
$file = static::getImportDirectory().'/'.$name;
+ // Estrazione implicita per il formato ZIP
if (ends_with($name, '.zip')) {
$original_file = $file;
@@ -79,6 +79,42 @@ class Ricevuta
}
}
+ /**
+ * Funzione per gestire in modo autonomo il download, l'importazione e il salvataggio di una specifica ricevuta identificata tramite nome.
+ *
+ * @param string $name
+ * @param bool $cambia_stato
+ *
+ * @return Fattura|null
+ */
+ public static function process($name, $cambia_stato = true)
+ {
+ Interaction::getReceipt($name);
+
+ $fattura = null;
+ try {
+ $receipt = new Ricevuta($name);
+ $receipt->save($cambia_stato);
+
+ $fattura = $receipt->getFattura();
+
+ $receipt->cleanup();
+
+ Interaction::processReceipt($name);
+ } catch (UnexpectedValueException $e) {
+ }
+
+ return $fattura;
+ }
+
+ /**
+ * Salva il file indicato nella cartella temporanea per una futura elaborazione.
+ *
+ * @param string $filename
+ * @param string $content
+ *
+ * @return string
+ */
public static function store($filename, $content)
{
$directory = static::getImportDirectory();
@@ -90,6 +126,11 @@ class Ricevuta
return $filename;
}
+ /**
+ * Restituisce la cartella temporanea utilizzabile per il salvataggio della ricevuta.
+ *
+ * @return string|null
+ */
public static function getImportDirectory()
{
if (!isset(self::$directory)) {
@@ -101,32 +142,51 @@ class Ricevuta
return self::$directory;
}
+ /**
+ * @param string $codice
+ *
+ * @return Upload|null
+ */
public function saveAllegato($codice)
{
- $module = Modules::get('Fatture di vendita');
+ $filename = basename($this->file);
+ $fattura = $this->getFattura();
- $info = [
+ // Controllo sulla presenza della stessa ricevuta
+ $upload_esistente = $fattura->getModule()
+ ->uploads($fattura->id)
+ ->where('original', $filename)
+ ->first();
+ if (!empty($upload_esistente)) {
+ return $upload_esistente;
+ }
+
+ // Registrazione del file XML come allegato
+ $upload = Upload::build($this->file, [
'category' => tr('Fattura Elettronica'),
'id_module' => $module->id,
- 'id_record' => $this->fattura->id,
- ];
-
- // Registrazione XML come allegato
- Uploads::upload($this->file, array_merge($info, [
+ 'id_record' => $fattura->id,
'name' => tr('Ricevuta _TYPE_', [
'_TYPE_' => $codice,
]),
- 'original' => basename($this->file),
- ]));
+ 'original' => $filename,
+ ]);
+
+ return $upload;
}
- public function saveStato($codice)
+ /**
+ * Aggiorna lo stato della fattura relativa alla ricevuta in modo tale da rispecchiare i dati richiesti.
+ *
+ * @param $codice
+ * @param $id_allegato
+ */
+ public function saveStato($codice, $id_allegato)
{
$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 eccezione nel caso il nuovo codice della ricevuta sia NE.
+ // 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 eccezione nel caso il nuovo codice della ricevuta sia NE.
if ($fattura->codice_stato_fe == 'RC' && ($codice != 'EC01' || $codice != 'EC02')) {
return;
}
@@ -138,11 +198,15 @@ class Ricevuta
$fattura->data_stato_fe = $data ? date('Y-m-d H:i:s', strtotime($data)) : '';
$fattura->codice_stato_fe = $codice;
$fattura->descrizione_ricevuta_fe = $descrizione;
+ $fattura->id_ricevuta_principale = $id_allegato;
$fattura->save();
}
- public function save()
+ /**
+ * Effettua le operazioni di salvataggio della ricevuta nella fattura relativa.
+ */
+ public function save($cambia_stato = true)
{
$name = basename($this->file);
$filename = explode('.', $name)[0];
@@ -157,22 +221,32 @@ class Ricevuta
$codice_nome = $codice_nome.' - '.$errore['Errore']['Codice'];
}
- $this->saveAllegato($codice_nome);
+ $upload = $this->saveAllegato($codice_nome);
- // In caso di Notifica Esito il codice è definito dal nodo della ricevuta
- if ($codice_stato == 'NE') {
- $codice_stato = $this->xml['EsitoCommittente']['Esito'];
+ if ($cambia_stato) {
+ // In caso di Notifica Esito il codice è definito dal nodo della ricevuta
+ if ($codice_stato == 'NE') {
+ $codice_stato = $this->xml['EsitoCommittente']['Esito'];
+ }
+
+ $this->saveStato($codice_stato, $upload->id);
}
-
- $this->saveStato($codice_stato);
}
+ /**
+ * Restituisce la fattura identificata per la ricevuta.
+ *
+ * @return Fattura|null
+ */
public function getFattura()
{
return $this->fattura;
}
- public function delete()
+ /**
+ * Rimuove i file temporanei relativi alla ricevuta.
+ */
+ public function cleanup()
{
delete($this->file);
}
diff --git a/update/2_4_18.sql b/update/2_4_18.sql
index 858a30170..7634a6738 100644
--- a/update/2_4_18.sql
+++ b/update/2_4_18.sql
@@ -88,3 +88,13 @@ UPDATE `zz_views` SET `query` = 'CONCAT(UCASE(LEFT(tipo_movimento, 1)), SUBSTRIN
-- Aggiornamento versione API services
UPDATE `zz_settings` SET `valore` = 'v3' WHERE `nome` = 'OSMCloud Services API Version';
+-- Aggiunto collegamento con allegato per impostare la ricevuta principale
+ALTER TABLE `co_documenti` ADD `id_ricevuta_principale` INT(11);
+UPDATE `co_documenti` SET `co_documenti`.`id_ricevuta_principale` = (
+ SELECT `zz_files`.`id` FROM `zz_files` WHERE `zz_files`.`id_module` = (
+ SELECT `zz_modules`.`id` FROM `zz_modules` WHERE `zz_modules`.`name` = 'Fatture di vendita'
+ ) AND `zz_files`.`id_record` = `co_documenti`.`id`
+ AND `zz_files`.`name` LIKE 'Ricevuta%'
+ ORDER BY `zz_files`.`created_at`
+ LIMIT 1
+);