From ef1773d9669a68a8aa7a38b3f6094b4631d64734 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Tue, 6 Jan 2026 13:36:50 +0100 Subject: [PATCH] Fix package limits in tenant overview --- .../Api/TenantPackageController.php | 37 +++++++++----- resources/js/admin/mobile/DashboardPage.tsx | 6 --- .../Tenant/TenantPackageOverviewTest.php | 48 +++++++++++++++++++ 3 files changed, 72 insertions(+), 19 deletions(-) create mode 100644 tests/Feature/Tenant/TenantPackageOverviewTest.php diff --git a/app/Http/Controllers/Api/TenantPackageController.php b/app/Http/Controllers/Api/TenantPackageController.php index 150f798..14d0d29 100644 --- a/app/Http/Controllers/Api/TenantPackageController.php +++ b/app/Http/Controllers/Api/TenantPackageController.php @@ -29,23 +29,34 @@ class TenantPackageController extends Controller ->orderBy('created_at', 'desc') ->get(); - $packages->each(function ($package) { - $pkg = $package->package; - $package->remaining_events = $pkg->max_events_per_year - $package->used_events; - $package->package_limits = array_merge( - $pkg->limits, - [ - 'branding_allowed' => $pkg->branding_allowed, - 'watermark_allowed' => $pkg->watermark_allowed, - 'features' => $pkg->features, - ] - ); - }); + $packages->each(fn (TenantPackage $package) => $this->hydratePackageSnapshot($package)); + + $activePackage = $tenant->activeResellerPackage?->load('package'); + + if ($activePackage instanceof TenantPackage) { + $this->hydratePackageSnapshot($activePackage); + } return response()->json([ 'data' => $packages, - 'active_package' => $tenant->activeResellerPackage ? $tenant->activeResellerPackage->load('package') : null, + 'active_package' => $activePackage, 'message' => 'Tenant packages loaded successfully.', ]); } + + private function hydratePackageSnapshot(TenantPackage $package): void + { + $pkg = $package->package; + + $maxEvents = $pkg?->max_events_per_year; + $package->remaining_events = $maxEvents === null ? null : max($maxEvents - $package->used_events, 0); + $package->package_limits = array_merge( + $pkg?->limits ?? [], + [ + 'branding_allowed' => $pkg?->branding_allowed, + 'watermark_allowed' => $pkg?->watermark_allowed, + 'features' => $pkg?->features ?? [], + ] + ); + } } diff --git a/resources/js/admin/mobile/DashboardPage.tsx b/resources/js/admin/mobile/DashboardPage.tsx index ff258cb..0810807 100644 --- a/resources/js/admin/mobile/DashboardPage.tsx +++ b/resources/js/admin/mobile/DashboardPage.tsx @@ -505,9 +505,6 @@ function PackageSummarySheet({ const { t } = useTranslation('management'); const { textStrong, muted, border, surface, accentSoft, primary } = useAdminTheme(); const text = textStrong; - const maxPhotos = (limits as Record | null)?.max_photos ?? null; - const maxGuests = (limits as Record | null)?.max_guests ?? null; - const galleryDays = (limits as Record | null)?.gallery_days ?? null; const resolvedFeatures = collectPackageFeatures({ features, package_limits: limits, @@ -532,9 +529,6 @@ function PackageSummarySheet({ - - - reseller()->create([ + 'max_photos' => 1500, + 'max_guests' => 250, + 'gallery_days' => 30, + 'max_tasks' => 40, + 'max_events_per_year' => 12, + 'features' => ['custom_branding', 'reseller_dashboard'], + 'branding_allowed' => true, + 'watermark_allowed' => false, + ]); + + TenantPackage::factory()->create([ + 'tenant_id' => $this->tenant->id, + 'package_id' => $package->id, + 'active' => true, + 'used_events' => 3, + ]); + + $request = Request::create('/api/v1/tenant/packages', 'GET'); + $request->attributes->set('tenant', $this->tenant); + + $response = app(TenantPackageController::class)->index($request); + $payload = $response->getData(true); + + $this->assertSame(1500, $payload['active_package']['package_limits']['max_photos']); + $this->assertSame(250, $payload['active_package']['package_limits']['max_guests']); + $this->assertSame(30, $payload['active_package']['package_limits']['gallery_days']); + $this->assertSame(40, $payload['active_package']['package_limits']['max_tasks']); + $this->assertSame(12, $payload['active_package']['package_limits']['max_events_per_year']); + $this->assertTrue($payload['active_package']['package_limits']['branding_allowed']); + $this->assertFalse($payload['active_package']['package_limits']['watermark_allowed']); + $this->assertSame(['custom_branding', 'reseller_dashboard'], $payload['active_package']['package_limits']['features']); + $this->assertSame(9, $payload['active_package']['remaining_events']); + } +}