'Kanban WO', 'reports' => 'Rapoarte avansate', 'ai' => 'Asistent AI', 'pdf' => 'Generare PDF', 'reverb' => 'WebSocket real-time', 'api' => 'REST API + tokens', 'multi_user' => 'Multi-user (>1 cont)', 'white_label' => 'White-label complet', 'priority_support' => 'Suport prioritar', 'custom_domain' => 'Domeniu propriu', ]; public static function form(Schema $schema): Schema { return $schema->components([ Schemas\Components\Section::make(__('Identificare')) ->columns(2) ->schema([ Forms\Components\TextInput::make('slug') ->required()->alphaDash()->unique(ignoreRecord: true) ->dehydrateStateUsing(fn ($s) => strtolower((string) $s)) ->extraInputAttributes(['style' => 'text-transform:lowercase']), Forms\Components\TextInput::make('name')->required()->maxLength(60), Forms\Components\Toggle::make('is_active')->label(__('Activ'))->default(true), Forms\Components\Toggle::make('is_public')->label(__('Public (afișat la signup)'))->default(true), Forms\Components\Toggle::make('is_demo') ->label(__('Demo (pentru demonstrații sales)')) ->helperText(__('Plan ascuns public, folosit pentru tenant-i demo cu features deblocate.')) ->default(false), Forms\Components\TextInput::make('trial_days') ->label(__('Perioadă trial (zile)')) ->numeric()->placeholder(__('null = fără trial')) ->helperText(__('Numărul de zile gratis după ce un tenant alege acest plan.')), ]), Schemas\Components\Section::make(__('Preț')) ->columns(3) ->schema([ Forms\Components\TextInput::make('price_monthly')->label(__('Preț lunar'))->numeric()->required()->suffix(fn (Get $get) => $get('currency') ?? 'MDL'), Forms\Components\TextInput::make('price_yearly')->label(__('Preț anual'))->numeric()->helperText(__('De obicei 10× preț lunar (2 luni gratis).'))->suffix(fn (Get $get) => $get('currency') ?? 'MDL'), Forms\Components\Select::make('currency')->options(['MDL' => 'MDL', 'EUR' => 'EUR', 'USD' => 'USD'])->default('MDL'), ]), Schemas\Components\Section::make(__('Funcționalități incluse')) ->columns(2) ->schema([ Forms\Components\CheckboxList::make('features') ->options(self::FEATURE_OPTIONS) ->columns(2) ->columnSpanFull(), ]), Schemas\Components\Section::make(__('Limite')) ->columns(3) ->schema([ Forms\Components\TextInput::make('limits.max_users')->label(__('Max useri'))->numeric()->placeholder('∞'), Forms\Components\TextInput::make('limits.max_clients')->label(__('Max clienți'))->numeric()->placeholder('∞'), Forms\Components\TextInput::make('limits.max_vehicles')->label(__('Max mașini'))->numeric()->placeholder('∞'), Forms\Components\TextInput::make('limits.max_work_orders_month')->label(__('Max fișe/lună'))->numeric()->placeholder('∞'), Forms\Components\TextInput::make('limits.storage_mb')->label(__('Storage (MB)'))->numeric()->placeholder('∞'), Forms\Components\TextInput::make('limits.ai_messages_month')->label(__('Mesaje AI/lună'))->numeric()->placeholder('∞'), ]), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('name') ->searchable()->sortable() ->weight('bold') ->description(fn ($record) => $record->is_demo ? '🎬 Demo' : ($record->trial_days ? "🎁 {$record->trial_days} zile trial" : null)), Tables\Columns\TextColumn::make('price_monthly') ->money(fn ($record) => $record->currency) ->label(__('Lunar')) ->sortable(), Tables\Columns\TextColumn::make('price_yearly') ->money(fn ($record) => $record->currency) ->label(__('Anual')), Tables\Columns\TextColumn::make('companies_count') ->counts('companies') ->label(__('Abonați')) ->badge() ->color('primary'), Tables\Columns\TextColumn::make('features') ->label(__('Funcționalități')) ->formatStateUsing(fn ($s) => is_array($s) ? count($s) . ' incluse' : '—') ->badge(), Tables\Columns\IconColumn::make('is_active')->boolean()->label(__('Activ')), Tables\Columns\IconColumn::make('is_public')->boolean()->label(__('Public')), ]) ->actions([ Actions\EditAction::make(), Actions\DeleteAction::make(), ]) ->emptyStateHeading(__('Niciun plan definit')) ->emptyStateDescription(__('Creează planuri (ex: Free, Basic, Pro) și atribuie-le companiilor.')) ->defaultSort('price_monthly'); } public static function getPages(): array { return [ 'index' => Pages\ListPlans::route('/'), 'create' => Pages\CreatePlan::route('/create'), 'edit' => Pages\EditPlan::route('/{record}/edit'), ]; } }