custom/plugins/NieMehrStreichenTheme/src/Subscriber/AdditionalProductsBasedOnWeight.php line 44

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file has been created by developers from BitBag.
  4.  * Feel free to contact us once you face any issues or want to start.
  5.  * You can find more information about us on https://bitbag.io and write us an email on hello@bitbag.io.
  6.  */
  7. declare(strict_types=1);
  8. namespace NieMehrStreichenTheme\Subscriber;
  9. use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  12. use Shopware\Core\Checkout\Cart\LineItemFactoryRegistry;
  13. use Shopware\Core\Checkout\Cart\CartPersister;
  14. use Shopware\Core\System\SalesChannel\Context\SalesChannelContextService;
  15. use Shopware\Core\Checkout\Cart\Delivery\Struct\DeliveryCollection;
  16. class AdditionalProductsBasedOnWeight implements EventSubscriberInterface
  17. {
  18.     private CartService $cartService;
  19.     public function __construct(
  20.         CartService $cartService,
  21.         LineItemFactoryRegistry $factory,
  22.         CartPersister $cartPersister,
  23.         SalesChannelContextService $salesChannelContextService
  24.     ) {
  25.         $this->cartService $cartService;
  26.         $this->factory $factory;
  27.         $this->persister $cartPersister;
  28.         $this->salesChannelContextService $salesChannelContextService;
  29.     }
  30.     public static function getSubscribedEvents(): array
  31.     {
  32.         return [
  33.             CheckoutConfirmPageLoadedEvent::class => 'checkoutConfirmPageLoaded',
  34.         ];
  35.     }
  36.     public function checkoutConfirmPageLoaded(CheckoutConfirmPageLoadedEvent $event): void
  37.     {
  38.         $palletsAreInsideOfOrder false;
  39.         $totalWeight 0;
  40.         $palletsTotalQuantity 0;
  41.         $salesChannelContext $event->getSalesChannelContext();
  42.         $cart $this->cartService->getCart($event->getSalesChannelContext()->getToken(), $salesChannelContext);
  43.         
  44.         foreach($cart->getLineItems() as $item){
  45.             $referenceId $item->getReferencedId();
  46.             if($referenceId != "af4cb7dfb30e471fa583ca2a39d41b0e"){
  47.                 $deliveryInformation $item->getDeliveryInformation();
  48.                 
  49.                 if(method_exists($deliveryInformation"getWeight")){
  50.                     $totalWeight += $deliveryInformation->getWeight()*$item->getQuantity();
  51.                 }
  52.             } else {
  53.                 $palletsTotalQuantity += $item->getQuantity();
  54.                 $palletsLineItemID $item->getId();
  55.                 $palletsAreInsideOfOrder true;
  56.             }
  57.         }
  58.         
  59.         $shippingMethodId current($cart->getDeliveries()->getElements()[0]->getShippingMethod()->getPrices()->getElements())->getShippingMethodId();
  60.         
  61.         if($shippingMethodId != "7afc682a2dc44c42813b95f51789b5ea"){ // If its classic shipping (not pickup)
  62.             if($totalWeight >= 24){
  63.                 $countPallets = (int)ceil(($totalWeight/750));
  64.                 if($palletsAreInsideOfOrder == true){
  65.                     if($palletsTotalQuantity != $countPallets){
  66.                         $this->cartService->changeQuantity($cart$palletsLineItemID$countPallets$salesChannelContext);
  67.                         header("Location: /checkout/confirm");
  68.                         exit;
  69.                     }
  70.                 } else {
  71.                     $lineItem $this->factory->create([
  72.                         'type' => "product",
  73.                         'referencedId' => 'af4cb7dfb30e471fa583ca2a39d41b0e',
  74.                         'quantity' => 10
  75.                     ], $salesChannelContext);
  76.                     $cart->add($lineItem);
  77.                     $this->persister->save($cart$salesChannelContext);
  78.                     header("Location: /checkout/confirm");
  79.                     exit;
  80.                 }
  81.             } else {
  82.                 if($palletsAreInsideOfOrder == true){
  83.                     $cart->remove($palletsLineItemID);
  84.                     $this->persister->save($cart$salesChannelContext);
  85.                     header("Location: /checkout/confirm");
  86.                     exit;
  87.                 }
  88.             }
  89.         } else {
  90.             
  91.             //Delete if shipping method is pick-up and pallets are inside of a order
  92.             
  93.             if($palletsAreInsideOfOrder == true){
  94.                 $cart->remove($palletsLineItemID);
  95.                 $this->persister->save($cart$salesChannelContext);
  96.                 header("Location: /checkout/confirm");
  97.                 exit;
  98.             }
  99.         }
  100.     }
  101. }