first(); $esistenti = Opzione::where('gruppo', 'profili_extra')->where('sistema_id', $pvc?->id); if (! $pvc || (clone $esistenti)->whereNotNull('supplemento_tipo')->exists()) { return; } DB::transaction(function () use ($pvc, $esistenti) { // Segnaposto senza prezzo: eliminati uno per uno per rimuovere anche le icone. $esistenti->get()->each->delete(); foreach (self::profili() as $i => $profilo) { if ($profilo['valore'] === '406200') { continue; } $this->crea($pvc, null, $profilo, $i + 1); } foreach ($pvc->modelli()->get() as $modello) { if (in_array($modello->codice, self::ESCLUSI, true)) { continue; } $modello->update(['moduli' => array_values(array_unique([...($modello->moduli ?? []), 'profili_extra']))]); if ($modello->codice === self::CIELINO) { $this->crea($pvc, $modello, collect(self::profili())->firstWhere('valore', '406200'), 1); } } }); } /** * ml = (L x ml_per_larghezza + H x ml_per_altezza + ml_aggiunta_mm) / 1000. * Guide: "H+100mm x 2" -> 2H + 200. Frontale: "solo larghezza (1 pz)" -> L. * Allargamenti NP: "ML" senza misura di riferimento -> perimetro 2L + 2H (da confermare). */ public static function profili(): array { $ml = fn (float $l, float $h, float $mm) => ['ml_per_larghezza' => $l, 'ml_per_altezza' => $h, 'ml_aggiunta_mm' => $mm]; return [ ['valore' => 'coprifili_piatti', 'etichetta' => 'COPRIFILI PIATTI', 'supplemento_tipo' => 'percentuale', 'supplemento' => 1, 'alternativa' => 'coprifili'], ['valore' => 'coprifili_scatolati', 'etichetta' => 'COPRIFILI SCATOLATI', 'supplemento_tipo' => 'percentuale', 'supplemento' => 3, 'alternativa' => 'coprifili'], ['valore' => '50811', 'etichetta' => '50811_GUIDA 34', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 15, 'alternativa' => 'guida'] + $ml(0, 2, 200), ['valore' => '50811_50801', 'etichetta' => '50811+50801_GUIDA 87', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 15, 'alternativa' => 'guida'] + $ml(0, 2, 200), ['valore' => '9320', 'etichetta' => 'HO9320_T/M', 'supplemento_tipo' => 'fisso', 'supplemento' => 85], ['valore' => 'NP8300', 'etichetta' => 'NP8300_ALL.30', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 25, 'alternativa' => 'allargamento'] + $ml(2, 2, 0), ['valore' => 'NP8500', 'etichetta' => 'NP8500_ALL.50', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 33, 'alternativa' => 'allargamento'] + $ml(2, 2, 0), ['valore' => 'NP8700', 'etichetta' => 'NP8700_ALL.150', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 45, 'alternativa' => 'allargamento'] + $ml(2, 2, 0), ['valore' => '406200', 'etichetta' => '4062000_FRONTALE', 'supplemento_tipo' => 'metro_lineare', 'supplemento' => 145] + $ml(1, 0, 0), ]; } private function crea(Sistema $sistema, ?Modello $modello, array $profilo, int $ordine): void { $file = "{$profilo['valore']}.jpg"; $icona = 'configuratore/pvc/opzioni/'.($modello ? $modello->codice : 'sistema').'/profili_extra/'.$file; Storage::disk('public')->put($icona, file_get_contents(self::ICONE."/{$file}")); Opzione::create($profilo + [ 'sistema_id' => $sistema->id, 'modello_id' => $modello?->id, 'gruppo' => 'profili_extra', 'icona' => $icona, 'ordine' => $ordine, ]); } }