custom/plugins/FourtwosixThemeExtension/src/Subscriber/CheckoutSubscriber.php line 40

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace FourtwosixThemeExtension\Subscriber;
  3. use Shopware\Core\Checkout\Cart\Cart;
  4. use Shopware\Core\Checkout\Cart\LineItem\LineItem;
  5. use Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice;
  6. use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity;
  7. use Shopware\Core\Checkout\Order\OrderEntity;
  8. use Shopware\Core\Framework\Struct\ArrayStruct;
  9. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
  10. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  11. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  12. use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
  13. use Shopware\Storefront\Page\Checkout\Register\CheckoutRegisterPageLoadedEvent;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. class CheckoutSubscriber implements EventSubscriberInterface
  16. {
  17.     public static function getSubscribedEvents(): array
  18.     {
  19.         return [
  20.             CheckoutCartPageLoadedEvent::class => "onCartPageLoaded",
  21.             CheckoutConfirmPageLoadedEvent::class => "onConfirmPageLoaded",
  22.             CheckoutFinishPageLoadedEvent::class => "onFinishPageLoaded",
  23.             CheckoutRegisterPageLoadedEvent::class => "onCheckoutRegisterPageLoaded",
  24.             OffcanvasCartPageLoadedEvent::class => "onOffcanvasCartPageLoaded",
  25.         ];
  26.     }
  27.     public function onCartPageLoaded(CheckoutCartPageLoadedEvent $event): void
  28.     {
  29.         $this->addExtensionToCart($event->getPage()->getCart());
  30.     }
  31.     public function onConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void
  32.     {
  33.         $this->addExtensionToCart($event->getPage()->getCart());
  34.     }
  35.     public function onFinishPageLoaded(CheckoutFinishPageLoadedEvent $event): void
  36.     {
  37.         $this->addExtensionToCart($event->getPage()->getOrder());
  38.     }
  39.     public function onCheckoutRegisterPageLoaded(CheckoutRegisterPageLoadedEvent $event): void
  40.     {
  41.         $this->addExtensionToCart($event->getPage()->getCart());
  42.     }
  43.     public function onOffcanvasCartPageLoaded(OffcanvasCartPageLoadedEvent $event): void
  44.     {
  45.         $this->addExtensionToCart($event->getPage()->getCart());
  46.     }
  47.     private function addExtensionToCart(Cart|OrderEntity $cart): void
  48.     {
  49.         $promotionCompositionByLineItem = [];
  50.         /** @var LineItem $lineItem */
  51.         foreach ($cart->getLineItems() as $lineItem) {
  52.             if ($lineItem->getType() === LineItem::PROMOTION_LINE_ITEM_TYPE) {
  53.                 $compositions $lineItem->getPayload()["composition"] ?? [];
  54.                 $promotionCodeType =  $lineItem->getPayload()["promotionCodeType"] ?? [];
  55.                 $discountScope =  $lineItem->getPayload()["discountScope"] ?? [];
  56.                 $extensionArrayStruct = [];
  57.                 foreach ($compositions as $composition) {
  58.                     if (!isset($promotionCompositionByLineItem[$composition["id"]])) {
  59.                         $promotionCompositionByLineItem[$composition["id"]] = 0;
  60.                     }
  61.                     $promotionCompositionByLineItem[$composition["id"]] += $composition["discount"];
  62.                 }
  63.                 if($discountScope === "delivery"){
  64.                     $deliveries $cart->getDeliveries();
  65.                     $deliveryDiscount 0;
  66.                     foreach ($deliveries as $delivery) {
  67.                         $deliveryShippingPrice $delivery->getShippingCosts()->getTotalPrice();
  68.                         if( $deliveryShippingPrice 0){
  69.                             $deliveryDiscount += $deliveryShippingPrice;
  70.                         }
  71.                     }
  72.                     // @fourtwosix-edit calcualated deliveryDiscount
  73.                     $extensionArrayStruct["deliveryDiscount"] = $deliveryDiscount;
  74.                 }
  75.                 $extensionArrayStruct["isApplied"] = !empty($compositions) && $promotionCodeType === 'global';
  76.                 $lineItem->addExtension("fourtwosixThemeExtension", new ArrayStruct($extensionArrayStruct));
  77.             }
  78.         }
  79.         foreach ($cart->getLineItems() as $lineItem) {
  80.             if ($lineItem->getType() === LineItem::PRODUCT_LINE_ITEM_TYPE) {
  81.                 if ($lineItem instanceof OrderLineItemEntity) {
  82.                     $lineItem->addExtension("fourtwosixThemeExtension", new ArrayStruct([
  83.                         "appliedDiscount" => $promotionCompositionByLineItem[$lineItem->getProductId()] ?? 0,
  84.                     ]));
  85.                 } else {
  86.                     $lineItem->addExtension("fourtwosixThemeExtension", new ArrayStruct([
  87.                         "appliedDiscount" => $promotionCompositionByLineItem[$lineItem->getId()] ?? 0,
  88.                     ]));
  89.                 }
  90.             }
  91.         }
  92.     }
  93. }