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 +);