Skip to content

Commit 033bcf1

Browse files
committed
refactor: ottimizzazione import listini cliente
1 parent 365e546 commit 033bcf1

1 file changed

Lines changed: 7 additions & 73 deletions

File tree

  • modules/listini_cliente/src/Import

modules/listini_cliente/src/Import/CSV.php

Lines changed: 7 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,12 @@ public function init()
5151
{
5252
parent::init();
5353

54-
// Pulisce le cache per una nuova importazione
5554
self::$listini_cache = [];
5655
self::$articoli_cache = [];
5756
$this->failed_errors = [];
5857
$this->current_row = 0;
5958

60-
$logger = logger();
61-
$logger->info('Inizializzazione importazione listino cliente', [
59+
logger()->info('Inizializzazione importazione listino cliente', [
6260
'timestamp' => date('Y-m-d H:i:s'),
6361
'classe' => static::class
6462
]);
@@ -71,18 +69,13 @@ public function complete()
7169
{
7270
parent::complete();
7371

74-
$logger = logger();
75-
$logger->info('Completamento importazione listino cliente', [
72+
logger()->info('Completamento importazione listino cliente', [
7673
'timestamp' => date('Y-m-d H:i:s'),
7774
'record_falliti' => count($this->failed_records),
7875
'listini_in_cache' => count(self::$listini_cache),
7976
'articoli_in_cache' => count(self::$articoli_cache),
8077
'righe_processate' => $this->current_row
8178
]);
82-
83-
// Opzionale: pulisce le cache alla fine per liberare memoria
84-
// self::$listini_cache = [];
85-
// self::$articoli_cache = [];
8679
}
8780
/**
8881
* Definisce i campi disponibili per l'importazione.
@@ -138,34 +131,29 @@ public function import($record, $update_record = true, $add_record = true)
138131
try {
139132
$database = database();
140133

141-
// Validazione dettagliata dei campi obbligatori
142134
$validation_errors = $this->validateRecord($record);
143135
if (!empty($validation_errors)) {
144136
$error_message = 'Errori di validazione: ' . implode(', ', $validation_errors);
145137
$this->logError('validation', $error_message, $record);
146138
return false;
147139
}
148140

149-
// Ricerca del listino, creandolo se non esiste
150141
$listino = $this->trovaOCreaListino($record, $database);
151142
if (empty($listino)) {
152143
$error_message = "Impossibile trovare o creare il listino '{$record['nome_listino']}'";
153144
$this->logError('listino_creation_failed', $error_message, $record);
154145
return false;
155146
}
156147

157-
// Ricerca dell'articolo
158148
$articolo = $this->trovaArticolo($record, $database);
159149
if (empty($articolo)) {
160150
$error_message = "Articolo con codice '{$record['codice']}' non trovato";
161151
$this->logError('articolo_not_found', $error_message, $record);
162152
return false;
163153
}
164154

165-
// Ricerca dell'articolo nel listino
166155
$articolo_listino = $this->trovaArticoloListino($articolo['id'], $listino['id']);
167156

168-
// Controllo se creare o aggiornare il record
169157
if (($articolo_listino && !$update_record) || (!$articolo_listino && !$add_record)) {
170158
$logger->info('Importazione saltata per articolo nel listino', [
171159
'codice_articolo' => $record['codice'],
@@ -176,10 +164,8 @@ public function import($record, $update_record = true, $add_record = true)
176164
return null;
177165
}
178166

179-
// Creazione o aggiornamento dell'articolo nel listino
180167
$this->salvaArticoloListino($articolo_listino, $articolo, $listino['id'], $record);
181168

182-
// Log di successo
183169
$logger->info('Articolo importato con successo nel listino', [
184170
'codice_articolo' => $record['codice'],
185171
'nome_listino' => $record['nome_listino'],
@@ -220,7 +206,6 @@ protected function validateRecord($record)
220206
{
221207
$errors = [];
222208

223-
// Validazione campi obbligatori
224209
if (empty($record['nome_listino'])) {
225210
$errors[] = 'Nome listino mancante';
226211
} elseif (strlen($record['nome_listino']) > 255) {
@@ -235,12 +220,10 @@ protected function validateRecord($record)
235220
$errors[] = 'Prezzo unitario mancante';
236221
}
237222

238-
// Validazione formato prezzo
239223
if (!empty($record['prezzo_unitario']) && !is_numeric($record['prezzo_unitario'])) {
240224
$errors[] = 'Prezzo unitario non valido (deve essere numerico)';
241225
}
242226

243-
// Validazione sconto percentuale
244227
if (!empty($record['sconto_percentuale'])) {
245228
if (!is_numeric($record['sconto_percentuale'])) {
246229
$errors[] = 'Sconto percentuale non valido (deve essere numerico)';
@@ -249,7 +232,6 @@ protected function validateRecord($record)
249232
}
250233
}
251234

252-
// Validazione formato data scadenza
253235
if (!empty($record['data_scadenza'])) {
254236
$date = \DateTime::createFromFormat('Y-m-d', $record['data_scadenza']);
255237
if (!$date || $date->format('Y-m-d') !== $record['data_scadenza']) {
@@ -271,11 +253,8 @@ protected function validateRecord($record)
271253
protected function logError($type, $message, $record, $exception = null)
272254
{
273255
$logger = logger();
274-
275-
// Aggiungi l'errore all'array per il file CSV delle anomalie
276256
$this->failed_errors[] = $message;
277257

278-
// Context per il log strutturato
279258
$context = [
280259
'tipo_errore' => $type,
281260
'riga' => $this->current_row,
@@ -293,7 +272,6 @@ protected function logError($type, $message, $record, $exception = null)
293272
];
294273
}
295274

296-
// Log con livello appropriato
297275
switch ($type) {
298276
case 'validation':
299277
$logger->warning('Errore di validazione durante importazione listino cliente', $context);
@@ -313,18 +291,11 @@ protected function logError($type, $message, $record, $exception = null)
313291
}
314292
}
315293

316-
/**
317-
* Cache per i listini già cercati per migliorare le performance.
318-
*/
319294
protected static $listini_cache = [];
320-
321-
/**
322-
* Cache per gli articoli già cercati per migliorare le performance.
323-
*/
324295
protected static $articoli_cache = [];
325296

326297
/**
327-
* Trova il listino in base al nome con caching per migliorare le performance.
298+
* Trova il listino in base al nome con caching
328299
*
329300
* @param array $record Record da importare
330301
* @param object $database Connessione al database
@@ -339,21 +310,18 @@ protected function trovaListino($record, $database)
339310

340311
$nome_listino = $record['nome_listino'];
341312

342-
// Controlla la cache prima di fare la query
343313
if (isset(self::$listini_cache[$nome_listino])) {
344314
return self::$listini_cache[$nome_listino];
345315
}
346316

347317
$result = $database->fetchOne('SELECT id FROM mg_listini WHERE nome = '.prepare($nome_listino));
348-
349-
// Salva in cache il risultato (anche se null)
350318
self::$listini_cache[$nome_listino] = !empty($result) ? $result : null;
351319

352320
return self::$listini_cache[$nome_listino];
353321
}
354322

355323
/**
356-
* Trova l'articolo in base al codice con caching per migliorare le performance.
324+
* Trova l'articolo in base al codice con caching
357325
*
358326
* @param array $record Record da importare
359327
* @param object $database Connessione al database
@@ -368,14 +336,11 @@ protected function trovaArticolo($record, $database)
368336

369337
$codice = $record['codice'];
370338

371-
// Controlla la cache prima di fare la query
372339
if (isset(self::$articoli_cache[$codice])) {
373340
return self::$articoli_cache[$codice];
374341
}
375342

376343
$result = $database->fetchOne('SELECT `id` FROM `mg_articoli` WHERE `codice` = '.prepare($codice));
377-
378-
// Salva in cache il risultato (anche se null)
379344
self::$articoli_cache[$codice] = !empty($result) ? $result : null;
380345

381346
return self::$articoli_cache[$codice];
@@ -396,23 +361,19 @@ protected function trovaOCreaListino($record, $database)
396361
}
397362

398363
$nome_listino = $record['nome_listino'];
399-
400-
// Prima prova a trovare il listino esistente
401364
$listino = $this->trovaListino($record, $database);
402365

403366
if (!empty($listino)) {
404367
return $listino;
405368
}
406369

407-
// Se non trovato, crea un nuovo listino
408370
try {
409371
$logger = logger();
410372

411373
$nuovo_listino = Listino::build($nome_listino);
412-
$nuovo_listino->attivo = 1; // Attivo di default
374+
$nuovo_listino->attivo = 1;
413375
$nuovo_listino->save();
414376

415-
// Aggiorna la cache con il nuovo listino
416377
$listino_data = ['id' => $nuovo_listino->id];
417378
self::$listini_cache[$nome_listino] = $listino_data;
418379

@@ -424,8 +385,7 @@ protected function trovaOCreaListino($record, $database)
424385

425386
return $listino_data;
426387
} catch (\Exception $e) {
427-
$logger = logger();
428-
$logger->error('Errore durante la creazione del listino', [
388+
logger()->error('Errore durante la creazione del listino', [
429389
'nome_listino' => $nome_listino,
430390
'errore' => $e->getMessage(),
431391
'riga' => $this->current_row
@@ -435,27 +395,11 @@ protected function trovaOCreaListino($record, $database)
435395
}
436396
}
437397

438-
/**
439-
* Trova l'articolo nel listino.
440-
*
441-
* @param int $id_articolo ID dell'articolo
442-
* @param int $id_listino ID del listino
443-
*
444-
* @return Articolo|null
445-
*/
446398
protected function trovaArticoloListino($id_articolo, $id_listino)
447399
{
448400
return Articolo::where('id_articolo', $id_articolo)->where('id_listino', $id_listino)->first();
449401
}
450402

451-
/**
452-
* Salva l'articolo nel listino.
453-
*
454-
* @param Articolo|null $articolo_listino Articolo nel listino esistente
455-
* @param array $articolo_originale Articolo originale
456-
* @param int $id_listino ID del listino
457-
* @param array $record Record da importare
458-
*/
459403
protected function salvaArticoloListino($articolo_listino, $articolo_originale, $id_listino, $record)
460404
{
461405
$prezzi_ivati = setting('Utilizza prezzi di vendita comprensivi di IVA');
@@ -484,7 +428,6 @@ public function saveFailedRecordsWithErrors($filepath)
484428
return '';
485429
}
486430

487-
// Crea la directory se non esiste
488431
$dir = dirname($filepath);
489432
if (!is_dir($dir)) {
490433
mkdir($dir, 0777, true);
@@ -493,12 +436,10 @@ public function saveFailedRecordsWithErrors($filepath)
493436
$file = fopen($filepath, 'w');
494437
fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));
495438

496-
// Scrivi l'intestazione con colonna errore aggiuntiva
497439
$header = $this->getHeader();
498440
$header[] = 'Errore';
499441
fputcsv($file, $header, ';');
500442

501-
// Scrivi le righe fallite con i relativi errori
502443
foreach ($this->failed_rows as $index => $row) {
503444
$error_message = $this->failed_errors[$index] ?? 'Errore sconosciuto';
504445
$row[] = $error_message;
@@ -507,9 +448,7 @@ public function saveFailedRecordsWithErrors($filepath)
507448

508449
fclose($file);
509450

510-
// Log dell'operazione
511-
$logger = logger();
512-
$logger->info('File anomalie listino cliente creato', [
451+
logger()->info('File anomalie listino cliente creato', [
513452
'filepath' => $filepath,
514453
'record_falliti' => count($this->failed_rows),
515454
'timestamp' => date('Y-m-d H:i:s')
@@ -518,11 +457,6 @@ public function saveFailedRecordsWithErrors($filepath)
518457
return $filepath;
519458
}
520459

521-
/**
522-
* Restituisce gli errori specifici per i record falliti.
523-
*
524-
* @return array
525-
*/
526460
public function getFailedErrors()
527461
{
528462
return $this->failed_errors;

0 commit comments

Comments
 (0)