src/EventSubscriber/Shipping/CsrCarrierRatesSubscriber.php line 80

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Shipping;
  3. use App\Ecommerce\Model\Order;
  4. use App\Model\Customer;
  5. use App\Model\Product;
  6. use App\Repository\OrderRepository;
  7. use Factory\CartBundle\Classes\Traits\Controller\GetCartTrait;
  8. use Factory\ShippingBundle\Classes\Carrier\DeAddress;
  9. use Factory\ShippingBundle\Classes\Carrier\SimplePackage;
  10. use Factory\ShippingBundle\Classes\Carrier\UsAddress;
  11. use Factory\ShippingBundle\Classes\ShippingEvents;
  12. use Factory\ShippingBundle\Contract\Carrier\AddressContract;
  13. use Factory\ShippingBundle\Contract\Carrier\PackageContract;
  14. use Factory\ShippingBundle\Event\ShippingEvent;
  15. use Pimcore;
  16. use Pimcore\Bundle\EcommerceFrameworkBundle\Factory;
  17. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  18. use Pimcore\Model\DataObject\Data\QuantityValue;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\RequestStack;
  21. use Pimcore\Model\WebsiteSetting;
  22. class CsrCarrierRatesSubscriber implements EventSubscriberInterface
  23. {
  24.     use GetCartTrait;
  25.     /**
  26.      * @var RequestStack
  27.      */
  28.     protected $requestStack;
  29.     /**
  30.      * @var OrderRepository
  31.      */
  32.     protected $orderRepository;
  33.     public static function getSubscribedEvents()
  34.     {
  35.         return [
  36.             ShippingEvents::GET_SINGLE_CARRIER_RATES_BEFORE => [
  37.                 ['updatePackageAndAddress'10]
  38.             ]
  39.         ];
  40.     }
  41.     public function __construct(RequestStack $requestStackOrderRepository $orderRepository)
  42.     {
  43.         $this->requestStack $requestStack;
  44.         $this->orderRepository $orderRepository;
  45.     }
  46.     /**
  47.      * This method is used by GetCartTrait
  48.      *
  49.      * @param string $serviceName
  50.      *
  51.      * @return object
  52.      */
  53.     protected function get(string $serviceName)
  54.     {
  55.         return Pimcore::getContainer()->get($serviceName);
  56.     }
  57.     /**
  58.      * @return null|Customer
  59.      */
  60.     protected function getUser()
  61.     {
  62.         $order $this->getOrderFromReferer();
  63.         if ($order && $order->getCustomer()) {
  64.             return $order->getCustomer();
  65.         }
  66.         return null;
  67.     }
  68.     public function updatePackageAndAddress(ShippingEvent $event)
  69.     {
  70.         if (!$this->getUser()) {
  71.             return;
  72.         }
  73.         $event->setArgument(
  74.             'package',
  75.             $this->getPackage($event->getArgument('package'), $event)
  76.         );
  77.         $event->setArgument(
  78.             'sourceAddress',
  79.             $this->getSourceAddress($event->getArgument('sourceAddress'), $event,'default')
  80.         );
  81.         $event->setArgument(
  82.             'destinationAddress',
  83.             $this->getDestinationAddress($event->getArgument('destinationAddress'), $event)
  84.         );
  85.         $event->setArgument(
  86.             'options',
  87.             $this->getOptions($event->getArgument('options'), $event)
  88.         );
  89.     }
  90.     protected function getPackage(PackageContract $packageShippingEvent $event)
  91.     {
  92.         $weights = [];
  93.         foreach ($this->getPackageItems() as $item) {
  94.             $weights[] = [
  95.                 'weight' => $item->getProduct()->getWeight(),
  96.                 'quantity' => $item->getCount()
  97.             ];
  98.         }
  99.         $package->setWeight($this->addQuantityValues($weights,'lb'));
  100.         return $package;
  101.     }
  102.     protected function getSourceAddress(AddressContract $sourceAddressShippingEvent $eventstring $destRegion 'default')
  103.     {
  104.         if ($setting WebsiteSetting::getByName($destRegion.'_storage_city')) {
  105.             $sourceAddress->setCity($setting->getData() ?? '');
  106.         }
  107.         if ($setting WebsiteSetting::getByName($destRegion.'_storage_zip_code')) {
  108.             $sourceAddress->setZipCode($setting->getData() ?? '');
  109.         }
  110.         if ($setting WebsiteSetting::getByName($destRegion.'_storage_country')) {
  111.             $sourceAddress->setCountryCode($setting->getData() ?? '');
  112.         }
  113.         return $sourceAddress;
  114.     }
  115.     protected function getDestinationAddress(AddressContract $destinationAddressShippingEvent $event)
  116.     {
  117.         $address $this->getAddress();
  118.         $destinationAddress->setCity($address->getCity());
  119.         $destinationAddress->setZipCode($address->getZipCode());
  120.         $destinationAddress->setCountryCode($address->getCountry());
  121.         $destinationAddress->setState($address->getState());
  122.         return $destinationAddress;
  123.     }
  124.     protected function getOptions(array $optionsShippingEvent $event)
  125.     {
  126.         return [];
  127.     }
  128.     protected function getAddress()
  129.     {
  130.         if ($this->isCsrOrdering()) {
  131.             $addressId 'delivery';
  132.         } else {
  133.             $addressId $this->getRequest()->cookies->get('__shipping_address_id');
  134.         }
  135.         $address $this->getUser()->getDefaultShippingAddressObject();
  136.         if ($addressId == 'delivery') {
  137.             $address $this->getAddressFromOrder();
  138.         } else {
  139.             $address $this->getUser()->getAddress($addressId);
  140.         }
  141.         if (!$address) {
  142.             throw new \Exception("Customer must have default shipping address!");
  143.         }
  144.         return $address;
  145.     }
  146.     protected function getAddressFromOrder()
  147.     {
  148.         $order $this->getOrderFromReferer();
  149.         if (!$order) {
  150.             return null;
  151.         }
  152.         return $this->orderRepository->createAddressFromOrder('delivery'$order);
  153.     }
  154.     protected function getOrderFromReferer()
  155.     {
  156.         if ($this->isCsrOrdering()) {
  157.             return Order::getById($this->getRequest()->get('order'));
  158.         }
  159.         return null;
  160.     }
  161.     /**
  162.      * @param  array $values
  163.      *
  164.      * @return QuantityValue
  165.      */
  166.     private function addQuantityValues(array $valuesstring $unit)
  167.     {
  168.         $value 0;
  169.         foreach ($values as $val) {
  170.             $value += $this->convert($val['weight'], $unit)->getValue() * $val['quantity'];
  171.         }
  172.         return new QuantityValue($value$unit);
  173.     }
  174.     /**
  175.      * @return Product[]
  176.      */
  177.     private function getPackageItems()
  178.     {
  179.         $order $this->getOrderFromReferer();
  180.         return $order->getItems();
  181.     }
  182.     /**
  183.      * @return boolean
  184.      */
  185.     private function isOrderingQuoteProcess(): bool
  186.     {
  187.         $httpReferer $this->getRequest()->server->get('HTTP_REFERER');
  188.         return preg_match('/\/(order\-quote)\/(.*)/'$httpReferer$matches);
  189.     }
  190.     private function isCsrOrdering(): bool
  191.     {
  192.         return !!$this->getRequest()->get('order');
  193.     }
  194.     protected function getRequest(): Request
  195.     {
  196.         return $this->requestStack->getCurrentRequest();
  197.     }
  198.     /**
  199.      * @param QuantityValue $value
  200.      * @param string $targetUnit
  201.      *
  202.      * @return QuantityValue
  203.      */
  204.     private function convert(QuantityValue $valuestring $targetUnit)
  205.     {
  206.         return $value;
  207.     }
  208. }