/** * Collect rates of given carrier * * @param string $carrierCode * @param \Magento\Sales\Model\Quote\Address\RateRequest $request * @return $this */ public function collectCarrierRates($carrierCode, $request) { /* @var $carrier \Magento\Shipping\Model\Carrier\AbstractCarrier */ $carrier = $this->_carrierFactory->createIfActive($carrierCode, $request->getStoreId()); if (!$carrier) { return $this; } $carrier->setActiveFlag($this->_availabilityConfigField); $result = $carrier->checkAvailableShipCountries($request); if (false !== $result && !$result instanceof \Magento\Sales\Model\Quote\Address\RateResult\Error) { $result = $carrier->proccessAdditionalValidation($request); } /* * Result will be false if the admin set not to show the shipping module * if the delivery country is not within specific countries */ if (false !== $result) { if (!$result instanceof \Magento\Sales\Model\Quote\Address\RateResult\Error) { if ($carrier->getConfigData('shipment_requesttype')) { $packages = $this->composePackagesForCarrier($carrier, $request); if (!empty($packages)) { $sumResults = array(); foreach ($packages as $weight => $packageCount) { $request->setPackageWeight($weight); $result = $carrier->collectRates($request); if (!$result) { return $this; } else { $result->updateRatePrice($packageCount); } $sumResults[] = $result; } if (!empty($sumResults) && count($sumResults) > 1) { $result = array(); foreach ($sumResults as $res) { if (empty($result)) { $result = $res; continue; } foreach ($res->getAllRates() as $method) { foreach ($result->getAllRates() as $resultMethod) { if ($method->getMethod() == $resultMethod->getMethod()) { $resultMethod->setPrice($method->getPrice() + $resultMethod->getPrice()); continue; } } } } } } else { $result = $carrier->collectRates($request); } } else { $result = $carrier->collectRates($request); } if (!$result) { return $this; } } if ($carrier->getConfigData('showmethod') == 0 && $result->getError()) { return $this; } // sort rates by price if (method_exists($result, 'sortRatesByPrice') && is_callable([$result, 'sortRatesByPrice'])) { $result->sortRatesByPrice(); } $this->getResult()->append($result); } return $this; }