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

@@ -27,7 +27,7 @@ class AdminAppTicketService
) {}
/**
* @param array{q?: string|null, category?: string|null, product?: string|null, type?: string|null, date?: 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
{
@@ -60,7 +60,7 @@ class AdminAppTicketService
}
/**
* @param array{q?: string|null, category?: string|null, product?: string|null, type?: string|null, date?: 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>
*/
public function ticketsForExport(Tenant $tenant, array $filters = []): Collection
@@ -76,7 +76,7 @@ class AdminAppTicketService
}
/**
* @param array{q?: string|null, category?: string|null, product?: string|null, type?: string|null, date?: 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>
*/
private function baseQuery(Tenant $tenant, array $filters): Builder
@@ -104,9 +104,19 @@ class AdminAppTicketService
->when($filters['type'] ?? null, function (Builder $query, string $type) use ($filters): void {
$this->applyTypeFilter($query, (string) ($filters['category'] ?? ''), $type);
})
->when($filters['date'] ?? null, fn (Builder $query, string $date): Builder => $query
->whereHas('sourcePurchase', fn (Builder $purchaseQuery): Builder => $purchaseQuery
->whereDate('created_at', $date)));
->when($filters['date'] ?? null, function (Builder $query, string $date) use ($tenant): void {
if ($tenant->codigo === 'fiesta_futbol_infantil') {
$this->applyEventDateFilter($query, $date);
return;
}
$query->whereHas('sourcePurchase', fn (Builder $purchaseQuery): Builder => $purchaseQuery
->whereDate('created_at', $date));
})
->when($filters['size'] ?? null, function (Builder $query, string $size) use ($filters): void {
$this->applySizeFilter($query, (string) ($filters['category'] ?? ''), $size);
});
$this->applyStatusFilter($query, $filters['status'] ?? null);
@@ -125,14 +135,7 @@ class AdminAppTicketService
}
if (in_array($category, ['comidas', 'comida'], true)) {
$query->whereHas('sourceVariant', function (Builder $variantQuery) use ($product): void {
$variantQuery->where(function (Builder $dateQuery) use ($product): void {
$dateQuery
->where('event_date_id', $product)
->orWhereHas('eventDates', fn (Builder $eventDateQuery): Builder => $eventDateQuery
->whereKey($product));
});
});
$this->whereVariantDefinition($query, 'horario', $product);
return;
}
@@ -145,7 +148,7 @@ class AdminAppTicketService
private function applyTypeFilter(Builder $query, string $category, string $type): void
{
$attribute = match ($this->normalizedCategory($category)) {
'comidas', 'comida' => 'horario',
'comidas', 'comida' => 'servicio',
'merchandising' => 'color',
default => null,
};
@@ -155,6 +158,31 @@ class AdminAppTicketService
}
}
/** @param Builder<Ticket> $query */
private function applyEventDateFilter(Builder $query, string $date): void
{
$query
->whereHas('sourceCatalogItem.category', fn (Builder $categoryQuery): Builder => $categoryQuery
->whereRaw('LOWER(nombre) IN (?, ?)', ['comidas', 'comida']))
->whereHas('sourceVariant', function (Builder $variantQuery) use ($date): void {
$variantQuery->where(function (Builder $dateQuery) use ($date): void {
$dateQuery
->whereHas('eventDate', fn (Builder $eventDateQuery): Builder => $eventDateQuery
->whereDate('date', $date))
->orWhereHas('eventDates', fn (Builder $eventDateQuery): Builder => $eventDateQuery
->whereDate('date', $date));
});
});
}
/** @param Builder<Ticket> $query */
private function applySizeFilter(Builder $query, string $category, string $size): void
{
if ($this->normalizedCategory($category) === 'merchandising') {
$this->whereVariantDefinition($query, 'talle', $size);
}
}
/** @param Builder<Ticket> $query */
private function whereVariantDefinition(Builder $query, string $attribute, string $value): void
{