2026-06-14 21:32:07 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace Domain\Services;
|
|
|
|
|
|
|
|
|
|
use Domain\Models\Entities\Basket;
|
|
|
|
|
use Domain\Models\Entities\Order;
|
|
|
|
|
use Domain\Models\Entities\Shop;
|
|
|
|
|
use Domain\Models\Entities\Shopper;
|
|
|
|
|
use Domain\Models\ValueObjects\Entities\OrderId;
|
|
|
|
|
use Domain\Models\ValueObjects\OrderReference;
|
|
|
|
|
use Domain\Models\ValueObjects\PickupTimeSlot;
|
|
|
|
|
use Domain\Ports\Repositories\OrderRepository;
|
|
|
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
|
|
|
|
|
|
class OrderService
|
|
|
|
|
{
|
|
|
|
|
public function __construct(
|
|
|
|
|
private readonly OrderRepository $orderRepository,
|
|
|
|
|
) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function createOrderFromBasket(
|
|
|
|
|
Basket $basket,
|
|
|
|
|
PickupTimeSlot $pickupTimeSlot,
|
|
|
|
|
Shopper $shopper,
|
|
|
|
|
Shop $shop
|
|
|
|
|
): Order {
|
2026-10-29 20:21:32 +01:00
|
|
|
return Order::fromBasket(
|
2026-06-14 21:32:07 +02:00
|
|
|
id: $this->newOrderId(),
|
|
|
|
|
reference: $this->newReference(),
|
2026-10-29 20:21:32 +01:00
|
|
|
basket: $basket,
|
|
|
|
|
pickupTimeSlot: $pickupTimeSlot,
|
|
|
|
|
shopper: $shopper,
|
|
|
|
|
shop: $shop
|
2026-06-14 21:32:07 +02:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function newOrderId(): OrderId
|
|
|
|
|
{
|
|
|
|
|
return new OrderId(Uuid::uuid7());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private function newReference(): OrderReference
|
|
|
|
|
{
|
2026-10-03 10:51:42 +02:00
|
|
|
return new OrderReference(Uuid::uuid7());
|
2026-06-14 21:32:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function cancelOrder(OrderId $id): void
|
|
|
|
|
{
|
|
|
|
|
$order = $this->orderRepository->find($id);
|
|
|
|
|
|
|
|
|
|
if (! $order) {
|
|
|
|
|
throw new \DomainException('Order not found');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$order->cancel();
|
|
|
|
|
|
|
|
|
|
$this->orderRepository->persist($order);
|
|
|
|
|
}
|
|
|
|
|
}
|