ldc-boutique-cnc-sable/domain/Models/Entities/Order.php
2026-10-27 09:58:12 +01:00

68 lines
1.8 KiB
PHP

<?php
declare(strict_types=1);
namespace Domain\Models\Entities;
use Domain\Enums\OrderStatus;
use Domain\Models\ValueObjects\DeliveryAddress;
use Domain\Models\ValueObjects\Entities\OrderId;
use Domain\Models\ValueObjects\Entities\ShopId;
use Domain\Models\ValueObjects\OrderEmployee;
use Domain\Models\ValueObjects\OrderLine;
use Domain\Models\ValueObjects\OrderReference;
use Domain\Models\ValueObjects\PickupTimeSlot;
use Money\Money;
use Shared\DDD\Entity;
/** @implements \Shared\DDD\Entity<\Domain\Models\ValueObjects\Entities\OrderId> */
final class Order implements Entity
{
public function __construct(
public readonly OrderId $id,
public readonly ShopId $shopId,
public readonly OrderReference $reference,
public readonly OrderEmployee $employee,
public readonly DeliveryAddress $deliveryAddress,
public readonly PickupTimeSlot $pickupTimeSlot,
public OrderStatus $status,
private readonly Money $total,
/** @var OrderLine[] */
private array $lines,
) {
if ($total->getAmount() <= 0) {
throw new \DomainException('Total amount must be greater than zero');
}
foreach ($lines as $line) {
if (! ($line instanceof OrderLine)) {
throw new \DomainException('All lines must be instances of OrderLine');
}
}
}
#[\Override]
public function id(): OrderId
{
return $this->id;
}
public function getTotal(): Money
{
return $this->total;
}
/** @return OrderLine[] */
public function getLines(): array
{
return $this->lines;
}
public function cancel(): void
{
if ($this->status === OrderStatus::CANCELED) {
return;
}
$this->status = OrderStatus::CANCELED;
}
}