'Finitura profilo', 'maniglia' => 'Maniglia e cerniere', ]; /** Lati del serramento su cui la finitura del profilo è disponibile. */ public const LATI = [ 'entrambi' => 'Interno ed esterno', 'interno' => 'Solo interno', 'esterno' => 'Solo esterno', ]; /** Scelta per modello: oltre ai lati, "nessuno" la disattiva nel modello. */ public const LATI_MODELLO = self::LATI + ['nessuno' => 'Disattiva nel modello']; protected static array $immagini = ['anteprima', 'texture', 'texture_bump']; protected $fillable = [ 'sistema_id', 'tipo', 'lato', 'codice', 'descrizione', 'codice_mazzetta', 'colore', 'colore_corpo_base', 'roughness', 'metalness', 'anteprima', 'texture', 'texture_bump', 'bump_scala', 'predefinita', 'ordine', 'attivo', ]; protected $casts = [ 'roughness' => 'float', 'metalness' => 'float', 'bump_scala' => 'float', 'predefinita' => 'boolean', 'ordine' => 'integer', 'attivo' => 'boolean', ]; public function sistema(): BelongsTo { return $this->belongsTo(Sistema::class); } public function scopeAttive(Builder $query): Builder { return $query->where('attivo', true)->orderBy('ordine')->orderBy('id'); } /** * Finiture del profilo disponibili nel modello, ciascuna con `lato_modello` * (entrambi | interno | esterno). La scelta del modello, se c'è, vince su attivazione * e lato del sistema: può anche attivare una finitura disattiva nel sistema. * * @return Collection */ public static function delProfiloPerModello(Modello $modello): Collection { $scelte = DB::table('finiture_modelli')->where('modello_id', $modello->getKey())->pluck('lato', 'finitura_id'); return static::query() ->where('sistema_id', $modello->sistema_id) ->where('tipo', 'profilo') ->orderBy('ordine') ->orderBy('id') ->get() ->each(fn (Finitura $f) => $f->lato_modello = $scelte[$f->id] ?? ($f->attivo ? $f->lato : 'nessuno')) ->reject(fn (Finitura $f) => $f->lato_modello === 'nessuno') ->values(); } public function disponibileSu(string $lato): bool { return in_array($this->lato_modello ?? $this->lato, ['entrambi', $lato], true); } protected static function booted(): void { // Un solo elemento predefinito per sistema e tipo. static::saved(function (self $record): void { if ($record->predefinita && ($record->wasRecentlyCreated || $record->wasChanged('predefinita'))) { static::query() ->where('sistema_id', $record->sistema_id)->where('tipo', $record->tipo) ->whereKeyNot($record->getKey()) ->update(['predefinita' => false]); } }); } }