57 lines
1.8 KiB
PHP
57 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Ticket\Services;
|
|
|
|
use App\Domains\Tenant\Models\Tenant;
|
|
use App\Domains\Ticket\Models\Ticket;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
class AdminAppTicketService
|
|
{
|
|
/**
|
|
* @param array{q?: string|null, page?: int, per_page?: int} $filters
|
|
*/
|
|
public function search(Tenant $tenant, array $filters = []): AdminAppTicketResult
|
|
{
|
|
$query = $this->baseQuery($tenant, $filters);
|
|
|
|
$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 Builder<Ticket>
|
|
*/
|
|
private function baseQuery(Tenant $tenant, array $filters): Builder
|
|
{
|
|
$search = trim((string) ($filters['q'] ?? ''));
|
|
|
|
return Ticket::query()
|
|
->where('tenant_code', $tenant->codigo)
|
|
->when($search !== '', function (Builder $query) use ($search): void {
|
|
$query->when(
|
|
ctype_digit($search),
|
|
fn (Builder $searchQuery): Builder => $searchQuery
|
|
->where('tickets.id', (int) $search),
|
|
fn (Builder $searchQuery): Builder => $searchQuery
|
|
->where('ticket', 'like', "%{$search}%"),
|
|
);
|
|
});
|
|
}
|
|
}
|