59 lines
1.7 KiB
PHP
59 lines
1.7 KiB
PHP
<?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,
|
|
);
|
|
}
|
|
}
|