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, ]); } } }