Skip to content

Commit 1bc85a4

Browse files
committed
refactor: ottimizzazione importazione ricevute per evitare interruzioni in caso di ricevuta di scarto
1 parent 15799c8 commit 1bc85a4

3 files changed

Lines changed: 65 additions & 13 deletions

File tree

plugins/receiptFE/src/MissingReceiptTask.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,16 @@ public function execute()
5656
foreach ($ricevute as $ricevuta) {
5757
$name = $ricevuta['name'];
5858

59-
Ricevuta::process($name);
59+
try {
60+
Ricevuta::process($name);
61+
} catch (\Throwable $e) {
62+
$this->task->log('error', 'Errore importazione ricevuta FE mancante', [
63+
'file' => $name,
64+
'id_fattura' => $fattura->id,
65+
'message' => $e->getMessage(),
66+
'trace' => $e->getTraceAsString(),
67+
]);
68+
}
6069
}
6170
}
6271
}

plugins/receiptFE/src/ReceiptTask.php

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public function execute()
6969
// Caricamento elenco di ricevute imporate
7070
$completed = $completed_cache->content;
7171
$count = (is_array($todo) ? count($todo) : 0);
72+
$errors = 0;
7273

7374
// Esecuzione di 10 imporazioni
7475
for ($i = 0; $i < 25 && $i < $count; ++$i) {
@@ -77,7 +78,18 @@ public function execute()
7778
if ($element !== null) {
7879
// Importazione ricevuta
7980
$name = $element['name'];
80-
$fattura = Ricevuta::process($name);
81+
try {
82+
$fattura = Ricevuta::process($name);
83+
} catch (\Throwable $e) {
84+
++$errors;
85+
$this->task->log('error', 'Errore importazione ricevuta FE', [
86+
'file' => $name,
87+
'message' => $e->getMessage(),
88+
'trace' => $e->getTraceAsString(),
89+
]);
90+
91+
continue;
92+
}
8193

8294
if ($fattura !== null) {
8395
$completed[] = $element;
@@ -97,11 +109,11 @@ public function execute()
97109
];
98110
}
99111

100-
// Esecuzione dell'importazione
101-
foreach ($list as $element) {
102-
$name = $element['name'];
103-
104-
Ricevuta::process($name);
112+
if ($errors > 0) {
113+
$result = [
114+
'response' => 2,
115+
'message' => tr('Importazione completata con errori su alcune ricevute'),
116+
];
105117
}
106118

107119
return $result;

plugins/receiptFE/src/Ricevuta.php

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,33 @@ public function saveAllegato($codice)
202202
return $upload;
203203
}
204204

205+
/**
206+
* Restituisce la lista normalizzata degli errori presenti nella ricevuta.
207+
*
208+
* @return array
209+
*/
210+
protected function getListaErrori()
211+
{
212+
$lista_errori = $this->xml['ListaErrori']['Errore'] ?? [];
213+
if (empty($lista_errori) || !is_array($lista_errori)) {
214+
return [];
215+
}
216+
217+
return XML::forceArray($lista_errori);
218+
}
219+
220+
/**
221+
* Restituisce il primo errore disponibile nella ricevuta.
222+
*
223+
* @return array
224+
*/
225+
protected function getErrorePrincipale()
226+
{
227+
$lista_errori = $this->getListaErrori();
228+
229+
return $lista_errori[0] ?? [];
230+
}
231+
205232
/**
206233
* Aggiorna lo stato della fattura relativa alla ricevuta in modo tale da rispecchiare i dati richiesti.
207234
*/
@@ -216,6 +243,9 @@ public function saveStato($codice, $id_allegato)
216243
}
217244

218245
$descrizione = null;
246+
$suggerimento = null;
247+
$errore_principale = $this->getErrorePrincipale();
248+
219249
// Processo la ricevuta e salvo data ricezione, codice e messaggio
220250
switch ($codice) {
221251
case 'RC':
@@ -245,8 +275,8 @@ public function saveStato($codice, $id_allegato)
245275
break;
246276
case 'NS':
247277
// Scartata
248-
$descrizione = $this->xml['ListaErrori']['Errore']['Descrizione'];
249-
$suggerimento = $this->xml['ListaErrori']['Errore']['Suggerimento'];
278+
$descrizione = $errore_principale['Descrizione'] ?? null;
279+
$suggerimento = $errore_principale['Suggerimento'] ?? null;
250280
break;
251281
default:
252282
// Codice non gestito
@@ -256,7 +286,7 @@ public function saveStato($codice, $id_allegato)
256286

257287
// Se la fattura presenta già una ricevuta principale con un codice che non di scarto e il codice delle ricevuta da importare è 00404 (Fattura duplicata), non aggiorno la ricevuta.
258288
$codici_scarto = ['EC02', 'ERR', 'ERVAL', 'NS'];
259-
if ($this->xml['ListaErrori']['Errore']['Codice'] == 00404 && !empty($fattura->id_ricevuta_principale) && !in_array($fattura->codice_stato_fe, $codici_scarto)) {
289+
if (($errore_principale['Codice'] ?? null) == '00404' && !empty($fattura->id_ricevuta_principale) && !in_array($fattura->codice_stato_fe, $codici_scarto)) {
260290
return;
261291
}
262292
$data = $this->xml['DataOraRicezione'];
@@ -282,9 +312,10 @@ public function save($cambia_stato = true)
282312
// Individuazione codice per il nome dell'allegato
283313
$codice_nome = $codice_stato;
284314
if ($codice_nome == 'NS') {
285-
$lista_errori = $this->xml['ListaErrori'];
286-
$errore = $lista_errori[0] ?: $lista_errori;
287-
$codice_nome = $codice_nome.' - '.$errore['Errore']['Codice'];
315+
$errore = $this->getErrorePrincipale();
316+
if (!empty($errore['Codice'])) {
317+
$codice_nome = $codice_nome.' - '.$errore['Codice'];
318+
}
288319
}
289320

290321
$upload = $this->saveAllegato($codice_nome);

0 commit comments

Comments
 (0)