Skip to content

Commit eedfbbc

Browse files
committed
fix: importazione barcode articoli
1 parent b48bfb9 commit eedfbbc

1 file changed

Lines changed: 98 additions & 2 deletions

File tree

modules/articoli/src/Import/CSV.php

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use Modules\Anagrafiche\Sede;
2929
use Modules\Anagrafiche\Tipo;
3030
use Modules\Articoli\Articolo;
31+
use Modules\Articoli\Barcode;
3132
use Modules\Articoli\Categoria;
3233
use Modules\Articoli\Marca;
3334
use Modules\Iva\Aliquota;
@@ -336,7 +337,21 @@ public function init()
336337
}
337338

338339
if (!empty($record['prezzo_listino'])) {
339-
$database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id));
340+
// Determina la direzione del listino
341+
$direzione = strtolower((string) ($record['dir'] ?? ''));
342+
$direzione = match ($direzione) {
343+
'fornitore' => 'uscita',
344+
'cliente' => 'entrata',
345+
default => null,
346+
};
347+
348+
if ($direzione) {
349+
// Elimina solo i prezzi nella direzione specificata
350+
$database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id).' AND dir = '.prepare($direzione));
351+
} else {
352+
// Se la direzione non è specificata, elimina tutti i prezzi per questa combinazione
353+
$database->query('DELETE FROM mg_prezzi_articoli WHERE id_articolo = '.prepare($articolo->id).' AND id_anagrafica = '.prepare($anagrafica->id));
354+
}
340355
}
341356

342357
if (!empty($record['codice_fornitore']) && !empty($record['descrizione_fornitore'])) {
@@ -518,12 +533,15 @@ public function import($record, $update_record = true, $add_record = true)
518533
$this->aggiornaDettaglioPrezzi($articolo, $dettagli);
519534
}
520535

536+
// Gestione barcode separata
537+
$barcode_value = $record['barcode'] ?? '';
538+
521539
unset($record['anagrafica_listino'], $record['p_iva'], $record['qta_minima'],
522540
$record['qta_massima'], $record['prezzo_listino'], $record['sconto_listino'],
523541
$record['dir'], $record['codice_fornitore'], $record['barcode_fornitore'],
524542
$record['descrizione_fornitore'], $record['id_fornitore'],
525543
$record['categoria'], $record['sottocategoria'], $record['marca'], $record['modello'],
526-
$record['codice_iva_vendita'], $record['data_qta'], $record['nome_sede']);
544+
$record['codice_iva_vendita'], $record['data_qta'], $record['nome_sede'], $record['barcode']);
527545

528546
$this->processaImmagine($articolo, $url, $record);
529547
unset($record['import_immagine']);
@@ -551,6 +569,11 @@ public function import($record, $update_record = true, $add_record = true)
551569

552570
$articolo->save();
553571

572+
// Gestione barcode dopo il salvataggio dell'articolo
573+
if (!empty($barcode_value)) {
574+
$this->processaBarcode($articolo, $barcode_value);
575+
}
576+
554577
$this->aggiornaGiacenza($articolo, $nuova_qta, $nome_sede, $record);
555578

556579
return true;
@@ -803,6 +826,16 @@ protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli)
803826
};
804827

805828
if (!empty($anagrafica) && !empty($dettagli['dir']) && $dettagli['prezzo_listino']) {
829+
// Elimina i prezzi esistenti per questo articolo e anagrafica nella direzione specificata
830+
$deleted_count = DettaglioPrezzo::where('id_articolo', $articolo->id)
831+
->where('id_anagrafica', $anagrafica->id)
832+
->where('dir', $dettagli['dir'])
833+
->delete();
834+
835+
if ($deleted_count > 0) {
836+
error_log("Eliminati {$deleted_count} prezzi esistenti per articolo {$articolo->codice} e anagrafica {$anagrafica->ragione_sociale} (direzione: {$dettagli['dir']})");
837+
}
838+
806839
$dettaglio_predefinito = DettaglioPrezzo::build($articolo, $anagrafica, $dettagli['dir']);
807840
$dettaglio_predefinito->sconto_percentuale = $dettagli['sconto_listino'];
808841
$dettaglio_predefinito->setPrezzoUnitario($dettagli['prezzo_listino']);
@@ -813,14 +846,25 @@ protected function aggiornaDettaglioPrezzi(Articolo $articolo, $dettagli)
813846
}
814847

