feat: Aggiungi supporto per prezzi personalizzati nel listino e modifica la logica di importazione

This commit is contained in:
2026-10-19 17:01:18 +02:00
parent 1e352eb2ef
commit 863e6ca920
6 changed files with 117 additions and 8 deletions
@@ -46,17 +46,19 @@ class ListinoImporter
/**
* Sostituisce il listino di ogni modello associato con i prezzi del rispettivo blocco.
* Con $preservaPersonalizzati i prezzi inseriti a mano restano e prevalgono sull'Excel
* per la stessa misura; altrimenti l'Excel sostituisce tutto.
*
* @param list<array{codice: string, prezzi: list<array>}> $blocchi
* @param array<string, int|null> $associazioni codice del file → id modello
* @return int numero di modelli aggiornati
*/
public static function importa(Sistema $sistema, array $blocchi, array $associazioni): int
public static function importa(Sistema $sistema, array $blocchi, array $associazioni, bool $preservaPersonalizzati = false): int
{
$prezziPerCodice = collect($blocchi)->keyBy('codice')->map(fn (array $b) => $b['prezzi']);
$modelli = $sistema->modelli()->get()->keyBy('id');
return DB::transaction(function () use ($associazioni, $prezziPerCodice, $modelli) {
return DB::transaction(function () use ($associazioni, $prezziPerCodice, $modelli, $preservaPersonalizzati) {
$aggiornati = 0;
$ora = now();
@@ -66,10 +68,22 @@ class ListinoImporter
continue;
}
$modello->listino()->delete();
$misura = fn ($p) => (int) $p['larghezza'].'x'.(int) $p['altezza'];
$daEliminare = $modello->listino();
$personalizzate = [];
if ($preservaPersonalizzati) {
$daEliminare->where('personalizzato', false);
$personalizzate = $modello->listino()->where('personalizzato', true)->get()
->mapWithKeys(fn ($p) => [$misura($p) => true])
->all();
}
$daEliminare->delete();
// Una stessa misura ripetuta nel blocco: vale l'ultima.
$righe = collect($prezziPerCodice[$codice])
->keyBy(fn (array $p) => $p['larghezza'].'x'.$p['altezza'])
->keyBy($misura)
->reject(fn (array $p, string $chiave) => isset($personalizzate[$chiave]))
->map(fn (array $p) => $p + ['modello_id' => $modello->id, 'created_at' => $ora, 'updated_at' => $ora])
->values();
foreach ($righe->chunk(500) as $chunk) {