*/ final readonly class GetBoPaginatedOrdersQuery implements Query { public function __construct( private DataTableService $dataTable, ) { } #[\Override] public function __invoke(QueryInput $input): GetBoPaginatedOrdersQueryOutput { Assert::isInstanceOf($input, GetBoPaginatedOrdersQueryInput::class); $query = Order::query()->with(['shop']); if (! empty($input->search)) { $this->dataTable->searchQuery( Order::class, $query, $input->search, fn ($q) => $q->orWhereHas( 'shop', fn ($q) => $q->whereLike('name', "%{$input->search}%") ), 'reference', ); } // * Date Order filter if ($input->orderDateStart !== null) { if ($input->orderDateEnd !== null) { $query->whereCreatedAtBetween($input->orderDateStart, $input->orderDateEnd); } else { $query->whereCreatedAtBetween($input->orderDateStart, $input->orderDateStart); } } // * Date Pickup filter if ($input->orderPickupStart !== null) { if ($input->orderPickupEnd !== null) { $query->whereBetween('pickup_day', [ $input->orderPickupStart, $input->orderPickupEnd, ]); } else { $query->where('pickup_day', $input->orderPickupStart); } } if ($input->status !== null) { $query->where('status', $input->status); } $this->dataTable->sortQuery( Order::class, $query, defaultSortCol: 'date', defaultSortWay: \SortDirection::Descending, columnMap: ['date' => 'id'], ); $paginator = $this->dataTable->paginateQuery($query, $input->pagination); /** @var LengthAwarePaginator $ordersDtoPaginator */ $ordersDtoPaginator = $paginator->through(fn (Order $order): OrderDto => OrderDto::fromModel($order)); $searchFields = str(collect([ trans('validation.custom.attributes.reference'), trans_choice('models.classes.shops', 1), ])->implode(', '))->title()->value(); $orderStatusList = OrderStatus::cases(); return new GetBoPaginatedOrdersQueryOutput( orders: $ordersDtoPaginator, searchFields: $searchFields, orderStatusList: $orderStatusList, ); } }