custom/plugins/CioFixDuplicateDiscounts/src/Subscriber/FixDuplicateShippingCosts.php line 31

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace CioFixDuplicateDiscounts\Subscriber;
  3. use Shopware\Core\Checkout\Cart\Delivery\Struct\DeliveryCollection;
  4. use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection;
  5. use Shopware\Storefront\Page\Checkout\Cart\CheckoutCartPageLoadedEvent;
  6. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  7. use Shopware\Storefront\Page\Checkout\Finish\CheckoutFinishPageLoadedEvent;
  8. use Shopware\Storefront\Page\Checkout\Offcanvas\OffcanvasCartPageLoadedEvent;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. class FixDuplicateShippingCosts implements EventSubscriberInterface
  11. {
  12.     public static function getSubscribedEvents(): array
  13.     {
  14.         return [
  15.             OffcanvasCartPageLoadedEvent::class => 'removeDuplicateShippingCosts',
  16.             CheckoutCartPageLoadedEvent::class => 'removeDuplicateShippingCosts',
  17.             CheckoutConfirmPageLoadedEvent::class => 'removeDuplicateShippingCosts',
  18.             CheckoutFinishPageLoadedEvent::class => 'removeDuplicateShippingCosts'
  19.         ];
  20.     }
  21.     /**
  22.      * @param OffcanvasCartPageLoadedEvent|CheckoutCartPageLoadedEvent|CheckoutConfirmPageLoadedEvent|CheckoutFinishPageLoadedEvent $event
  23.      * @return void
  24.      */
  25.     public function removeDuplicateShippingCosts($event)
  26.     {
  27.         $page = $event->getPage();
  28.         if ($event instanceof CheckoutFinishPageLoadedEvent) {
  29.             $deliveries = $page->getOrder()->getDeliveries();
  30.         } else {
  31.             $deliveries = $page->getCart()->getDeliveries();
  32.         }
  33.         $page->assign(['shippingCostsNegated' => $this->checkDuplicateShippingCosts($deliveries)]);
  34.     }
  35.     /**
  36.      * @param DeliveryCollection|OrderDeliveryCollection $deliveryCollection
  37.      * @return bool
  38.      */
  39.     private function checkDuplicateShippingCosts($deliveryCollection): bool
  40.     {
  41.         if (count($deliveryCollection) > 1) {
  42.             $price = 0;
  43.             foreach ($deliveryCollection as $delivery) {
  44.                 $price += $delivery->getShippingCosts()->getUnitPrice();
  45.             }
  46.             if ($price == 0) {
  47.                 return true;
  48.             }
  49.         }
  50.         return false;
  51.     }
  52. }