shopit-back/app/Domains/Ticket/Services/AdminAppTicketService.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}%"),
);
});
}
}