whereNotIn('status', ['done', 'returned', 'cancelled'])->count(); return $open > 0 ? (string) $open : null; } public static function form(Schema $schema): Schema { return $schema->components([ Schemas\Components\Section::make('Lucrare') ->columns(2) ->schema([ Forms\Components\TextInput::make('number')->label('Nr.')->disabled()->dehydrated(false)->placeholder('Generat automat'), Forms\Components\Select::make('status')->options(SubcontractJob::STATUSES)->default('sent')->required(), Forms\Components\Select::make('subcontractor_id') ->label('Subcontractor') ->options(fn () => Subcontractor::where('is_active', true)->pluck('name', 'id')) ->searchable(), Forms\Components\Select::make('work_order_id') ->label('Fișă asociată') ->options(fn () => WorkOrder::whereNotIn('status', ['done', 'cancelled']) ->get()->mapWithKeys(fn ($w) => [$w->id => "#{$w->number} · " . ($w->vehicle?->plate ?? '')])->toArray()) ->searchable(), Forms\Components\Select::make('category') ->label('Categorie') ->options(array_combine(Subcontractor::SPECIALTIES, Subcontractor::SPECIALTIES)) ->searchable(), Forms\Components\Textarea::make('description')->label('Descriere')->rows(2)->columnSpanFull(), ]), Schemas\Components\Section::make('Cost & marjă') ->columns(3) ->schema([ Forms\Components\TextInput::make('cost')->label('Cost (de la terț)')->numeric()->default(0)->required(), Forms\Components\TextInput::make('markup_pct')->label('Markup %')->numeric()->default(0) ->helperText('> 0 calculează automat prețul client.'), Forms\Components\TextInput::make('client_price')->label('Preț client')->numeric()->default(0) ->helperText('Setat manual dacă markup = 0.'), Forms\Components\Toggle::make('paid_to_sub')->label('Plătit către terț'), ]), Schemas\Components\Section::make('Termene') ->columns(3) ->schema([ Forms\Components\DatePicker::make('sent_at')->label('Trimis')->default(today()), Forms\Components\DatePicker::make('eta')->label('ETA'), Forms\Components\DatePicker::make('returned_at')->label('Returnat'), Forms\Components\Textarea::make('notes')->label('Observații')->columnSpanFull()->rows(2), ]), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('number')->label('Nr.')->searchable()->sortable(), Tables\Columns\TextColumn::make('subcontractor.name')->label('Terț')->placeholder('—'), Tables\Columns\TextColumn::make('category')->badge()->placeholder('—'), Tables\Columns\TextColumn::make('workOrder.number')->label('Fișă')->placeholder('—'), Tables\Columns\TextColumn::make('cost')->label('Cost')->money('MDL')->alignRight(), Tables\Columns\TextColumn::make('client_price')->label('Preț client')->money('MDL')->alignRight(), Tables\Columns\TextColumn::make('margin') ->label('Marjă') ->state(fn (SubcontractJob $r) => $r->margin()) ->money('MDL') ->alignRight() ->color(fn ($state) => (float) $state > 0 ? 'success' : ((float) $state < 0 ? 'danger' : 'gray')), Tables\Columns\TextColumn::make('status') ->formatStateUsing(fn ($s) => SubcontractJob::STATUSES[$s] ?? $s) ->badge() ->colors([ 'warning' => ['sent', 'in_progress'], 'success' => ['done', 'returned'], 'danger' => ['cancelled'], ]), Tables\Columns\IconColumn::make('paid_to_sub')->label('Plătit terț')->boolean()->toggleable(), ]) ->filters([ Tables\Filters\SelectFilter::make('status')->options(SubcontractJob::STATUSES), Tables\Filters\SelectFilter::make('subcontractor_id') ->label('Subcontractor') ->options(fn () => Subcontractor::pluck('name', 'id')), ]) ->actions([ Actions\EditAction::make(), Actions\DeleteAction::make(), ]) ->emptyStateHeading('Nicio lucrare la terți') ->emptyStateDescription('Înregistrează lucrările trimise la ateliere externe (turbo, cutii, vopsitorie). Costul terțului + markup intră automat în totalul fișei asociate.') ->emptyStateIcon('heroicon-o-arrow-top-right-on-square') ->defaultSort('created_at', 'desc'); } public static function getPages(): array { return [ 'index' => Pages\ListSubcontractJobs::route('/'), 'create' => Pages\CreateSubcontractJob::route('/create'), 'edit' => Pages\EditSubcontractJob::route('/{record}/edit'), ]; } }