feat(tickets): enhance ticket search functionality and add ticket counts to response

This commit is contained in:
2026-08-28 15:14:11 -03:00
parent c792e7d306
commit ba0e2dd00c
5 changed files with 85 additions and 26 deletions

View File

@@ -5,26 +5,39 @@ namespace App\Domains\Ticket\Services;
use App\Domains\Tenant\Models\Tenant;
use App\Domains\Ticket\Models\Ticket;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Pagination\LengthAwarePaginator;
class AdminAppTicketService
{
/** @return array{scanned_tickets: int, total_tickets: int} */
public function counts(Tenant $tenant): array
/**
* @param array{q?: string|null, page?: int, per_page?: int} $filters
*/
public function search(Tenant $tenant, array $filters = []): AdminAppTicketResult
{
$query = Ticket::query()->where('tenant_code', $tenant->codigo);
$query = $this->baseQuery($tenant, $filters);
return [
'scanned_tickets' => (clone $query)->whereNotNull('used_at')->count(),
'total_tickets' => $query->count(),
];
$tickets = (clone $query)
->with([
...TicketValidityResolver::RELATIONS,
...TicketPresentationResolver::RELATIONS,
'user',
'sourceCatalogItem.category',
])
->orderByDesc('id')
->paginateFromRequest()
->withQueryString();
return new AdminAppTicketResult(
tickets: $tickets,
scannedTickets: (clone $query)->whereNotNull('used_at')->count(),
totalTickets: $tickets->total(),
);
}
/**
* @param array{q?: string|null, page?: int, per_page?: int} $filters
* @return LengthAwarePaginator<Ticket>
* @return Builder<Ticket>
*/
public function list(Tenant $tenant, array $filters = []): LengthAwarePaginator
private function baseQuery(Tenant $tenant, array $filters): Builder
{
$search = trim((string) ($filters['q'] ?? ''));
@@ -38,15 +51,6 @@ class AdminAppTicketService
fn (Builder $searchQuery): Builder => $searchQuery
->where('ticket', 'like', "%{$search}%"),
);
})
->with([
...TicketValidityResolver::RELATIONS,
...TicketPresentationResolver::RELATIONS,
'user',
'sourceCatalogItem.category',
])
->orderByDesc('id')
->paginateFromRequest()
->withQueryString();
});
}
}