schema([
Forms\Components\Section::make()
->columns(2)
->schema([
CampiConfiguratore::sistema(),
Forms\Components\TextInput::make('codice')
->label('Codice')
->helperText('Es. F2, TR_A_F.')
->required()
->maxLength(50)
->unique(
ignoreRecord: true,
modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('sistema_id', $get('sistema_id')),
),
Forms\Components\TextInput::make('descrizione')->label('Tipologia')->required()->maxLength(255)->columnSpanFull(),
]),
Forms\Components\Section::make('Lastre')
->description('Per ogni riga: larghezza vetro LV = (L − detrazione) ÷ divisore, altezza vetro HV = H − detrazione, ripetuta per la quantità. Es. L/2 − 181 si scrive detrazione 362, divisore 2.')
->schema([
Forms\Components\Repeater::make('lastre')
->hiddenLabel()
->columns(5)
->minItems(1)
->defaultItems(1)
->reorderable(false)
->live(onBlur: true)
->schema([
Forms\Components\TextInput::make('descrizione')->label('Descrizione')->placeholder('es. Vetro anta')->maxLength(100),
Forms\Components\TextInput::make('quantita')->label('Quantità')->integer()->minValue(1)->default(1)->required(),
Forms\Components\TextInput::make('divisore')->label('Divisore L')->integer()->minValue(1)->default(1)->required(),
Forms\Components\TextInput::make('detrazione_larghezza')->label('Detrazione L (mm)')->numeric()->default(0)->required(),
Forms\Components\TextInput::make('detrazione_altezza')->label('Detrazione H (mm)')->numeric()->default(0)->required(),
]),
]),
Forms\Components\Section::make('Prova')
->description('Verifica la regola su una misura: non viene salvata.')
->columns(3)
->collapsible()
->schema([
Forms\Components\TextInput::make('prova_larghezza')->label('Larghezza L (mm)')->integer()->default(1200)->dehydrated(false)->live(onBlur: true),
Forms\Components\TextInput::make('prova_altezza')->label('Altezza H (mm)')->integer()->default(1400)->dehydrated(false)->live(onBlur: true),
Forms\Components\Placeholder::make('prova_risultato')
->label('Lastre risultanti')
->content(fn (Get $get) => self::anteprima($get('lastre') ?? [], (float) $get('prova_larghezza'), (float) $get('prova_altezza'))),
]),
Forms\Components\Textarea::make('note')->label('Note')->rows(2)->columnSpanFull(),
]);
}
public static function table(Table $table): Table
{
return $table
->defaultSort('codice')
->columns([
Tables\Columns\TextColumn::make('codice')->label('Codice')->searchable()->sortable(),
Tables\Columns\TextColumn::make('descrizione')->label('Tipologia')->searchable()->wrap(),
Tables\Columns\TextColumn::make('lastre')
->label('Formula')
->state(fn (RegolaVetro $record) => self::formula($record->lastre ?? []))
->html(),
Tables\Columns\TextColumn::make('modelli_count')->label('Modelli')->counts('modelli'),
])
->filters([
Tables\Filters\SelectFilter::make('sistema')->label('Sistema')->relationship('sistema', 'nome'),
])
->actions([
Tables\Actions\EditAction::make()->iconButton(),
Tables\Actions\DeleteAction::make()
->iconButton()
->modalDescription('I modelli che usano questa regola non avranno più variazione di prezzo per il vetro.'),
]);
}
public static function getPages(): array
{
return [
'index' => Pages\ManageRegoleVetro::route('/'),
];
}
/** Formula leggibile, una riga per lastra (es. "2 × (L − 312) ÷ 2 × (H − 189)"). */
private static function formula(array $lastre): HtmlString
{
$righe = array_map(function (array $l) {
$larghezza = 'L'.self::meno($l['detrazione_larghezza'] ?? 0);
if ((int) ($l['divisore'] ?? 1) > 1) {
$larghezza = "({$larghezza}) ÷ {$l['divisore']}";
}
$descrizione = filled($l['descrizione'] ?? null) ? e($l['descrizione']).': ' : '';
return $descrizione.((int) ($l['quantita'] ?? 1)).' × '.$larghezza.' × (H'.self::meno($l['detrazione_altezza'] ?? 0).')';
}, $lastre);
return new HtmlString(implode('
', $righe));
}
private static function meno(mixed $detrazione): string
{
return (float) $detrazione ? ' − '.(float) $detrazione : '';
}
private static function anteprima(array $lastre, float $larghezza, float $altezza): HtmlString
{
if ($larghezza <= 0 || $altezza <= 0 || ! $lastre) {
return new HtmlString('—');
}
$calcolate = (new RegolaVetro(['lastre' => array_values($lastre)]))->calcolaLastre($larghezza, $altezza);
return new HtmlString(implode('
', array_map(fn (array $l) => sprintf(
'%s%d × %s × %s mm = %s m² cad.',
filled($l['descrizione']) ? e($l['descrizione']).': ' : '',
$l['quantita'],
number_format($l['larghezza'], 1, ',', '.'),
number_format($l['altezza'], 1, ',', '.'),
number_format(max(0, $l['larghezza']) * max(0, $l['altezza']) / 1_000_000, 3, ',', '.'),
), $calcolate)));
}
}