src/Domain/Product/Model/CartOrderPackage.php line 17

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 Doctrine\Common\Collections\Collection;
  6. use Ramsey\Uuid\Uuid;
  7. use Whater\Domain\Common\Exception\InvalidUUIDException;
  8. use Whater\Domain\Product\Exception\InvalidCartOrderPackageStatusException;
  9. /**
  10. * Class CartOrderPackage
  11. *
  12. * @package Whater\Domain\Product\Model
  13. */
  14. class CartOrderPackage implements ContainsRecordedEvents
  15. {
  16. use EventRecorderCapabilities;
  17. public const PACKAGE_STATUS_PENDING = "READY_TO_SEND";
  18. public const PACKAGE_STATUS_CANCELLED = "CANCELLED";
  19. public const PACKAGE_STATUS_PROCESSING = "PROCESSING";
  20. public const PACKAGE_STATUS_IN_TRANSIT = "IN_TRANSIT";
  21. public const PACKAGE_STATUS_DELIVERED = "DELIVERED";
  22. public const PACKAGE_STATUS_RETURNED = "RETURNED";
  23. public const PACKAGE_STATUS_EXCEPTION = "EXCEPTION";
  24. /**
  25. * @var string
  26. */
  27. private $uuid;
  28. /**
  29. * @var CartOrder
  30. */
  31. protected $cartOrder;
  32. /**
  33. * @var Collection
  34. */
  35. private $cartOrderItems;
  36. /**
  37. * @var string
  38. */
  39. private $status;
  40. /**
  41. * @var string
  42. */
  43. private $shipmentTrackingCode;
  44. /**
  45. * @var float
  46. */
  47. private $totalShippingCost;
  48. /**
  49. * @var string
  50. */
  51. private $shippingCountry;
  52. /**
  53. * @var string
  54. */
  55. private $shippingAddress;
  56. /**
  57. * @var string
  58. */
  59. private $shippingTown;
  60. /**
  61. * @var string
  62. */
  63. private $shippingPostalCode;
  64. /**
  65. * @var string
  66. */
  67. private $shippingMethodName;
  68. /**
  69. * @var string
  70. */
  71. private $notes;
  72. /**
  73. * @var string
  74. */
  75. protected $trackingUrl;
  76. /**
  77. * @var \DateTime
  78. */
  79. private $createdAt;
  80. /**
  81. * @var null|\DateTime
  82. */
  83. private $updatedAt;
  84. /**
  85. * @var null|\DateTime
  86. */
  87. private $shippedAt;
  88. /**
  89. * @param string $CartOrderPackage
  90. */
  91. public function __construct(
  92. ?string $cartOrderPackageId = null,
  93. CartOrder $cartOrder,
  94. Collection $cartOrderItems,
  95. ?string $status
  96. ) {
  97. try {
  98. $this->uuid = Uuid::fromString($cartOrderPackageId ?: Uuid::uuid4())->toString();
  99. } catch (\InvalidArgumentException $e) {
  100. throw new InvalidUUIDException();
  101. }
  102. switch ($status) {
  103. case CartOrderPackage::PACKAGE_STATUS_PENDING:
  104. case CartOrderPackage::PACKAGE_STATUS_CANCELLED:
  105. case CartOrderPackage::PACKAGE_STATUS_PROCESSING:
  106. case CartOrderPackage::PACKAGE_STATUS_IN_TRANSIT:
  107. case CartOrderPackage::PACKAGE_STATUS_DELIVERED:
  108. case CartOrderPackage::PACKAGE_STATUS_RETURNED:
  109. case CartOrderPackage::PACKAGE_STATUS_EXCEPTION:
  110. $this->status = $status;
  111. break;
  112. default:
  113. throw new InvalidCartOrderPackageStatusException();
  114. }
  115. $this->cartOrder = $cartOrder;
  116. $this->cartOrderItems = $cartOrderItems;
  117. $this->createdAt = new \DateTime();
  118. $this->updatedAt = new \DateTime();
  119. }
  120. public function updateShipmentTrackingCode(
  121. ?string $shipmentTrackingCode = null,
  122. ?\DateTime $shippedAt = null
  123. ) {
  124. $this->shipmentTrackingCode = $shipmentTrackingCode;
  125. $this->shippedAt = $shippedAt;
  126. }
  127. public function updateStatus(
  128. string $status
  129. ) {
  130. switch ($status) {
  131. case CartOrderPackage::PACKAGE_STATUS_PENDING:
  132. case CartOrderPackage::PACKAGE_STATUS_CANCELLED:
  133. case CartOrderPackage::PACKAGE_STATUS_PROCESSING:
  134. case CartOrderPackage::PACKAGE_STATUS_IN_TRANSIT:
  135. case CartOrderPackage::PACKAGE_STATUS_DELIVERED:
  136. case CartOrderPackage::PACKAGE_STATUS_RETURNED:
  137. case CartOrderPackage::PACKAGE_STATUS_EXCEPTION:
  138. $this->status = $status;
  139. break;
  140. default:
  141. throw new InvalidCartOrderPackageStatusException();
  142. }
  143. $this->updatedAt = new \DateTime();
  144. return $this;
  145. }
  146. public function updateShippingData(
  147. float $totalShippingCost = 0,
  148. ?string $shippingCountry = null,
  149. ?string $shippingAddress = null,
  150. ?string $shippingTown = null,
  151. ?string $shippingPostalCode = null,
  152. ?string $shippingMethodName = null
  153. ) {
  154. $this->totalShippingCost = $totalShippingCost;
  155. $this->shippingCountry = $shippingCountry;
  156. $this->shippingAddress = $shippingAddress;
  157. $this->shippingTown = $shippingTown;
  158. $this->shippingPostalCode = $shippingPostalCode;
  159. $this->shippingMethodName = $shippingMethodName;
  160. }
  161. public function updateNotes(
  162. string $notes
  163. ) {
  164. $this->notes = $notes;
  165. $this->updatedAt = new \DateTime();
  166. }
  167. public function updateTrackingUrl(
  168. ?string $trackingUrl = null
  169. ) {
  170. $this->trackingUrl = $trackingUrl;
  171. }
  172. /**
  173. * @return string
  174. */
  175. public function id(): string
  176. {
  177. return $this->uuid;
  178. }
  179. /**
  180. * @return CartOrder
  181. */
  182. public function cartOrder(): CartOrder
  183. {
  184. return $this->cartOrder;
  185. }
  186. /**
  187. * @return Collection
  188. */
  189. public function cartOrderItems(): Collection
  190. {
  191. return $this->cartOrderItems;
  192. }
  193. public function cartItem(int $index)
  194. {
  195. if (count($this->cartOrderItems()) >= $index) {
  196. return $this->cartOrderItems()->get($index);
  197. }
  198. return null;
  199. }
  200. /**
  201. * @return string
  202. */
  203. public function status(): string
  204. {
  205. return $this->status;
  206. }
  207. /**
  208. * @return float
  209. */
  210. public function totalShippingCost(): float
  211. {
  212. return $this->totalShippingCost;
  213. }
  214. /**
  215. * @return string
  216. */
  217. public function shippingCountry(): ?string
  218. {
  219. return $this->shippingCountry;
  220. }
  221. /**
  222. * @return string
  223. */
  224. public function shippingAddress(): ?string
  225. {
  226. return $this->shippingAddress;
  227. }
  228. /**
  229. * @return string
  230. */
  231. public function shippingPostalCode(): ?string
  232. {
  233. return $this->shippingPostalCode;
  234. }
  235. /**
  236. * @return string
  237. */
  238. public function shippingTown(): ?string
  239. {
  240. return $this->shippingTown;
  241. }
  242. /**
  243. * @return string
  244. */
  245. public function shippingMethodName(): ?string
  246. {
  247. return $this->shippingMethodName;
  248. }
  249. /**
  250. * @return string|null
  251. */
  252. public function notes(): ?string
  253. {
  254. return $this->notes;
  255. }
  256. /**
  257. * @return string|null
  258. */
  259. public function trackingUrl(): ?string
  260. {
  261. return $this->trackingUrl;
  262. }
  263. /**
  264. * @return \DateTime
  265. */
  266. public function createdAt(): \DateTime
  267. {
  268. return $this->createdAt;
  269. }
  270. /**
  271. * @return \DateTime|null
  272. */
  273. public function updatedAt(): ?\DateTime
  274. {
  275. return $this->updatedAt;
  276. }
  277. }