components([ Forms\Components\Select::make('part_id') ->label('Piesă din catalog') ->options(fn () => Part::where('is_active', true) ->get() ->mapWithKeys(fn ($p) => [$p->id => "{$p->name} " . ($p->article ? "[{$p->article}]" : '')]) ->toArray()) ->searchable() ->live() ->afterStateUpdated(function ($state, Set $set) { if ($state && $part = Part::find($state)) { $set('name', $part->name); $set('article', $part->article); $set('unit', $part->unit); $set('buy_price', $part->buy_price); } }) ->columnSpanFull(), Forms\Components\TextInput::make('name')->label('Denumire')->required()->columnSpanFull(), Forms\Components\TextInput::make('article')->label('Cod articol'), Forms\Components\TextInput::make('qty')->label('Cantitate')->numeric()->default(1)->required(), Forms\Components\TextInput::make('unit')->label('UM')->default('buc'), Forms\Components\TextInput::make('buy_price')->label('Preț achiziție')->numeric()->required(), ]); } public function table(Table $table): Table { return $table ->recordTitleAttribute('name') ->columns([ Tables\Columns\TextColumn::make('name')->wrap(), Tables\Columns\TextColumn::make('article')->placeholder('—'), Tables\Columns\TextColumn::make('qty')->label('Comandat')->alignRight(), Tables\Columns\TextColumn::make('qty_received') ->label('Recepționat') ->alignRight() ->color(fn ($state, $record) => $record->isFullyReceived() ? 'success' : ((float) $state > 0 ? 'warning' : 'gray')) ->formatStateUsing(fn ($state, $record) => sprintf('%.2f / %.2f', (float) $state, (float) $record->qty)), Tables\Columns\TextColumn::make('unit')->label('UM'), Tables\Columns\TextColumn::make('buy_price')->money('MDL')->alignRight(), Tables\Columns\TextColumn::make('total')->money('MDL')->alignRight(), ]) ->headerActions([ Actions\CreateAction::make(), ]) ->actions([ Actions\Action::make('receive_item') ->label('Recepționează') ->icon('heroicon-m-arrow-down-tray') ->color('success') ->visible(fn (PurchaseItem $r) => ! $r->isFullyReceived()) ->schema([ Forms\Components\Placeholder::make('outstanding') ->label('Restanță') ->content(fn (PurchaseItem $r) => sprintf('%.2f %s', $r->outstanding(), $r->unit ?? 'buc')), Forms\Components\TextInput::make('qty') ->label('Cantitate recepționată') ->numeric() ->required() ->minValue(0.001) ->default(fn (PurchaseItem $r) => $r->outstanding()), Forms\Components\Select::make('warehouse_id') ->label('Depozit țintă') ->options(fn () => Warehouse::where('is_active', true)->pluck('name', 'id')) ->default(fn (PurchaseItem $r) => $r->purchase?->warehouse_id ?? Warehouse::where('is_default', true)->value('id')) ->required(), ]) ->action(function (PurchaseItem $r, array $data) { $wh = $data['warehouse_id'] ? Warehouse::find($data['warehouse_id']) : null; try { $r->purchase->receiveItem($r, (float) $data['qty'], $wh); Notification::make() ->title('Recepționat — batch creat') ->success() ->send(); } catch (\Throwable $e) { Notification::make() ->title('Eroare la recepție') ->body($e->getMessage()) ->danger() ->send(); } }), Actions\EditAction::make(), Actions\DeleteAction::make(), ]); } }