components([ Section::make(__('admin.tenants.sections.profile')) ->columns(3) ->schema([ TextEntry::make('name')->label(__('admin.tenants.fields.name')), TextEntry::make('slug')->label(__('admin.tenants.fields.slug')), TextEntry::make('contact_email')->label(__('admin.tenants.fields.contact_email')), TextEntry::make('user.full_name') ->label(__('admin.tenants.fields.owner')) ->state(fn (Tenant $record) => $record->user?->full_name ?? '—'), TextEntry::make('paddle_customer_id') ->label('Paddle Customer ID') ->placeholder('—'), TextEntry::make('total_revenue') ->label(__('admin.tenants.fields.total_revenue')) ->money('EUR'), TextEntry::make('active_reseller_package_id') ->label(__('admin.tenants.fields.active_reseller_package')) ->state(fn (Tenant $record) => $record->activeResellerPackage?->name ?? '—'), TextEntry::make('remaining_events') ->label(__('admin.tenants.fields.remaining_events')) ->state(fn (Tenant $record) => $record->activeResellerPackage?->remaining_events ?? 0), TextEntry::make('package_expires_at') ->label(__('admin.tenants.fields.package_expires_at')) ->state(fn (Tenant $record) => $record->activeResellerPackage?->expires_at) ->dateTime(), ]), Section::make(__('admin.tenants.sections.lifecycle')) ->columns(3) ->schema([ IconEntry::make('is_active') ->label(__('admin.tenants.fields.is_active')) ->boolean(), IconEntry::make('is_suspended') ->label(__('admin.tenants.fields.is_suspended')) ->boolean(), TextEntry::make('subscription_expires_at') ->label(__('admin.tenants.fields.subscription_expires_at')) ->dateTime() ->placeholder('—'), TextEntry::make('pending_deletion_at') ->label(__('admin.tenants.fields.pending_deletion_at')) ->dateTime() ->placeholder('—'), TextEntry::make('deletion_warning_sent_at') ->label(__('admin.tenants.fields.deletion_warning_sent_at')) ->dateTime() ->placeholder('—'), TextEntry::make('anonymized_at') ->label(__('admin.tenants.fields.anonymized_at')) ->dateTime() ->placeholder('—'), ]), Section::make(__('admin.tenants.sections.timeline')) ->schema([ RepeatableEntry::make('lifecycle_timeline') ->label(__('admin.tenants.sections.timeline')) ->state(fn (Tenant $record) => static::buildTimeline($record)) ->schema([ TextEntry::make('title') ->label(__('admin.tenants.timeline.title')) ->columnSpanFull(), TextEntry::make('details') ->label(__('admin.tenants.timeline.details')) ->columnSpanFull() ->placeholder('—'), TextEntry::make('tone') ->label(__('admin.tenants.timeline.status')) ->badge() ->color(fn (?string $state) => $state ?? 'gray') ->formatStateUsing(fn (?string $state) => $state ? __('admin.tenants.timeline.tone.'.$state) : __('admin.tenants.timeline.tone.muted')), TextEntry::make('occurred_at') ->label(__('admin.tenants.timeline.occurred_at')) ->dateTime(), ]) ->columns(2), ]), ]); } private static function buildTimeline(Tenant $tenant): array { $events = [ static::timelineEntry( __('admin.tenants.timeline.created'), __('admin.tenants.timeline.created_details'), $tenant->created_at, 'success' ), ]; if ($tenant->last_activity_at) { $events[] = static::timelineEntry( __('admin.tenants.timeline.last_activity'), __('admin.tenants.timeline.last_activity_details'), $tenant->last_activity_at, 'info' ); } if ($tenant->deletion_warning_sent_at) { $events[] = static::timelineEntry( __('admin.tenants.timeline.deletion_warning'), __('admin.tenants.timeline.deletion_warning_details'), $tenant->deletion_warning_sent_at, 'warning' ); } if ($tenant->pending_deletion_at) { $events[] = static::timelineEntry( __('admin.tenants.timeline.deletion_scheduled'), __('admin.tenants.timeline.deletion_scheduled_details'), $tenant->pending_deletion_at, 'warning' ); } if ($tenant->anonymized_at) { $events[] = static::timelineEntry( __('admin.tenants.timeline.anonymized'), __('admin.tenants.timeline.anonymized_details'), $tenant->anonymized_at, 'danger' ); } $logs = $tenant->notificationLogs() ->latest('sent_at') ->limit(10) ->get(); foreach ($logs as $log) { $status = $log->status === 'failed' ? 'danger' : 'info'; $eventTitle = $log->status === 'failed' ? __('admin.tenants.timeline.notification_failed') : __('admin.tenants.timeline.notification_sent'); $details = collect([ Str::headline($log->type), $log->channel ? Str::upper($log->channel) : null, $log->recipient, $log->failure_reason ? 'reason: '.$log->failure_reason : null, ])->filter()->implode(' - '); $events[] = static::timelineEntry( $eventTitle, $details, $log->sent_at ?? $log->failed_at ?? $log->created_at, $status ); } return collect($events) ->filter(fn (array $event) => $event['occurred_at'] !== null) ->sortByDesc('occurred_at') ->values() ->all(); } private static function timelineEntry(string $title, ?string $details, $occurredAt, string $tone): array { return [ 'title' => $title, 'details' => $details, 'occurred_at' => $occurredAt, 'tone' => $tone, ]; } }