feat: Aggiungi supporto per prezzi personalizzati nel listino e modifica la logica di importazione
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user