feat(tests): enhance AdminAppTicketEventScopeTest with soft deletes and active ticket filtering
This commit is contained in:
@@ -82,13 +82,17 @@ Bajo `/tenants/{tenant:codigo}`, protegidos por `auth:sanctum`:
|
|||||||
- `POST /tickets/pdf`.
|
- `POST /tickets/pdf`.
|
||||||
|
|
||||||
Bajo `/v1/adminapp/tenant`, protegido por `auth:sanctum`, `adminapp.tenant` y el menú
|
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
|
- `GET /tickets`, paginado y con búsqueda opcional mediante `q`. La respuesta incluye
|
||||||
`scanned_tickets` y `total_tickets` para el tenant autenticado.
|
`scanned_tickets` y `total_tickets` para el tenant autenticado.
|
||||||
|
|
||||||
`TicketPdfService` genera la descarga y `TicketResource`/`ValidityTimeResource` definen las respuestas.
|
`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
|
## 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.
|
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.
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ class AdminAppTicketEventScopeTest extends TestCase
|
|||||||
Schema::create('desfile_entry_reservations', function (Blueprint $table): void {
|
Schema::create('desfile_entry_reservations', function (Blueprint $table): void {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->unsignedBigInteger('ticket_id');
|
$table->unsignedBigInteger('ticket_id');
|
||||||
|
$table->softDeletes();
|
||||||
});
|
});
|
||||||
Schema::create('value_changes', function (Blueprint $table): void {
|
Schema::create('value_changes', function (Blueprint $table): void {
|
||||||
$table->id();
|
$table->id();
|
||||||
@@ -114,6 +115,10 @@ class AdminAppTicketEventScopeTest extends TestCase
|
|||||||
// Status uses sorting in memory rather than the database.
|
// Status uses sorting in memory rather than the database.
|
||||||
$this->getJson('/api/v1/adminapp/tenant/tickets?sort_by=status')
|
$this->getJson('/api/v1/adminapp/tenant/tickets?sort_by=status')
|
||||||
->assertOk()->assertJsonCount(1, 'data')->assertJsonPath('data.0.id', 1);
|
->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
|
public function test_foreign_unassigned_and_other_tenant_tickets_cannot_be_modified_or_refunded(): void
|
||||||
|
|||||||
Reference in New Issue
Block a user