feat(ticket): add event_id support to ticket service methods; update search, cancel, and refund calculations

This commit is contained in:
2026-10-01 09:46:29 -03:00
parent c975b5d51d
commit 2d11263adc
2 changed files with 28 additions and 24 deletions

View File

@@ -29,7 +29,7 @@ class TicketController extends Controller
$tenant = $request->user()->tenant()->firstOrFail();
return new AdminAppTicketCollection(
$this->ticketService->search($tenant, $request->validated())
$this->ticketService->search($tenant, $request->validated(), $request->user()->event_id)
);
}
@@ -37,7 +37,7 @@ class TicketController extends Controller
{
$tenant = $request->user()->tenant()->firstOrFail();
return new AdminAppTicketResource($this->ticketService->cancel($tenant, $ticket));
return new AdminAppTicketResource($this->ticketService->cancel($tenant, $ticket, $request->user()->event_id));
}
public function calculateRefund(Request $request, int $ticket): AdminAppTicketRefundCalculationResource
@@ -45,7 +45,7 @@ class TicketController extends Controller
$tenant = $request->user()->tenant()->firstOrFail();
return new AdminAppTicketRefundCalculationResource(
$this->ticketService->calculateRefund($tenant, $ticket)
$this->ticketService->calculateRefund($tenant, $ticket, $request->user()->event_id)
);
}
@@ -69,7 +69,7 @@ class TicketController extends Controller
return $this->ticketPdfService->download(
$tenant,
$this->ticketService->ticketsForExport($tenant, $request->validated()),
$this->ticketService->ticketsForExport($tenant, $request->validated(), $request->user()->event_id),
$request->validated('timezone'),
);
}
@@ -80,7 +80,7 @@ class TicketController extends Controller
return $this->ticketExcelService->download(
$tenant,
$this->ticketService->ticketsForExport($tenant, $request->validated()),
$this->ticketService->ticketsForExport($tenant, $request->validated(), $request->user()->event_id),
$request->validated('timezone'),
);
}

View File

@@ -41,9 +41,9 @@ class AdminAppTicketService
/**
* @param array{q?: string|null, category?: string|null, product?: string|null, type?: string|null, date?: string|null, size?: string|null, status?: string|null, page?: int, per_page?: int, sort_by?: string|null, sort_direction?: string|null} $filters
*/
public function search(Tenant $tenant, array $filters = []): AdminAppTicketResult
public function search(Tenant $tenant, array $filters = [], ?int $eventId = null): AdminAppTicketResult
{
$query = $this->baseQuery($tenant, $filters);
$query = $this->baseQuery($tenant, $filters, $eventId);
$countQuery = clone $query;
$databaseSorted = $this->applyDatabaseSort($query, $tenant, $filters);
@@ -77,7 +77,7 @@ class AdminAppTicketService
tickets: $tickets,
scannedTickets: $scannedTickets,
totalTickets: $totalTickets,
refundedTotal: $this->refundSummaryService->totalForTenant($tenant),
refundedTotal: $this->refundSummaryService->totalForTenant($tenant, $eventId),
);
}
@@ -85,9 +85,9 @@ class AdminAppTicketService
* @param array{q?: string|null, category?: string|null, product?: string|null, type?: string|null, date?: string|null, size?: string|null, status?: string|null, sort_by?: string|null, sort_direction?: string|null} $filters
* @return Collection<int, Ticket>
*/
public function ticketsForExport(Tenant $tenant, array $filters = []): Collection
public function ticketsForExport(Tenant $tenant, array $filters = [], ?int $eventId = null): Collection
{
$query = $this->baseQuery($tenant, $filters);
$query = $this->baseQuery($tenant, $filters, $eventId);
$databaseSorted = $this->applyDatabaseSort($query, $tenant, $filters);
$tickets = $query
->with(self::RELATIONS)
@@ -97,11 +97,10 @@ class AdminAppTicketService
return $databaseSorted ? $tickets : $this->sortTickets($tickets, $tenant, $filters);
}
public function cancel(Tenant $tenant, int $ticketId): Ticket
public function cancel(Tenant $tenant, int $ticketId, ?int $eventId = null): Ticket
{
return DB::transaction(function () use ($tenant, $ticketId): Ticket {
$ticket = Ticket::query()
->where('tenant_code', $tenant->codigo)
return DB::transaction(function () use ($tenant, $ticketId, $eventId): Ticket {
$ticket = $this->ticketsQuery($tenant, $eventId)
->lockForUpdate()
->findOrFail($ticketId);
@@ -124,10 +123,9 @@ class AdminAppTicketService
* partial: string|null,
* }
*/
public function calculateRefund(Tenant $tenant, int $ticketId): array
public function calculateRefund(Tenant $tenant, int $ticketId, ?int $eventId = null): array
{
$ticket = Ticket::query()
->where('tenant_code', $tenant->codigo)
$ticket = $this->ticketsQuery($tenant, $eventId)
->findOrFail($ticketId);
if (! $ticket->can_refund()) {
@@ -175,14 +173,13 @@ class AdminAppTicketService
string $refundType,
?User $createdBy = null,
): Ticket {
$this->ensureRefundIsAllowed($tenant, $refundType);
return DB::transaction(function () use ($tenant, $ticketId, $refundType, $createdBy): Ticket {
$ticket = Ticket::query()
->where('tenant_code', $tenant->codigo)
$ticket = $this->ticketsQuery($tenant, $createdBy?->event_id)
->lockForUpdate()
->findOrFail($ticketId);
$this->ensureRefundIsAllowed($tenant, $refundType);
if (! $ticket->can_refund()) {
if ($ticket->status !== Ticket::STATUS_ACTIVE) {
throw ValidationException::withMessages([
@@ -314,12 +311,11 @@ class AdminAppTicketService
* @param array{q?: string|null, category?: string|null, product?: string|null, type?: string|null, date?: string|null, size?: string|null, status?: string|null, page?: int, per_page?: int} $filters
* @return Builder<Ticket>
*/
private function baseQuery(Tenant $tenant, array $filters): Builder
private function baseQuery(Tenant $tenant, array $filters, ?int $eventId = null): Builder
{
$search = trim((string) ($filters['q'] ?? ''));
$query = Ticket::query()
->where('tenant_code', $tenant->codigo)
$query = $this->ticketsQuery($tenant, $eventId)
->when($search !== '', function (Builder $query) use ($search): void {
$this->applySearchFilter($query, $search);
})
@@ -359,6 +355,14 @@ class AdminAppTicketService
return $query;
}
/** @return Builder<Ticket> */
private function ticketsQuery(Tenant $tenant, ?int $eventId): Builder
{
return Ticket::query()
->where('tenant_code', $tenant->codigo)
->when($eventId !== null, fn (Builder $query): Builder => $query->where('tickets.event_id', $eventId));
}
/** @param Builder<Ticket> $query */
private function applySearchFilter(Builder $query, string $search): void
{