58 lines
2.1 KiB
PHP
58 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Event\Services;
|
|
|
|
use App\Domains\Purchase\Models\Purchase;
|
|
use App\Domains\Tenant\Models\Tenant;
|
|
use App\Domains\Ticket\Models\Ticket;
|
|
use App\Domains\Ticket\Services\TicketValidityResolver;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class AffectedEventDatePurchaseResolver
|
|
{
|
|
/**
|
|
* Finds active tickets belonging to paid purchases before an event-date mutation.
|
|
*
|
|
* @param Collection<int, int>|list<int> $eventDateIds
|
|
* @return list<array{purchase_id: int, ticket_ids: list<int>}>
|
|
*/
|
|
public function resolve(Tenant $tenant, Collection|array $eventDateIds): array
|
|
{
|
|
$eventDateIds = collect($eventDateIds)->map(fn (mixed $id): int => (int) $id)->unique()->values();
|
|
|
|
if ($eventDateIds->isEmpty()) {
|
|
return [];
|
|
}
|
|
|
|
/** @var Collection<int, Ticket> $tickets */
|
|
$tickets = Ticket::query()
|
|
->where('tenant_code', $tenant->codigo)
|
|
->whereHas('sourcePurchaseItem.purchase', fn (Builder $query) => $query
|
|
->where('status', Purchase::STATUS_PAID))
|
|
->whereHas('sourceVariant', function (Builder $query) use ($eventDateIds): void {
|
|
$query->whereIn('event_date_id', $eventDateIds)
|
|
->orWhereHas('eventDates', fn (Builder $eventDates) => $eventDates
|
|
->whereIn('event_dates.id', $eventDateIds));
|
|
})
|
|
->with([
|
|
...TicketValidityResolver::RELATIONS,
|
|
'sourcePurchaseItem.purchase',
|
|
])
|
|
->get()
|
|
->filter(fn (Ticket $ticket): bool => $ticket->is_active())
|
|
->values();
|
|
|
|
return $tickets
|
|
->groupBy(fn (Ticket $ticket): int => (int) $ticket->sourcePurchaseItem->purchase->getKey())
|
|
->map(function (Collection $purchaseTickets): array {
|
|
return [
|
|
'purchase_id' => (int) $purchaseTickets->first()->sourcePurchaseItem->purchase->getKey(),
|
|
'ticket_ids' => $purchaseTickets->modelKeys(),
|
|
];
|
|
})
|
|
->values()
|
|
->all();
|
|
}
|
|
}
|