feat(tickets): refine FFI variant filters

This commit is contained in:
2026-09-01 14:29:26 -03:00
parent 6896646c54
commit 836aa1afd7
6 changed files with 300 additions and 74 deletions

View File

@@ -73,7 +73,8 @@ class AdminAppTicketControllerTest extends TestCase
->assertJsonPath('data.0.values.id', $ticket->id)
->assertJsonPath('data.0.values.status', Ticket::STATUS_ACTIVE)
->assertJsonMissingPath('data.0.values.ticket')
->assertJsonMissingPath('data.0.values.date')
->assertJsonPath('data.0.values.date', '-')
->assertJsonPath('data.0.values.size', '-')
->assertJsonMissingPath('data.0.date')
->assertJsonPath('meta.total', 1);
}
@@ -278,6 +279,13 @@ class AdminAppTicketControllerTest extends TestCase
&& $variant->selectionValues()->get('horario') === 'Almuerzo');
$this->assertNotNull($dinner);
$this->assertNotNull($lunch);
$dinnerService = $dinner->selectionValues()->get('servicio');
$otherDate = $tenant->eventDates()->where('id', '!=', $date->id)->firstOrFail();
$otherDinner = $food->variants->first(fn (Variant $variant): bool => $variant
->selectedEventDates()->contains('id', $otherDate->id)
&& $variant->selectionValues()->get('horario') === 'Cena'
&& $variant->selectionValues()->get('servicio') === $dinnerService);
$this->assertNotNull($otherDinner);
$matchingPurchase = $this->createPurchase($tenant, $admin, '2026-08-20 10:00:00');
$otherPurchase = $this->createPurchase($tenant, $admin, '2026-08-21 10:00:00');
@@ -296,24 +304,75 @@ class AdminAppTicketControllerTest extends TestCase
$this->createTicket($tenant, $admin, [
'source_purchase_id' => $otherPurchase->id,
'source_catalog_item_id' => $food->id,
'source_variant_id' => $dinner->id,
'source_variant_id' => $otherDinner->id,
'used_at' => now(),
]);
$this->getJson('/api/v1/adminapp/tenant/tickets?'.http_build_query([
'category' => 'comidas',
'product' => (string) $date->id,
'type' => 'Cena',
'date' => '2026-08-20',
'product' => 'Cena',
'type' => $dinnerService,
'date' => $date->date->format('Y-m-d'),
'status' => Ticket::STATUS_USED,
]))
->assertOk()
->assertJsonCount(1, 'data')
->assertJsonPath('data.0.id', $matching->id)
->assertJsonPath('data.0.values.product', 'Cena')
->assertJsonPath('data.0.values.type', $dinnerService)
->assertJsonPath('data.0.values.date', $date->date->format('d/m'))
->assertJsonPath('scanned_tickets', 1)
->assertJsonPath('total_tickets', 1);
}
public function test_it_exposes_and_filters_merchandise_color_and_size(): void
{
$tenant = $this->createTenant('fiesta_futbol_infantil');
$admin = $this->createAdminAppUser($tenant);
$this->grantTicketsMenu($tenant);
$this->seed([AttributeSeeder::class, FiestaFutbolInfantilProductSeeder::class]);
Sanctum::actingAs($admin);
$merchandise = CatalogItem::query()
->where('tenant_code', $tenant->codigo)
->where('slug', 'camiseta')
->with([
'variants.definitions.itemAttribute.attribute.options',
'variants.eventDates',
'variants.eventDate',
])
->firstOrFail();
$greenMedium = $merchandise->variants->first(fn (Variant $variant): bool => $variant->selectionValues()->get('color') === 'Verde'
&& $variant->selectionValues()->get('talle') === 'M');
$whiteMedium = $merchandise->variants->first(fn (Variant $variant): bool => $variant->selectionValues()->get('color') === 'Blanco'
&& $variant->selectionValues()->get('talle') === 'M');
$this->assertNotNull($greenMedium);
$this->assertNotNull($whiteMedium);
$matching = $this->createTicket($tenant, $admin, [
'source_catalog_item_id' => $merchandise->id,
'source_variant_id' => $greenMedium->id,
]);
$this->createTicket($tenant, $admin, [
'source_catalog_item_id' => $merchandise->id,
'source_variant_id' => $whiteMedium->id,
]);
$this->getJson('/api/v1/adminapp/tenant/tickets?'.http_build_query([
'category' => 'merchandising',
'product' => 'camiseta',
'type' => 'Verde',
'size' => 'M',
]))
->assertOk()
->assertJsonCount(1, 'data')
->assertJsonPath('data.0.id', $matching->id)
->assertJsonPath('data.0.values.product', 'Camiseta')
->assertJsonPath('data.0.values.type', 'Verde')
->assertJsonPath('data.0.values.date', '-')
->assertJsonPath('data.0.values.size', 'M');
}
public function test_it_filters_computed_active_and_expired_statuses(): void
{
$tenant = $this->createTenant('fiesta_futbol_infantil');