Link tenant packages to events and show usage in billing
This commit is contained in:
@@ -149,6 +149,7 @@ class EventController extends Controller
|
||||
$eventServicePackage = $billingIsReseller
|
||||
? $this->resolveResellerEventPackageForSlug($requestedServiceSlug ?: $package->included_package_slug)
|
||||
: $package;
|
||||
$sourceTenantPackage = $billingIsReseller ? $billingTenantPackage : $tenantPackage;
|
||||
|
||||
$requiresWaiver = $package->isEndcustomer();
|
||||
$latestPurchase = $requiresWaiver ? $this->resolveLatestPackagePurchase($tenant, $package) : null;
|
||||
@@ -216,12 +217,13 @@ class EventController extends Controller
|
||||
|
||||
$eventData = Arr::only($eventData, $allowed);
|
||||
|
||||
$event = DB::transaction(function () use ($tenant, $eventData, $eventServicePackage, $billingIsReseller, $isSuperAdmin) {
|
||||
$event = DB::transaction(function () use ($tenant, $eventData, $eventServicePackage, $billingIsReseller, $isSuperAdmin, $sourceTenantPackage) {
|
||||
$event = Event::create($eventData);
|
||||
|
||||
EventPackage::create([
|
||||
'event_id' => $event->id,
|
||||
'package_id' => $eventServicePackage->id,
|
||||
'tenant_package_id' => $sourceTenantPackage?->id,
|
||||
'purchased_price' => $billingIsReseller ? 0 : $eventServicePackage->price,
|
||||
'purchased_at' => now(),
|
||||
'gallery_expires_at' => $eventServicePackage->gallery_days
|
||||
|
||||
@@ -31,10 +31,12 @@ class TenantPackageController extends Controller
|
||||
->get();
|
||||
|
||||
$usageEventPackage = $this->resolveUsageEventPackage($tenant->id);
|
||||
$linkedEventPackages = $this->resolveLinkedEventPackages($tenant->id, $packages->pluck('id')->all());
|
||||
|
||||
$packages->each(function (TenantPackage $package) use ($usageEventPackage): void {
|
||||
$packages->each(function (TenantPackage $package) use ($usageEventPackage, $linkedEventPackages): void {
|
||||
$eventPackage = $package->active ? $usageEventPackage : null;
|
||||
$this->hydratePackageSnapshot($package, $eventPackage);
|
||||
$this->attachUsageEvents($package, $linkedEventPackages);
|
||||
});
|
||||
|
||||
$activePackage = $tenant->getActiveResellerPackage();
|
||||
@@ -43,6 +45,7 @@ class TenantPackageController extends Controller
|
||||
$activePackage = $packages->firstWhere('active', true);
|
||||
} else {
|
||||
$this->hydratePackageSnapshot($activePackage, $usageEventPackage);
|
||||
$this->attachUsageEvents($activePackage, $linkedEventPackages);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
@@ -52,6 +55,79 @@ class TenantPackageController extends Controller
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, int> $tenantPackageIds
|
||||
* @return array<int, array{current: ?EventPackage, last: ?EventPackage, count: int}>
|
||||
*/
|
||||
private function resolveLinkedEventPackages(int $tenantId, array $tenantPackageIds): array
|
||||
{
|
||||
if ($tenantPackageIds === []) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$eventPackages = EventPackage::query()
|
||||
->whereIn('tenant_package_id', $tenantPackageIds)
|
||||
->whereHas('event', fn ($query) => $query->where('tenant_id', $tenantId))
|
||||
->with(['event:id,slug,name,date,status'])
|
||||
->orderByDesc('purchased_at')
|
||||
->orderByDesc('created_at')
|
||||
->get()
|
||||
->groupBy('tenant_package_id');
|
||||
|
||||
$result = [];
|
||||
|
||||
foreach ($eventPackages as $tenantPackageId => $groupedPackages) {
|
||||
$current = $groupedPackages
|
||||
->first(function (EventPackage $eventPackage) {
|
||||
return $eventPackage->gallery_expires_at && $eventPackage->gallery_expires_at->isFuture();
|
||||
});
|
||||
|
||||
$result[(int) $tenantPackageId] = [
|
||||
'current' => $current,
|
||||
'last' => $groupedPackages->first(),
|
||||
'count' => $groupedPackages->count(),
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array<int, array{current: ?EventPackage, last: ?EventPackage, count: int}> $linkedEventPackages
|
||||
*/
|
||||
private function attachUsageEvents(TenantPackage $package, array $linkedEventPackages): void
|
||||
{
|
||||
$usage = $linkedEventPackages[$package->id] ?? null;
|
||||
|
||||
if (! $usage) {
|
||||
$package->linked_events_count = 0;
|
||||
$package->current_event = null;
|
||||
$package->last_event = null;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$package->linked_events_count = $usage['count'];
|
||||
$package->current_event = $this->formatLinkedEvent($usage['current']);
|
||||
$package->last_event = $this->formatLinkedEvent($usage['last']);
|
||||
}
|
||||
|
||||
private function formatLinkedEvent(?EventPackage $eventPackage): ?array
|
||||
{
|
||||
if (! $eventPackage || ! $eventPackage->event) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $eventPackage->event->id,
|
||||
'slug' => $eventPackage->event->slug,
|
||||
'name' => $eventPackage->event->name,
|
||||
'status' => $eventPackage->event->status,
|
||||
'event_date' => $eventPackage->event->date?->toIso8601String(),
|
||||
'linked_at' => $eventPackage->purchased_at?->toIso8601String(),
|
||||
];
|
||||
}
|
||||
|
||||
private function hydratePackageSnapshot(TenantPackage $package, ?EventPackage $eventPackage = null): void
|
||||
{
|
||||
$pkg = $package->package;
|
||||
|
||||
Reference in New Issue
Block a user