85 lines
2 KiB
PHP
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
|
|
);
|
|
}
|
|
}
|