diff --git a/app/Filament/User/Resources/ProductResource/RelationManagers/BatchesRelationManager.php b/app/Filament/User/Resources/ProductResource/RelationManagers/BatchesRelationManager.php index 9d8dcc5..1cf5066 100644 --- a/app/Filament/User/Resources/ProductResource/RelationManagers/BatchesRelationManager.php +++ b/app/Filament/User/Resources/ProductResource/RelationManagers/BatchesRelationManager.php @@ -3,6 +3,8 @@ namespace App\Filament\User\Resources\ProductResource\RelationManagers; use App\Models\ProductSize; +use App\Models\Recipe; +use App\Models\Spice; use Filament\Forms; use Filament\Forms\Form; use Filament\Forms\Get; @@ -39,10 +41,31 @@ class BatchesRelationManager extends RelationManager Forms\Components\Select::make('recipe_id') ->label('Rezeptur') - ->relationship('recipe', 'name') - ->searchable() - ->preload() - ->required(), + ->options(fn () => Recipe::where('product_id', $this->getOwnerRecord()->id) + ->orderByDesc('version') + ->get() + ->mapWithKeys(fn ($r) => [$r->id => 'v' . $r->version . ' · ' . $r->created_at->format('d.m.Y')]) + ) + ->default(fn () => $this->getOwnerRecord()->recipes_id) + ->required() + ->live() + ->afterStateUpdated(function ($state, $set) { + if (! $state) { + $set('origins', []); + return; + } + $recipe = Recipe::with('spices')->find($state); + if (! $recipe) { + return; + } + $set('origins', $recipe->spices->map(fn ($s) => [ + 'spice_id' => $s->id, + 'supplier_id' => null, + 'origin_country' => null, + 'farmer' => null, + 'notes' => null, + ])->toArray()); + }), Forms\Components\TextInput::make('units_produced') ->label('Anzahl Einheiten') @@ -53,12 +76,12 @@ class BatchesRelationManager extends RelationManager Forms\Components\Placeholder::make('quantity_g_preview') ->label('Gesamtgewicht (berechnet)') ->content(function (Get $get): HtmlString { - $units = (int) $get('units_produced'); + $units = (int) $get('units_produced'); $sizeId = $get('size_id'); if (! $units || ! $sizeId) { return new HtmlString('—'); } - $size = ProductSize::with('packing')->find($sizeId); + $size = ProductSize::with('packing')->find($sizeId); $totalG = $units * ($size?->packing?->size ?? 0); return new HtmlString("{$totalG} g ({$units} × {$size?->packing?->size}g)"); }), @@ -70,15 +93,36 @@ class BatchesRelationManager extends RelationManager ->label('Mindesthaltbarkeitsdatum'), Forms\Components\Repeater::make('origins') - ->label('Herkunft der Gewürze') + ->label('Herkunft der Rohstoffe') ->relationship() + ->afterStateHydrated(function ($component, $record, $livewire) { + // Pre-fill from product's current recipe only when creating a new batch + if ($record?->id) { + return; + } + $recipeId = $livewire->getOwnerRecord()->recipes_id; + if (! $recipeId) { + return; + } + $recipe = Recipe::with('spices')->find($recipeId); + if (! $recipe) { + return; + } + $component->state($recipe->spices->map(fn ($s) => [ + 'spice_id' => $s->id, + 'supplier_id' => null, + 'origin_country' => null, + 'farmer' => null, + 'notes' => null, + ])->toArray()); + }) ->schema([ - Forms\Components\Select::make('spice_id') - ->label('Gewürz') - ->relationship('spice', 'name') - ->searchable() - ->preload() - ->required(), + Forms\Components\Hidden::make('spice_id'), + Forms\Components\Placeholder::make('spice_name') + ->label('Rohstoff') + ->content(fn (Get $get): string => + Spice::find($get('spice_id'))?->name ?? '—' + ), Forms\Components\Select::make('supplier_id') ->label('Lieferant') @@ -96,12 +140,12 @@ class BatchesRelationManager extends RelationManager ->maxLength(255), Forms\Components\Textarea::make('notes') - ->label('Infos zum Gewürz') + ->label('Notizen') ->rows(2) ->columnSpanFull(), ]) ->columns(2) - ->addActionLabel('Gewürz hinzufügen') + ->addActionLabel('Rohstoff hinzufügen') ->columnSpanFull(), ]); } @@ -118,10 +162,13 @@ class BatchesRelationManager extends RelationManager Tables\Columns\TextColumn::make('units_produced') ->label('Einheiten') - ->suffix(fn ($record) => $record->quantity_g ? ' (' . number_format($record->quantity_g, 0, ',', '.') . 'g)' : ''), + ->suffix(fn ($record) => $record->quantity_g + ? ' (' . number_format($record->quantity_g, 0, ',', '.') . 'g)' + : ''), - Tables\Columns\TextColumn::make('recipe.name') - ->label('Rezeptur'), + Tables\Columns\TextColumn::make('recipe.version') + ->label('Rezeptur') + ->formatStateUsing(fn ($state) => $state ? 'v' . $state : '—'), Tables\Columns\TextColumn::make('produced_at') ->label('Produktion')