src/EventSubscribers/Main/CartSubscriber.php line 185

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscribers\Main;
  3. use App\Entity\Main\AffiliateNotificationConfig;
  4. use App\Entity\Main\Product;
  5. use App\Entity\Main\User;
  6. use App\Entity\Main\UserCreditNote;
  7. use App\Events\Main\Cart\CartChargedBackEvent;
  8. use App\Events\Main\Cart\CartCreatedEvent;
  9. use App\Events\Main\Cart\CartCreditNoteUsedEvent;
  10. use App\Events\Main\Cart\CartItemAddedEvent;
  11. use App\Events\Main\Cart\CartItemQuantityUpdatedEvent;
  12. use App\Events\Main\Cart\CartItemRemovedEvent;
  13. use App\Events\Main\Cart\CartRefundedEvent;
  14. use App\Events\Main\Coaching\CoachingClickedOffEvent;
  15. use App\Events\Main\Coaching\CoachingClickedOnEvent;
  16. use App\Services\CartManager;
  17. use App\Services\AffiliateNotificationManager;
  18. use App\Services\ReferralProgramManager;
  19. use App\Services\UserCreditNoteManager;
  20. use App\Services\UserManager;
  21. use phpDocumentor\Reflection\Types\This;
  22. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  23. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\RequestStack;
  26. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  27. /**
  28.  * Class CartSubscriber
  29.  * @package App\EventSubscribers\Main
  30.  */
  31. class CartSubscriber implements EventSubscriberInterface
  32. {
  33.     const
  34.         CART_ITEM_QTY_UPDATED 'cart.updateItemQuantity',
  35.         CART_ITEM_ADDED 'cart.itemAdded',
  36.         CART_ITEM_REMOVED 'cart.itemRemoved',
  37.         CART_CREATED 'cart.created',
  38.         CART_REFUND 'cart.refund',
  39.         CART_CHARGEBACK 'cart.chargeback',
  40.         CART_CREDIT_NOTE_USED 'cart.creditNoteUsed'
  41.     ;
  42.     /**
  43.      * @var SessionInterface
  44.      */
  45.     private $session;
  46.     /**
  47.      * @var EventDispatcherInterface
  48.      */
  49.     private $eventDispatcher;
  50.     /**
  51.      * @var CartManager
  52.      */
  53.     private $cartFactory;
  54.     /**
  55.      * @var UserManager
  56.      */
  57.     private $userManager;
  58.     /**
  59.      * @var ReferralProgramManager
  60.      */
  61.     private $referralProgramManager;
  62.     /**
  63.      * @var AffiliateNotificationManager
  64.      */
  65.     private $notificationManager;
  66.     private UserCreditNoteManager $userCreditNoteManager;
  67.     private ?Request $request;
  68.     /**
  69.      * CartSubscriber constructor.
  70.      * @param RequestStack $requestStack
  71.      * @param EventDispatcherInterface $eventDispatcher
  72.      * @param CartManager $cartFactory
  73.      * @param UserManager $userManager
  74.      * @param ReferralProgramManager $referralProgramManager
  75.      * @param AffiliateNotificationManager $notificationManager
  76.      * @param UserCreditNoteManager $userCreditNoteManager
  77.      */
  78.     public function __construct(
  79.         private RequestStack $requestStack,
  80.         EventDispatcherInterface $eventDispatcher,
  81.         CartManager $cartFactory,
  82.         UserManager $userManager,
  83.         ReferralProgramManager $referralProgramManager,
  84.         AffiliateNotificationManager $notificationManager,
  85.         UserCreditNoteManager $userCreditNoteManager
  86.     ) {
  87.         $this->request $this->requestStack->getCurrentRequest();
  88.         if ($this->request instanceof Request) {
  89.             $this->session $this->request->getSession();
  90.         }
  91.         $this->eventDispatcher $eventDispatcher;
  92.         $this->cartFactory $cartFactory;
  93.         $this->userManager $userManager;
  94.         $this->referralProgramManager $referralProgramManager;
  95.         $this->notificationManager $notificationManager;
  96.         $this->userCreditNoteManager $userCreditNoteManager;
  97.     }
  98.     /**
  99.      * @return array
  100.      */
  101.     public static function getSubscribedEvents()
  102.     {
  103.         return array(
  104.             self::CART_ITEM_QTY_UPDATED => "itemQuantityUpdated",
  105.             self::CART_ITEM_REMOVED => "itemRemoved",
  106.             self::CART_ITEM_ADDED => "itemAdded",
  107.             self::CART_CREATED => "cartCreated",
  108.             self::CART_REFUND => "cartRefund",
  109.             self::CART_CHARGEBACK => "cartChargeBack",
  110.             self::CART_CREDIT_NOTE_USED => "cartCreditNoteUsed"
  111.         );
  112.     }
  113.     /**
  114.      * Process stuff when a product quantity is changed.
  115.      * @param CartItemQuantityUpdatedEvent $event
  116.      */
  117.     public function itemQuantityUpdated(CartItemQuantityUpdatedEvent $event)
  118.     {
  119.         if ($event->getOldQuantity() == && $event->getNewQuantity() > 0) {
  120.             $newEvent = new CartItemAddedEvent($event->getCart(), $event->getPackProduct());
  121.             $this->eventDispatcher->dispatch($newEventself::CART_ITEM_ADDED);
  122.         } elseif ($event->getOldQuantity() > && $event->getNewQuantity() == 0) {
  123.             $newEvent = new CartItemRemovedEvent($event->getCart(), $event->getPackProduct());
  124.             $this->eventDispatcher->dispatch($newEventself::CART_ITEM_REMOVED);
  125.         }
  126.         if ($event->getPackProduct()->getProduct()->getProductType() == Product::ELECTRONIC_PRODUCT) {
  127.             // if he didn't change quantity but validated coaching we mark it :)
  128.             $this->session->set(CartManager::COACHING_CHOICE_SESSION_KEYtrue);
  129.             if (== $event->getOldQuantity() && == $event->getNewQuantity()) {
  130.                 $event = new CoachingClickedOnEvent($event->getCart());
  131.                 $this->eventDispatcher->dispatch($eventCoachingSubscriber::COACHING_CLICKED_ON);
  132.             } else {
  133.                 $event = new CoachingClickedOffEvent($event->getCart());
  134.                 $this->eventDispatcher->dispatch($eventCoachingSubscriber::COACHING_CLICKED_OFF);
  135.             }
  136.         }
  137.         // process what we want when wuantity is updated here :)
  138.     }
  139.     /**
  140.      * Process stuff when an item is removed from cart
  141.      * @param CartItemRemovedEvent $event
  142.      */
  143.     public function itemRemoved(CartItemRemovedEvent $event)
  144.     {
  145.         // Check if it is a coaching product. (for now it is electronic product)
  146.         if ($event->getPackProduct()->getProduct()->getProductType() == Product::ELECTRONIC_PRODUCT) {
  147.             $this->session->set(CartManager::NO_COACHING_SESSION_KEYtrue);
  148.             $this->session->set(CartManager::COACHING_CHOICE_SESSION_KEYtrue);
  149.         }
  150.     }
  151.     /**
  152.      * Process stuff when an item is added to the cart
  153.      * @param CartItemAddedEvent $event
  154.      */
  155.     public function itemAdded(CartItemAddedEvent $event)
  156.     {
  157.         // Check if it is a coaching product. (for now it is electronic product)
  158.         if ($event->getPackProduct()->getProduct()->getProductType() == Product::ELECTRONIC_PRODUCT && $event->getPackProduct()->getProductQuantity() > 0) {
  159.             $this->session->set(CartManager::NO_COACHING_SESSION_KEYfalse);
  160.             $this->session->set(CartManager::COACHING_CHOICE_SESSION_KEYtrue);
  161.         }
  162.         $this->notificationManager->addNotification($event->getCart()->getTracking(), $event->getCart(), AffiliateNotificationConfig::ADD_CART_ITEM);
  163.     }
  164.     /**
  165.      * @param CartCreatedEvent $event
  166.      * @throws \Exception
  167.      */
  168.     public function cartCreated(CartCreatedEvent $event)
  169.     {
  170.         if (($event->getUser() instanceof User && !$this->cartFactory->checkUserIsEligibleForCoaching($event->getUser()))
  171.             || $this->session->get(CartManager::NO_COACHING_SESSION_KEY)
  172.         ) {
  173.             $this->cartFactory->removeCoaching($event->getCart());
  174.         }
  175.     }
  176.     /**
  177.      * @param CartRefundedEvent $event
  178.      */
  179.     public function cartRefund(CartRefundedEvent $event)
  180.     {
  181.         $cart $event->getCart();
  182.         //disable promo code generated for the cart if it has been refunded.
  183.         $this->referralProgramManager->disablePromoCodeByCart($cart);
  184.     }
  185.     /**
  186.      * @param CartChargedBackEvent $event
  187.      */
  188.     public function cartChargeBack(CartChargedBackEvent $event)
  189.     {
  190.         $cart $event->getCart();
  191.         //disable promo code generated for the cart if it has been charged back.
  192.         $this->referralProgramManager->disablePromoCodeByCart($cart);
  193.     }
  194.     /**
  195.      * @param CartCreditNoteUsedEvent $event
  196.      */
  197.     public function cartCreditNoteUsed(CartCreditNoteUsedEvent $event)
  198.     {
  199.         $cart $event->getCart();
  200.         $cartTotal $event->getCartTotal();
  201.         $this->userCreditNoteManager->calculateLeftCreditNoteAmount($cart$cartTotal);
  202.     }
  203. }