I want to override _getXmlQuotes() function to set a condition for price based on discount but it's not working anyone has an idea about it?
i have created di.xml to override model/carrier:
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <preference for="Magento\Ups\Model\Carrier" type="Vendor\Mymodule\Model\Carrier" /> </config> Created Model to override inbuilt model of ups:
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ //declare(strict_types=1); namespace Vendor\Module\Model; use Magento\Quote\Model\Quote\Address\RateResult\Error; use Magento\Quote\Model\Quote\Address\RateRequest; use Magento\Shipping\Model\Carrier\AbstractCarrierOnline; use Magento\Shipping\Model\Carrier\CarrierInterface; use Magento\Shipping\Model\Rate\Result; use Magento\Shipping\Model\Simplexml\Element; use Magento\Ups\Helper\Config; use Magento\Framework\Xml\Security; use Magento\Framework\HTTP\AsyncClientInterface; /** * UPS shipping implementation * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class Carrier extends \Magento\Ups\Model\Carrier { /** * Collect and get rates/errors * * @param RateRequest $request * @return Result|Error|bool */ public function collectRates(RateRequest $request) { $this->setRequest($request); if (!$this->canCollectRates()) { return $this->getErrorMessage(); } $this->setRequest($request); //To use the correct result in the callback. $this->_result = $result = $this->_getQuotes(); return $this->deferredProxyFactory->create( [ 'deferred' => new CallbackDeferred( function () use ($request, $result) { $this->_result = $result; $this->_updateFreeMethodQuote($request); return $this->getResult(); } ) ] ); } /** * Do remote request for and handle errors * * @return Result|null */ protected function _getQuotes() { switch ($this->getConfigData('type')) { case 'UPS': return $this->_getCgiQuotes(); case 'UPS_XML': return $this->_getXmlQuotes(); default: break; } return null; } /** * Prepare shipping rate result based on response * * @param mixed $xmlResponse * @return Result * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * @SuppressWarnings(PHPMD.ElseExpression) */ protected function _parseXmlResponse($xmlResponse) { $costArr = []; $priceArr = []; if (strlen(trim($xmlResponse)) > 0) { $xml = new \Magento\Framework\Simplexml\Config(); $xml->loadString($xmlResponse); $arr = $xml->getXpath("//RatingServiceSelectionResponse/Response/ResponseStatusCode/text()"); $success = (int)$arr[0]; if ($success === 1) { $arr = $xml->getXpath("//RatingServiceSelectionResponse/RatedShipment"); $allowedMethods = explode(",", $this->getConfigData('allowed_methods')); // Negotiated rates $negotiatedArr = $xml->getXpath("//RatingServiceSelectionResponse/RatedShipment/NegotiatedRates"); $negotiatedActive = $this->getConfigFlag('negotiated_active') && $this->getConfigData('shipper_number') && !empty($negotiatedArr); $allowedCurrencies = $this->_currencyFactory->create()->getConfigAllowCurrencies(); foreach ($arr as $shipElement) { $this->processShippingRateForItem( $shipElement, $allowedMethods, $allowedCurrencies, $costArr, $priceArr, $negotiatedActive, $xml ); } } else { $arr = $xml->getXpath("//RatingServiceSelectionResponse/Response/Error/ErrorDescription/text()"); $errorTitle = (string)$arr[0][0]; $error = $this->_rateErrorFactory->create(); $error->setCarrier('ups'); $error->setCarrierTitle($this->getConfigData('title')); $error->setErrorMessage($this->getConfigData('specificerrmsg')); } } $result = $this->_rateFactory->create(); if (empty($priceArr)) { $error = $this->_rateErrorFactory->create(); $error->setCarrier('ups'); $error->setCarrierTitle($this->getConfigData('title')); if ($this->getConfigData('specificerrmsg') !== '') { $errorTitle = $this->getConfigData('specificerrmsg'); } if (!isset($errorTitle)) { $errorTitle = __('Cannot retrieve shipping rates'); } $error->setErrorMessage($errorTitle); $result->append($error); } else { foreach ($priceArr as $method => $price) { $rate = $this->_rateMethodFactory->create(); $rate->setCarrier('ups'); $rate->setCarrierTitle($this->getConfigData('title')); $rate->setMethod($method); $methodArr = $this->getShipmentByCode($method); $rate->setMethodTitle($methodArr); $rate->setCost($costArr[$method]); //update price based on shipping discount /* $shippingDiscount = 45; //$this->getConfigData('shipping_discount'); $shippingRate = ($shippingDiscount * $price) / 100; $price = $price - $shippingRate; */ $rate->setPrice($price); $result->append($rate); } } return $result; }