src/EventSubscriber/ECommerce/CartSubscriber.php line 43

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber\ECommerce;
  4. use App\Entity\ECommerce\Cart;
  5. use App\Entity\ECommerce\CartItem;
  6. use App\Event\ECommerce\CartCheckedOutEvent;
  7. use App\Event\ECommerce\CartEvent;
  8. use App\Event\ECommerce\CartItemAddedEvent;
  9. use App\Event\ECommerce\CartLoadedEvent;
  10. use App\Event\ECommerce\CartPayedEvent;
  11. use App\Event\ECommerce\CartUpdatedEvent;
  12. use App\Service\ECommerce\CartCalculator;
  13. use App\Service\ECommerce\EmailNotifier;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. /**
  16. * Class CartSubscriber
  17. *
  18. * @package App\EventSubscriber\ECommerce
  19. */
  20. class CartSubscriber implements EventSubscriberInterface
  21. {
  22. /**
  23. * CartSubscriber constructor.
  24. */
  25. public function __construct(private readonly CartCalculator $cartCalculator, private readonly EmailNotifier $notifier)
  26. {
  27. }
  28. public static function getSubscribedEvents(): array
  29. {
  30. return [
  31. CartUpdatedEvent::class => 'onCartUpdated',
  32. CartLoadedEvent::class => 'onCartLoaded',
  33. CartItemAddedEvent::class => 'onCartItemAdded',
  34. CartPayedEvent::class => 'onCartPayed',
  35. CartCheckedOutEvent::class => 'onCartCheckedOut'
  36. ];
  37. }
  38. public function onCartUpdated(CartEvent $event): void
  39. {
  40. /** @var Cart $cart */
  41. $cart = $event->getCart();
  42. $this->cartCalculator->reCalc($cart);
  43. }
  44. public function onCartLoaded(CartEvent $event): void
  45. {
  46. /** @var Cart $cart */
  47. $cart = $event->getCart();
  48. if ($cart->isCheckedOut()) {
  49. return;
  50. }
  51. $this->cartCalculator->reCalc($cart);
  52. /** @var CartItem $item */
  53. foreach ($cart->getItems() as $item) {
  54. if ($item->getMinDeliveryDate() > $item->getDeliverDate()) {
  55. $item->setDeliverDate($item->getMinDeliveryDate());
  56. }
  57. }
  58. }
  59. /**
  60. * @ToDo reevaluate logic
  61. */
  62. public function onCartItemAdded(CartEvent $event): void
  63. {
  64. /** @var Cart $cart */
  65. $cart = $event->getCart();
  66. $oldItems = $cart->getItems()->toArray();
  67. $uniqueItems = [];
  68. $duplicatedItems = [];
  69. /** @var CartItem $oldItem */
  70. foreach ($oldItems as $oldItem) {
  71. $existingItem = array_filter($uniqueItems, fn(CartItem $uniqueItem): bool => $uniqueItem->getDepot()->getId() === $oldItem->getDepot()->getId() && $uniqueItem->getProduct()->getId() === $oldItem->getProduct()->getId());
  72. if ($existingItem === []) {
  73. $uniqueItems[] = $oldItem;
  74. continue;
  75. }
  76. $duplicatedItems[] = $oldItem;
  77. }
  78. $duplicatedItems = array_unique($duplicatedItems, SORT_REGULAR);
  79. /** @var CartItem $duplicatedItem */
  80. foreach ($duplicatedItems as $duplicatedItem) {
  81. $uniqueItems = array_map(function (CartItem $cartItem) use ($duplicatedItem): CartItem {
  82. if (
  83. $cartItem->getProduct()->getId() === $duplicatedItem->getProduct()->getId()
  84. && $cartItem->getDepot()->getId() === $duplicatedItem->getDepot()->getId()
  85. ) {
  86. $newQuantity = $cartItem->getQuantity() + $duplicatedItem->getQuantity();
  87. $cartItem->setQuantity($newQuantity);
  88. $this->cartCalculator->calcItem($cartItem);
  89. }
  90. return $cartItem;
  91. }, $uniqueItems);
  92. }
  93. $cart->setItems($uniqueItems);
  94. // $this->cartCalculator->reCalc($cart);
  95. }
  96. /**
  97. * @throws \Exception
  98. */
  99. public function onCartCheckedOut(CartEvent $event): void
  100. {
  101. /** @var Cart $cart */
  102. $cart = $event->getCart();
  103. $cart->setCheckedOutAt(new \DateTime());
  104. $this->notifier->send($cart);
  105. }
  106. public function onCartPayed(CartEvent $event): void
  107. {
  108. }
  109. }