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(); $tenant = $request->user()->tenant()->firstOrFail();
return new AdminAppTicketCollection( 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(); $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 public function calculateRefund(Request $request, int $ticket): AdminAppTicketRefundCalculationResource
@@ -45,7 +45,7 @@ class TicketController extends Controller
$tenant = $request->user()->tenant()->firstOrFail(); $tenant = $request->user()->tenant()->firstOrFail();
return new AdminAppTicketRefundCalculationResource( 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( return $this->ticketPdfService->download(
$tenant, $tenant,
$this->ticketService->ticketsForExport($tenant, $request->validated()), $this->ticketService->ticketsForExport($tenant, $request->validated(), $request->user()->event_id),
$request->validated('timezone'), $request->validated('timezone'),
); );
} }
@@ -80,7 +80,7 @@ class TicketController extends Controller
return $this->ticketExcelService->download( return $this->ticketExcelService->download(
$tenant, $tenant,
$this->ticketService->ticketsForExport($tenant, $request->validated()), $this->ticketService->ticketsForExport($tenant, $request->validated(), $request->user()->event_id),
$request->validated('timezone'), $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 * @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; $countQuery = clone $query;
$databaseSorted = $this->applyDatabaseSort($query, $tenant, $filters); $databaseSorted = $this->applyDatabaseSort($query, $tenant, $filters);
@@ -77,7 +77,7 @@ class AdminAppTicketService
tickets: $tickets, tickets: $tickets,
scannedTickets: $scannedTickets, scannedTickets: $scannedTickets,
totalTickets: $totalTickets, 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 * @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> * @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); $databaseSorted = $this->applyDatabaseSort($query, $tenant, $filters);
$tickets = $query $tickets = $query
->with(self::RELATIONS) ->with(self::RELATIONS)
@@ -97,11 +97,10 @@ class AdminAppTicketService
return $databaseSorted ? $tickets : $this->sortTickets($tickets, $tenant, $filters); 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 { return DB::transaction(function () use ($tenant, $ticketId, $eventId): Ticket {
$ticket = Ticket::query() $ticket = $this->ticketsQuery($tenant, $eventId)
->where('tenant_code', $tenant->codigo)
->lockForUpdate() ->lockForUpdate()
->findOrFail($ticketId); ->findOrFail($ticketId);
@@ -124,10 +123,9 @@ class AdminAppTicketService
* partial: string|null, * 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() $ticket = $this->ticketsQuery($tenant, $eventId)
->where('tenant_code', $tenant->codigo)
->findOrFail($ticketId); ->findOrFail($ticketId);
if (! $ticket->can_refund()) { if (! $ticket->can_refund()) {
@@ -175,14 +173,13 @@ class AdminAppTicketService
string $refundType, string $refundType,
?User $createdBy = null, ?User $createdBy = null,
): Ticket { ): Ticket {
$this->ensureRefundIsAllowed($tenant, $refundType);
return DB::transaction(function () use ($tenant, $ticketId, $refundType, $createdBy): Ticket { return DB::transaction(function () use ($tenant, $ticketId, $refundType, $createdBy): Ticket {
$ticket = Ticket::query() $ticket = $this->ticketsQuery($tenant, $createdBy?->event_id)
->where('tenant_code', $tenant->codigo)
->lockForUpdate() ->lockForUpdate()
->findOrFail($ticketId); ->findOrFail($ticketId);
$this->ensureRefundIsAllowed($tenant, $refundType);
if (! $ticket->can_refund()) { if (! $ticket->can_refund()) {
if ($ticket->status !== Ticket::STATUS_ACTIVE) { if ($ticket->status !== Ticket::STATUS_ACTIVE) {
throw ValidationException::withMessages([ 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 * @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> * @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'] ?? '')); $search = trim((string) ($filters['q'] ?? ''));
$query = Ticket::query() $query = $this->ticketsQuery($tenant, $eventId)
->where('tenant_code', $tenant->codigo)
->when($search !== '', function (Builder $query) use ($search): void { ->when($search !== '', function (Builder $query) use ($search): void {
$this->applySearchFilter($query, $search); $this->applySearchFilter($query, $search);
}) })
@@ -359,6 +355,14 @@ class AdminAppTicketService
return $query; 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 */ /** @param Builder<Ticket> $query */
private function applySearchFilter(Builder $query, string $search): void private function applySearchFilter(Builder $query, string $search): void
{ {