<?phpnamespace Whater\Domain\Product\Model;use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\Common\Collections\Collection;use Ramsey\Uuid\Uuid;use Whater\Domain\Common\Exception\InvalidUUIDException;use Whater\Domain\Product\Model\Product;use Whater\Domain\User\Model\User;/** * Class ProductValoration * * @package Whater\Domain\Whater\Model */class ProductValoration implements ContainsRecordedEvents{ use EventRecorderCapabilities; public const WP_MAX_VALORATION = 5; public const WP_MIN_VALORATION = 0; /** * @var string */ private $uuid; /** * @var Product */ private $product; /** * @var CartOrderItem */ private $cartOrderItem; /** * @var User */ private $createdBy; /** * @var \DateTime */ private $createdAt; /** * @var string */ private $rating; public function __construct( string $productValorationId = null, CartOrderItem $cartOrderItem, User $createdBy, string $rating ) { try { $this->uuid = Uuid::fromString($productValorationId ?: Uuid::uuid4())->toString(); } catch (\InvalidArgumentException $e) { throw new InvalidUUIDException(); } $this->cartOrderItem = $cartOrderItem; $this->product = $cartOrderItem->product(); $this->createdBy = $createdBy; $this->createdAt = new \DateTime(); $this->updateValoration( $rating ); } public function updateValoration( string $rating = null ): ProductValoration { if (!$this->product()->valorations()->contains($this)) { $this->product()->valorations()->add($this); } if (!is_null($rating)) { $this->rating = $rating; } return $this; } /** * @return string */ public function id(): string { return $this->uuid; } /** * @return ProducCartOrderItemt */ public function cartOrderItem(): CartOrderItem { return $this->cartOrderItem; } /** * @return Product */ public function product(): Product { return $this->product; } /** * @return User */ public function createdBy(): User { return $this->createdBy; } /** * @return string */ public function rating(): ?string { return $this->rating; } /** * @return \DateTime */ public function createdAt(): \DateTime { return $this->createdAt; } /** * @return bool */ public function equals(ProductValoration $productValoration) { return $this->id() === $productValoration->id(); }}