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); if ($part->unit_id) { $set('unit_id', $part->unit_id); } else { $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\Select::make('unit_id')->label(__('UM'))->options(\App\Models\Tenant\Unit::forSelect())->searchable()->default(fn () => \App\Models\Tenant\Unit::where('code','buc')->value('id')), 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_id')->label(__('UM'))->getStateUsing(fn ($record) => $record->unitLabel()), Tables\Columns\TextColumn::make('buy_price')->money('MDL')->alignRight(), Tables\Columns\TextColumn::make('total')->money('MDL')->alignRight(), ]) ->headerActions([ Actions\CreateAction::make() ->label(__('Adaugă articol')) ->modalHeading(__('Adaugă articol în comandă')), ]) ->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->unitLabel() ?: '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(), ]); } }