ldc-boutique-cnc-sable/app/Queries/Orders/GetBoOrderDetailQuery.php

60 lines
1.7 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace App\Queries\Orders;
use App\Contracts\Query;
use App\Contracts\QueryInput;
use App\Dto\OrderDto;
use App\Models\Customer;
use App\Services\CrmService;
use Domain\Models\ValueObjects\CrmCustomer;
use Illuminate\Contracts\Database\Query\Builder;
use Webmozart\Assert\Assert;
/**
* @implements \App\Contracts\Query<\App\Queries\Orders\GetBoOrderDetailQueryInput, \App\Queries\Orders\GetBoOrderDetailQueryOutput>
*/
final readonly class GetBoOrderDetailQuery implements Query
{
public function __construct(
private CrmService $crmService,
) {
}
#[\Override]
public function __invoke(QueryInput $input): GetBoOrderDetailQueryOutput
{
Assert::isInstanceOf($input, GetBoOrderDetailQueryInput::class);
$order = $input->order;
$order->load(['lines', 'shop']);
$orderDto = OrderDto::fromModel($order);
$shop = $orderDto->shop;
$employee = $orderDto->employee;
$linkedCustomer = $employee !== null
? Customer::query()
->whereHas('employee', fn (Builder $q) => $q->where(
'matricule',
$employee->matricule->value
))->first()
: null;
$crmCustomerResult = $linkedCustomer !== null
? $this->crmService->getCustomerFromHashCode($linkedCustomer->hashcode)
: null;
$crmCustomer = $crmCustomerResult instanceof CrmCustomer ? $crmCustomerResult : null;
return new GetBoOrderDetailQueryOutput(
order: $orderDto,
shop: $shop,
employee: $employee,
crmCustomer: $crmCustomer,
);
}
}