ldc-boutique-cnc-sable/domain/Builders/OrderBuilder.php
2026-10-27 09:58:12 +01:00

85 lines
2 KiB
PHP

<?php
declare(strict_types=1);
namespace Domain\Builders;
use Domain\Models\Entities\Basket;
use Domain\Models\ValueObjects\Entities\ShopId;
use Domain\Models\ValueObjects\Entities\ShopperId;
use Domain\Models\ValueObjects\PickupTimeSlot;
class OrderBuilder implements OrderBuilderCompleted, OrderBuilderWithBasket
{
private ShopId $shopId;
private PickupTimeSlot $pickupTimeSlot;
private function __construct(
private OrderBuilderType $type,
private Basket $basket,
public readonly ShopperId $shopperId,
) {
}
#[\Override]
public function isFromBasket(): bool
{
return in_array($this->type, [OrderBuilderType::FROM_BASKET, OrderBuilderType::WITH_PICKUP, OrderBuilderType::COMPLETED], true);
}
#[\Override]
public function isCompleted(): bool
{
return in_array($this->type, [OrderBuilderType::WITH_PICKUP, OrderBuilderType::COMPLETED], true);
}
#[\Override]
public function getBuilderType(): OrderBuilderType
{
return $this->type;
}
#[\Override]
public function withPickupTimeSlot(ShopId $shopId, PickupTimeSlot $timeSlot): OrderBuilderCompleted
{
$this->type = OrderBuilderType::WITH_PICKUP;
$this->shopId = $shopId;
$this->pickupTimeSlot = $timeSlot;
return $this;
}
#[\Override]
public function getBasket(): Basket
{
return $this->basket;
}
#[\Override]
public function getShopperId(): ShopperId
{
return $this->shopperId;
}
#[\Override]
public function getShopId(): ShopId
{
return $this->shopId;
}
#[\Override]
public function getPickupTimeSlot(): PickupTimeSlot
{
return $this->pickupTimeSlot;
}
public static function fromBasket(Basket $basket, ShopperId $shopperId): OrderBuilderWithBasket
{
return new self(
OrderBuilderType::FROM_BASKET,
$basket,
$shopperId
);
}
}