From 352f2a0aac65f1c337e35422a0096178269864f4 Mon Sep 17 00:00:00 2001 From: Malek Tellissi Date: Sat, 12 Sep 2026 21:16:52 +0200 Subject: [PATCH] =?UTF-8?q?Remove=20standalone=20BatchResource=20=E2=80=94?= =?UTF-8?q?=20chargen=20managed=20via=20product=20relation=20manager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- app/Filament/User/Resources/BatchResource.php | 256 ------------------ .../BatchResource/Pages/CreateBatch.php | 11 - .../BatchResource/Pages/EditBatch.php | 17 -- .../BatchResource/Pages/ListBatches.php | 17 -- ..._230000_add_article_number_to_products.php | 22 ++ 5 files changed, 22 insertions(+), 301 deletions(-) delete mode 100644 app/Filament/User/Resources/BatchResource.php delete mode 100644 app/Filament/User/Resources/BatchResource/Pages/CreateBatch.php delete mode 100644 app/Filament/User/Resources/BatchResource/Pages/EditBatch.php delete mode 100644 app/Filament/User/Resources/BatchResource/Pages/ListBatches.php create mode 100644 database/migrations/2026_09_12_230000_add_article_number_to_products.php diff --git a/app/Filament/User/Resources/BatchResource.php b/app/Filament/User/Resources/BatchResource.php deleted file mode 100644 index 150c2ac..0000000 --- a/app/Filament/User/Resources/BatchResource.php +++ /dev/null @@ -1,256 +0,0 @@ -schema([ - Forms\Components\Section::make('Charge')->schema([ - Forms\Components\Select::make('product_id') - ->label('Produkt') - ->relationship('product', 'title') - ->searchable() - ->preload() - ->required() - ->live() - ->afterStateUpdated(function ($state, $set, $get) { - $set('size_id', null); - $set('recipe_id', null); - $set('origins', []); - if (! $state) { - return; - } - $product = Product::find($state); - if ($product?->recipes_id) { - $set('recipe_id', $product->recipes_id); - $recipe = Recipe::with('spices')->find($product->recipes_id); - if ($recipe) { - $set('origins', $recipe->spices->map(fn ($s) => [ - 'spice_id' => $s->id, - 'entries' => [['supplier_id' => null, 'origin_country' => null, 'farmer_id' => null, 'notes' => null]], - ])->toArray()); - } - } - $suffix = $get('lot_suffix'); - if ($suffix && $product?->lot_prefix) { - $set('lot_number', $product->lot_prefix . '-' . $suffix); - } - }), - - Forms\Components\TextInput::make('lot_suffix') - ->label('LOT-Nummer') - ->prefix(fn (Get $get): ?string => Product::find($get('product_id'))?->lot_prefix - ? Product::find($get('product_id'))->lot_prefix . ' -' - : null - ) - ->placeholder('JJMMTT') - ->maxLength(50) - ->required() - ->dehydrated(false) - ->live(onBlur: true) - ->afterStateHydrated(function ($component, $record) { - if (! $record?->lot_number) return; - $pos = strrpos($record->lot_number, '-'); - $component->state($pos !== false - ? substr($record->lot_number, $pos + 1) - : $record->lot_number - ); - }) - ->afterStateUpdated(function ($state, $set, $get) { - $product = Product::find($get('product_id')); - $set('lot_number', $product?->lot_prefix - ? $product->lot_prefix . '-' . $state - : $state - ); - }), - - Forms\Components\Hidden::make('lot_number'), - - Forms\Components\Select::make('size_id') - ->label('Variante (Verpackung)') - ->options(fn (Get $get) => ProductSize::with('packing') - ->where('product_id', $get('product_id')) - ->get() - ->mapWithKeys(fn ($s) => [$s->id => $s->packing->name . ' ' . $s->packing->size . 'g']) - ) - ->required() - ->live(), - - Forms\Components\Select::make('recipe_id') - ->label('Rezeptur') - ->options(fn (Get $get) => Recipe::where('product_id', $get('product_id') ?? 0) - ->orderByDesc('version') - ->get() - ->mapWithKeys(fn ($r) => [$r->id => 'v' . $r->version . ' · ' . $r->created_at->format('d.m.Y')]) - ) - ->required() - ->live() - ->afterStateUpdated(function ($state, $set, $get) { - if (! $state) { - $set('origins', []); - return; - } - $recipe = Recipe::with('spices')->find($state); - if ($recipe) { - $existing = collect($get('origins') ?? [])->keyBy('spice_id'); - $set('origins', $recipe->spices->map(fn ($s) => $existing->has($s->id) - ? $existing[$s->id] - : ['spice_id' => $s->id, 'entries' => [['supplier_id' => null, 'origin_country' => null, 'farmer_id' => null, 'notes' => null]]] - )->toArray()); - } - }), - - Forms\Components\TextInput::make('units_produced') - ->label('Anzahl Einheiten') - ->numeric() - ->required() - ->live(debounce: 400), - - Forms\Components\Placeholder::make('quantity_g_preview') - ->label('Gesamtgewicht (berechnet)') - ->content(function (Get $get): HtmlString { - $units = (int) $get('units_produced'); - $sizeId = $get('size_id'); - if (! $units || ! $sizeId) { - return new HtmlString('—'); - } - $size = ProductSize::with('packing')->find($sizeId); - $totalG = $units * ($size?->packing?->size ?? 0); - return new HtmlString("{$totalG} g ({$units} × {$size?->packing?->size}g)"); - }), - - Forms\Components\DatePicker::make('produced_at') - ->label('Produktionsdatum'), - - Forms\Components\DatePicker::make('expires_at') - ->label('Mindesthaltbarkeitsdatum'), - ])->columns(2), - - Forms\Components\Section::make('Herkunft der Rohstoffe')->schema([ - Forms\Components\Repeater::make('origins') - ->label('') - ->relationship() - ->schema([ - 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 ?? '—' - ) - ->columnSpanFull(), - - Forms\Components\Repeater::make('entries') - ->label('Herkunftsangaben') - ->relationship() - ->schema([ - Forms\Components\Select::make('supplier_id') - ->label('Lieferant') - ->options(fn () => \App\Models\Supplier::orderBy('name')->pluck('name', 'id')) - ->searchable() - ->createOptionForm([ - Forms\Components\TextInput::make('name')->label('Name')->required(), - ]) - ->createOptionUsing(fn ($data) => \App\Models\Supplier::create($data)->id) - ->nullable(), - - Forms\Components\TextInput::make('origin_country') - ->label('Herkunftsland') - ->maxLength(100), - - Forms\Components\Select::make('farmer_id') - ->label('Landwirt') - ->options(fn () => Farmer::orderBy('name')->pluck('name', 'id')) - ->searchable() - ->createOptionForm([ - Forms\Components\TextInput::make('name')->label('Name')->required(), - ]) - ->createOptionUsing(fn ($data) => Farmer::create($data)->id) - ->nullable(), - - Forms\Components\Textarea::make('notes') - ->label('Notizen') - ->rows(2) - ->columnSpanFull(), - ]) - ->columns(3) - ->addActionLabel('Eintrag hinzufügen') - ->reorderable(false) - ->columnSpanFull(), - ]) - ->reorderable(false), - ]), - ]); - } - - public static function table(Table $table): Table - { - return $table - ->columns([ - Tables\Columns\TextColumn::make('lot_number') - ->label('LOT-Nummer') - ->searchable() - ->sortable(), - - Tables\Columns\TextColumn::make('product.title') - ->label('Produkt') - ->searchable(), - - Tables\Columns\TextColumn::make('recipe.name') - ->label('Rezeptur'), - - Tables\Columns\TextColumn::make('produced_at') - ->label('Produktion') - ->date('d.m.Y') - ->sortable(), - - Tables\Columns\TextColumn::make('expires_at') - ->label('MHD') - ->date('d.m.Y') - ->sortable(), - ]) - ->defaultSort('produced_at', 'desc') - ->filters([ - Tables\Filters\SelectFilter::make('product') - ->relationship('product', 'title') - ->label('Produkt'), - ]) - ->actions([ - Tables\Actions\EditAction::make(), - Tables\Actions\DeleteAction::make(), - ]); - } - - public static function getPages(): array - { - return [ - 'index' => Pages\ListBatches::route('/'), - 'create' => Pages\CreateBatch::route('/create'), - 'edit' => Pages\EditBatch::route('/{record}/edit'), - ]; - } -} diff --git a/app/Filament/User/Resources/BatchResource/Pages/CreateBatch.php b/app/Filament/User/Resources/BatchResource/Pages/CreateBatch.php deleted file mode 100644 index d3866ee..0000000 --- a/app/Filament/User/Resources/BatchResource/Pages/CreateBatch.php +++ /dev/null @@ -1,11 +0,0 @@ -string('article_number')->nullable()->unique()->after('title'); + }); + } + + public function down(): void + { + Schema::table('products', function (Blueprint $table) { + $table->dropColumn('article_number'); + }); + } +};