815848
$dettaglio_predefinito->save();
849+
error_log("Creato nuovo prezzo per articolo {$articolo->codice} e anagrafica {$anagrafica->ragione_sociale}: {$dettagli['prezzo_listino']}");
816850
}
817851

818852
if (!empty($anagrafica) && $dettagli['dir'] == 'uscita' && !empty($dettagli['codice_fornitore']) && !empty($dettagli['descrizione_fornitore'])) {
853+
// Elimina i dettagli fornitore esistenti per questo articolo e fornitore
854+
$deleted_count = DettaglioFornitore::where('id_articolo', $articolo->id)
855+
->where('id_fornitore', $anagrafica->id)
856+
->delete();
857+
858+
if ($deleted_count > 0) {
859+
error_log("Eliminati {$deleted_count} dettagli fornitore esistenti per articolo {$articolo->codice} e fornitore {$anagrafica->ragione_sociale}");
860+
}
861+
819862
$fornitore = DettaglioFornitore::build($anagrafica, $articolo);
820863
$fornitore->codice_fornitore = $dettagli['codice_fornitore'];
821864
$fornitore->barcode_fornitore = $dettagli['barcode_fornitore'];
822865
$fornitore->descrizione = $dettagli['descrizione_fornitore'];
823866
$fornitore->save();
867+
error_log("Creato nuovo dettaglio fornitore per articolo {$articolo->codice} e fornitore {$anagrafica->ragione_sociale}: {$dettagli['codice_fornitore']}");
824868
}
825869

826870
$dettagli['id_fornitore'] = $anagrafica->id;
@@ -942,4 +986,56 @@ protected function processaModello($record, $marca = null)
942986
throw new \Exception('Errore nella creazione/ricerca modello "' . $record['modello'] . '": ' . $e->getMessage());
943987
}
944988
}
989+
990+
/**
991+
* Gestisce l'importazione dei barcode per un articolo.
992+
*
993+
* @param Articolo $articolo
994+
* @param string $barcode_value
995+
*
996+
* @throws \Exception
997+
*/
998+
protected function processaBarcode(Articolo $articolo, $barcode_value)
999+
{
1000+
if (empty($barcode_value)) {
1001+
return;
1002+
}
1003+
1004+
try {
1005+
$database = database();
1006+
1007+
// Supporta barcode multipli separati da virgola
1008+
$barcodes = array_map('trim', explode(',', $barcode_value));
1009+
1010+
foreach ($barcodes as $barcode) {
1011+
if (empty($barcode)) {
1012+
continue;
1013+
}
1014+
1015+
// Verifica che il barcode non sia già presente nella tabella mg_articoli (barcode principali)
1016+
$esistente_articoli = Articolo::where('barcode', $barcode)->count() > 0;
1017+
1018+
// Verifica che il barcode non sia già presente nella tabella mg_articoli_barcode (barcode aggiuntivi)
1019+
$esistente_barcode = $database->table('mg_articoli_barcode')
1020+
->where('barcode', $barcode)
1021+
->count() > 0;
1022+
1023+
// Verifica che il barcode non coincida con un codice articolo esistente
1024+
$coincide_codice = Articolo::where([
1025+
['codice', $barcode],
1026+
['barcode', '=', ''],
1027+
])->count() > 0;
1028+
1029+
// Se il barcode è unico, procede con l'inserimento
1030+
if (!$esistente_articoli && !$esistente_barcode && !$coincide_codice) {
1031+
Barcode::build($articolo->id, $barcode);
1032+
error_log("Barcode aggiunto per articolo {$articolo->codice}: {$barcode}");
1033+
} else {
1034+
error_log("Barcode già esistente o in conflitto per articolo {$articolo->codice}: {$barcode}");
1035+
}
1036+
}
1037+
} catch (\Exception $e) {
1038+
throw new \Exception('Errore durante l\'importazione del barcode "'.$barcode_value.'": '.$e->getMessage());
1039+
}
1040+
}
9451041
}

0 commit comments

Comments
 (0)