Files
carmine.savino 06617a985a feat: add previous configuration handling for user selections in quotes
- Implemented session storage management for the last configuration choices made by the user.
- Added functionality to prompt users when changing models to retain their previous selections.
- Introduced methods to apply previous choices to the newly loaded model, including finishes, handles, glass types, and options.
- Enhanced user experience by ensuring selections are automatically applied where applicable.
2026-10-19 19:49:44 +02:00

93 lines
4.3 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\Modello;
use App\Models\Opzione;
use App\Models\Sistema;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
/**
* Cerniere a scomparsa, soglia ribassata e motore per modello, dal foglio "Nomi" di
* reference/OrdineSerramenti_Descrizioni_NuoveOpzioni.xlsx. Gira una volta sola: se il
* sistema ha già le opzioni della soglia ribassata non tocca nulla.
*/
class NuoveOpzioniSeeder extends Seeder
{
/** Modelli con cerniere a scomparsa e relativo sovrapprezzo (gli altri: NO). */
private const CERNIERE = [
'finestra_1_anta' => 50, 'finestra_2_ante' => 100, 'finestra_3_ante' => 150, 'finestra_vasistas' => 50,
'portafinestra_1_anta' => 50, 'portafinestra_2_ante' => 100, 'portafinestra_3_ante' => 150,
];
/** Modelli con soglia ribassata e relativo sovrapprezzo. */
private const SOGLIA = [
'portafinestra_1_anta' => 65, 'portafinestra_2_ante' => 105, 'portafinestra_3_ante' => 145,
'scorrevole_sf_2_ante' => 105, 'scorrevole_sf_3_ante' => 145, 'scorrevole_sf_4_ante' => 185,
];
/** Motore: "opzione select motore, togliere maniglia". */
private const MOTORE = ['finestra_vasistas' => 150];
public function run(): void
{
$pvc = Sistema::where('codice', 'pvc')->first();
if (! $pvc || Opzione::where('sistema_id', $pvc->id)->where('gruppo', 'soglia_ribassata')->exists()) {
return;
}
DB::transaction(function () use ($pvc) {
// Prezzo del sistema = il più comune; gli altri modelli hanno il gruppo personalizzato.
$this->siNo($pvc, null, 'cerniere_a_scomparsa', 50, ['categoria' => 'cerniere', 'func' => 'mostraCerniere'], ['categoria' => 'cerniere', 'func' => 'nascondiCerniere']);
$this->siNo($pvc, null, 'soglia_ribassata', 65);
$this->siNo($pvc, null, 'motore', 150, ['categoria' => 'maniglia', 'func' => 'mostraCategoria'], ['categoria' => 'maniglia', 'func' => 'nascondiCategoria']);
foreach ($pvc->modelli()->get() as $modello) {
$moduli = array_values(array_diff($modello->moduli ?? [], ['cerniere']));
foreach (['cerniere' => self::CERNIERE, 'soglia_ribassata' => self::SOGLIA, 'motore' => self::MOTORE] as $modulo => $prezzi) {
if (isset($prezzi[$modello->codice])) {
$moduli[] = $modulo;
}
}
$modello->update(['moduli' => array_values(array_unique($moduli))]);
if ((self::CERNIERE[$modello->codice] ?? 50) !== 50) {
$this->siNo($pvc, $modello, 'cerniere_a_scomparsa', self::CERNIERE[$modello->codice], ['categoria' => 'cerniere', 'func' => 'mostraCerniere'], ['categoria' => 'cerniere', 'func' => 'nascondiCerniere'], sostituisci: true);
}
if ((self::SOGLIA[$modello->codice] ?? 65) !== 65) {
$this->siNo($pvc, $modello, 'soglia_ribassata', self::SOGLIA[$modello->codice]);
}
}
});
}
/** Opzioni NO (senza supplemento) e SI (importo fisso); per il modello sostituiscono il gruppo del sistema. */
private function siNo(Sistema $sistema, ?Modello $modello, string $gruppo, float $prezzo, ?array $parametriNo = null, ?array $parametriSi = null, bool $sostituisci = false): void
{
$esistenti = Opzione::where('sistema_id', $sistema->id)->where('gruppo', $gruppo)->where('modello_id', $modello?->id);
if ($sostituisci) {
$esistenti->delete();
} elseif ($esistenti->exists()) {
// Cerniere del sistema già create dal catalogo iniziale: si aggiorna solo il prezzo.
$esistenti->where('valore', 'si')->update(['supplemento' => $prezzo]);
return;
}
foreach ([['no', 'NO', 0, $parametriNo], ['si', 'SI', $prezzo, $parametriSi]] as $i => [$valore, $etichetta, $supplemento, $parametri]) {
Opzione::create([
'sistema_id' => $sistema->id,
'modello_id' => $modello?->id,
'gruppo' => $gruppo,
'valore' => $valore,
'etichetta' => $etichetta,
'supplemento_tipo' => 'fisso',
'supplemento' => $supplemento,
'parametri' => $parametri,
'ordine' => $i + 1,
]);
}
}
}