From 3ddff7e0ee73767f85e0024a1fc81eebab518dc2 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Thu, 1 Oct 2026 09:47:32 -0300 Subject: [PATCH] feat(tests): enhance AdminAppTicketEventScopeTest with soft deletes and active ticket filtering --- app/Domains/Ticketing/Ticket/documentacion/README.md | 6 +++++- tests/Feature/Ticket/AdminAppTicketEventScopeTest.php | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/Domains/Ticketing/Ticket/documentacion/README.md b/app/Domains/Ticketing/Ticket/documentacion/README.md index e460d5c3..66b5df4c 100644 --- a/app/Domains/Ticketing/Ticket/documentacion/README.md +++ b/app/Domains/Ticketing/Ticket/documentacion/README.md @@ -82,13 +82,17 @@ Bajo `/tenants/{tenant:codigo}`, protegidos por `auth:sanctum`: - `POST /tickets/pdf`. Bajo `/v1/adminapp/tenant`, protegido por `auth:sanctum`, `adminapp.tenant` y el menú -`adminapp.tickets`: +`onticket.adminapp.tickets`: - `GET /tickets`, paginado y con búsqueda opcional mediante `q`. La respuesta incluye `scanned_tickets` y `total_tickets` para el tenant autenticado. `TicketPdfService` genera la descarga y `TicketResource`/`ValidityTimeResource` definen las respuestas. +Si el administrador autenticado tiene `event_id`, las consultas de Tickets y sus exportaciones se limitan a `tickets.event_id` dentro del tenant. Los contadores usan el mismo alcance y el total reembolsado se limita a las compras del evento. Sin `event_id`, se conserva el alcance por tenant. + +La cancelación, el cálculo de reembolso y el reembolso buscan el ticket dentro de ese alcance antes de validar o ejecutar la operación. Un ticket de otro evento o sin evento devuelve 404 para un administrador con evento asignado. El alcance se obtiene del usuario autenticado, no de los parámetros del cliente. + ## Dependencias y reglas Depende de `Purchase`, `Catalog`, `Tenant` y `Auth`. La generación debe ser idempotente ante reintentos del evento. `TicketNotAvailableException` y `TicketGenerationException` separan indisponibilidad de errores de generación. diff --git a/tests/Feature/Ticket/AdminAppTicketEventScopeTest.php b/tests/Feature/Ticket/AdminAppTicketEventScopeTest.php index 627c5a39..8820c3be 100644 --- a/tests/Feature/Ticket/AdminAppTicketEventScopeTest.php +++ b/tests/Feature/Ticket/AdminAppTicketEventScopeTest.php @@ -75,6 +75,7 @@ class AdminAppTicketEventScopeTest extends TestCase Schema::create('desfile_entry_reservations', function (Blueprint $table): void { $table->id(); $table->unsignedBigInteger('ticket_id'); + $table->softDeletes(); }); Schema::create('value_changes', function (Blueprint $table): void { $table->id(); @@ -114,6 +115,10 @@ class AdminAppTicketEventScopeTest extends TestCase // Status uses sorting in memory rather than the database. $this->getJson('/api/v1/adminapp/tenant/tickets?sort_by=status') ->assertOk()->assertJsonCount(1, 'data')->assertJsonPath('data.0.id', 1); + DB::table('tickets')->where('id', 1)->update(['used_at' => null]); + $this->getJson('/api/v1/adminapp/tenant/tickets?status=active') + ->assertOk()->assertJsonCount(1, 'data') + ->assertJsonPath('scanned_tickets', 0)->assertJsonPath('total_tickets', 1); } public function test_foreign_unassigned_and_other_tenant_tickets_cannot_be_modified_or_refunded(): void @@ -156,7 +161,7 @@ class AdminAppTicketEventScopeTest extends TestCase fn ($tenant, Collection $tickets, $timezone): bool => $tenant->codigo === 'onticket' && $tickets->pluck('id')->all() === [1] && $timezone === 'UTC' )->andReturn($class === AdminAppTicketPdfService::class - ? response('pdf') : new StreamedResponse(fn () => print('excel'))); + ? response('pdf') : new StreamedResponse(fn () => print ('excel'))); }); } foreach (['pdf', 'excel'] as $format) {