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.
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
<?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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user