attributes->get('tenant'); if (! $tenant instanceof Tenant) { $decoded = $request->attributes->get('decoded_token', []); $tenantId = Arr::get($decoded, 'tenant_id'); if ($tenantId) { $tenant = Tenant::query()->find($tenantId); } } if (! $tenant instanceof Tenant) { return response()->json([ 'message' => 'Tenant context missing.', ], 401); } $eventsQuery = Event::query() ->where('tenant_id', $tenant->getKey()); $activeEvents = (clone $eventsQuery) ->where(fn ($query) => $query ->where('is_active', true) ->orWhere('status', 'published')) ->count(); $upcomingEvents = (clone $eventsQuery) ->whereDate('date', '>=', Carbon::now()->startOfDay()) ->count(); $eventsWithTasks = (clone $eventsQuery) ->whereHas('tasks') ->count(); $totalEvents = (clone $eventsQuery)->count(); $taskProgress = $totalEvents > 0 ? (int) round(($eventsWithTasks / $totalEvents) * 100) : 0; $newPhotos = Photo::query() ->whereHas('event', fn ($query) => $query->where('tenant_id', $tenant->getKey())) ->where('created_at', '>=', Carbon::now()->subDays(7)) ->count(); $activePackage = $tenant->tenantPackages() ->with('package') ->where('active', true) ->orderByDesc('expires_at') ->orderByDesc('purchased_at') ->first(); return response()->json([ 'active_events' => $activeEvents, 'new_photos' => $newPhotos, 'task_progress' => $taskProgress, 'credit_balance' => $tenant->event_credits_balance ?? null, 'upcoming_events' => $upcomingEvents, 'active_package' => $activePackage ? [ 'name' => $activePackage->package?->getNameForLocale(app()->getLocale()) ?? $activePackage->package?->name ?? '', 'expires_at' => optional($activePackage->expires_at)->toIso8601String(), 'remaining_events' => $activePackage->remaining_events ?? null, ] : null, ]); } }