src/Domain/Product/Model/ProductVariation.php line 15

Open in your IDE?
  1. <?php
  2. namespace Whater\Domain\Product\Model;
  3. use BornFree\TacticianDomainEvent\Recorder\ContainsRecordedEvents;
  4. use BornFree\TacticianDomainEvent\Recorder\EventRecorderCapabilities;
  5. use Ramsey\Uuid\Uuid;
  6. use Whater\Domain\Common\Exception\InvalidUUIDException;
  7. /**
  8. * Class ProductVariation
  9. *
  10. * @package Whater\Domain\Product\Model
  11. */
  12. class ProductVariation implements ContainsRecordedEvents
  13. {
  14. use EventRecorderCapabilities;
  15. /**
  16. * @var string
  17. */
  18. private $uuid;
  19. /**
  20. * @var string
  21. */
  22. private $productVariationShortDescription;
  23. /**
  24. * @var string
  25. */
  26. private $productVariationDescription;
  27. /**
  28. * @var float
  29. */
  30. private $productVariationPrice;
  31. /**
  32. * @var Product
  33. */
  34. private $product;
  35. /**
  36. * @var array
  37. */
  38. private $productVariationAttributes;
  39. /**
  40. * @var string
  41. */
  42. protected $checksum;
  43. /**
  44. * @var \DateTime
  45. */
  46. private $createdAt;
  47. /**
  48. * @var null|\DateTime
  49. */
  50. private $updatedAt;
  51. /**
  52. * @param string $productVariationId
  53. */
  54. public function __construct(
  55. string $productVariationId = null,
  56. Product $product,
  57. float $productVariationPrice,
  58. array $productVariationAttributes,
  59. string $productVariationShortDescription = null,
  60. string $productVariationDescription = null
  61. ) {
  62. try {
  63. $this->uuid = Uuid::fromString($productVariationId ?: Uuid::uuid4())->toString();
  64. } catch (\InvalidArgumentException $e) {
  65. throw new InvalidUUIDException();
  66. }
  67. $this->productVariationShortDescription = $productVariationShortDescription;
  68. $this->productVariationDescription = $productVariationDescription;
  69. $this->productVariationPrice = $productVariationPrice;
  70. $this->productVariationAttributes = $productVariationAttributes;
  71. $this->product = $product;
  72. $this->createdAt = new \DateTime();
  73. $this->updatedAt = new \DateTime();
  74. // Calculate checksum
  75. $hash = md5($this->product()->id());
  76. $hash = md5($hash . json_encode($this->productVariationAttributes()));
  77. $this->checksum = $hash;
  78. }
  79. public function editProductVariation(
  80. float $productVariationPrice,
  81. array $productVariationAttributes,
  82. string $productVariationShortDescription = null,
  83. string $productVariationDescription = null
  84. ) {
  85. $this->productVariationAttributes = $productVariationAttributes;
  86. $this->productVariationShortDescription = $productVariationShortDescription;
  87. $this->productVariationDescription = $productVariationDescription;
  88. $this->productVariationPrice = $productVariationPrice;
  89. $hash = md5($this->product()->id());
  90. $hash = md5($hash . json_encode($this->productVariationAttributes()));
  91. $this->checksum = $hash;
  92. $this->updatedAt = new \DateTime();
  93. }
  94. /**
  95. * @return string
  96. */
  97. public function id(): string
  98. {
  99. return $this->uuid;
  100. }
  101. /**
  102. * @return string
  103. */
  104. public function productVariationShortDescription(): ?string
  105. {
  106. return $this->productVariationShortDescription;
  107. }
  108. /**
  109. * @return string
  110. */
  111. public function productVariationDescription(): ?string
  112. {
  113. return $this->productVariationDescription;
  114. }
  115. /**
  116. * @return float
  117. */
  118. public function productVariationPrice(): float
  119. {
  120. return $this->productVariationPrice;
  121. }
  122. /**
  123. * @return string
  124. */
  125. public function checksum(): string
  126. {
  127. return $this->checksum;
  128. }
  129. /**
  130. * @return \DateTime
  131. */
  132. public function createdAt(): \DateTime
  133. {
  134. return $this->createdAt;
  135. }
  136. /**
  137. * @return \DateTime|null
  138. */
  139. public function updatedAt()
  140. {
  141. return $this->updatedAt;
  142. }
  143. public function productVariationAttributes(): ?array
  144. {
  145. return $this->productVariationAttributes;
  146. }
  147. /**
  148. * @return Product
  149. */
  150. public function product()
  151. {
  152. return $this->product;
  153. }
  154. /**
  155. * @return bool
  156. */
  157. public function equals(ProductVariation $productVariation)
  158. {
  159. return $this->id() === $productVariation->id();
  160. }
  161. }