![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/webshopapps/module-matrixrate/src/Model/Carrier/ |
<?php /** * WebShopApps * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * that is bundled with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to [email protected] so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * * WebShopApps MatrixRate * * @category WebShopApps * @package WebShopApps_MatrixRate * @copyright Copyright (c) 2014 Zowta LLC (http://www.WebShopApps.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @author WebShopApps Team [email protected] * */ /** * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ namespace WebShopApps\MatrixRate\Model\Carrier; use Magento\Framework\Exception\LocalizedException; use Magento\Quote\Model\Quote\Address\RateRequest; class Matrixrate extends \Magento\Shipping\Model\Carrier\AbstractCarrier implements \Magento\Shipping\Model\Carrier\CarrierInterface { /** * @var string */ protected $_code = 'matrixrate'; /** * @var bool */ protected $_isFixed = false; /** * @var string */ protected $defaultConditionName = 'package_weight'; /** * @var array */ protected $conditionNames = []; /** * @var \Magento\Shipping\Model\Rate\ResultFactory */ protected $rateResultFactory; /** * @var \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory */ protected $resultMethodFactory; /** * @var \WebShopApps\MatrixRate\Model\ResourceModel\Carrier\MatrixrateFactory */ protected $matrixrateFactory; /** * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory * @param \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $resultMethodFactory * @param \WebShopApps\MatrixRate\Model\ResourceModel\Carrier\MatrixrateFactory $matrixrateFactory * @param array $data * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function __construct( \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory, \Psr\Log\LoggerInterface $logger, \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory, \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $resultMethodFactory, \WebShopApps\MatrixRate\Model\ResourceModel\Carrier\MatrixrateFactory $matrixrateFactory, array $data = [] ) { $this->rateResultFactory = $rateResultFactory; $this->resultMethodFactory = $resultMethodFactory; $this->matrixrateFactory = $matrixrateFactory; parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data); foreach ($this->getCode('condition_name') as $k => $v) { $this->conditionNames[] = $k; } } /** * @param RateRequest $request * @return \Magento\Shipping\Model\Rate\Result * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function collectRates(RateRequest $request) { if (!$this->getConfigFlag('active')) { return false; } // exclude Virtual products price from Package value if pre-configured if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) { foreach ($request->getAllItems() as $item) { if ($item->getParentItem()) { continue; } if ($item->getHasChildren() && $item->isShipSeparately()) { foreach ($item->getChildren() as $child) { if ($child->getProduct()->isVirtual()) { $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal()); } } } elseif ($item->getProduct()->isVirtual()) { $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal()); } } } // Free shipping by qty $freeQty = 0; if ($request->getAllItems()) { $freePackageValue = 0; foreach ($request->getAllItems() as $item) { if ($item->getProduct()->isVirtual() || $item->getParentItem()) { continue; } if ($item->getHasChildren() && $item->isShipSeparately()) { foreach ($item->getChildren() as $child) { if ($child->getFreeShipping() && !$child->getProduct()->isVirtual()) { $freeShipping = is_numeric($child->getFreeShipping()) ? $child->getFreeShipping() : 0; $freeQty += $item->getQty() * ($child->getQty() - $freeShipping); } } } elseif ($item->getFreeShipping()) { $freeShipping = is_numeric($item->getFreeShipping()) ? $item->getFreeShipping() : 0; $freeQty += $item->getQty() - $freeShipping; $freePackageValue += $item->getBaseRowTotal(); } } $oldValue = $request->getPackageValue(); $request->setPackageValue($oldValue - $freePackageValue); } if (!$request->getConditionMRName()) { $conditionName = $this->getConfigData('condition_name'); $request->setConditionMRName($conditionName ? $conditionName : $this->defaultConditionName); } // Package weight and qty free shipping $oldWeight = $request->getPackageWeight(); $oldQty = $request->getPackageQty(); $request->setPackageWeight($request->getFreeMethodWeight()); $request->setPackageQty($oldQty - $freeQty); /** @var \Magento\Shipping\Model\Rate\Result $result */ $result = $this->rateResultFactory->create(); $zipRange = $this->getConfigData('zip_range'); $rateArray = $this->getRate($request, $zipRange); $request->setPackageWeight($oldWeight); $request->setPackageQty($oldQty); $foundRates = false; foreach ($rateArray as $rate) { if (!empty($rate) && $rate['price'] >= 0) { /** @var \Magento\Quote\Model\Quote\Address\RateResult\Method $method */ $method = $this->resultMethodFactory->create(); $method->setCarrier('matrixrate'); $method->setCarrierTitle($this->getConfigData('title')); $method->setMethod('matrixrate_' . $rate['pk']); $method->setMethodTitle(__($rate['shipping_method'])); if ($request->getFreeShipping() === true || $request->getPackageQty() == $freeQty) { $shippingPrice = 0; } else { $shippingPrice = $this->getFinalPriceWithHandlingFee($rate['price']); } $method->setPrice($shippingPrice); $method->setCost($rate['cost']); $result->append($method); $foundRates = true; // have found some valid rates } } if (!$foundRates) { /** @var \Magento\Quote\Model\Quote\Address\RateResult\Error $error */ $error = $this->_rateErrorFactory->create( [ 'data' => [ 'carrier' => $this->_code, 'carrier_title' => $this->getConfigData('title'), 'error_message' => $this->getConfigData('specificerrmsg'), ], ] ); $result->append($error); } return $result; } /** * @param \Magento\Quote\Model\Quote\Address\RateRequest $request * @param bool $zipRange * @return array|bool */ public function getRate(\Magento\Quote\Model\Quote\Address\RateRequest $request, $zipRange) { return $this->matrixrateFactory->create()->getRate($request, $zipRange); } /** * @param string $type * @param string $code * @return array * @throws \Magento\Framework\Exception\LocalizedException */ public function getCode($type, $code = '') { $codes = $this->getRawCodes(); if (!isset($codes[$type])) { throw new LocalizedException(__('Please correct Matrix Rate code type: %1.', $type)); } if ('' === $code) { return $codes[$type]; } if (!isset($codes[$type][$code])) { throw new LocalizedException(__('Please correct Matrix Rate code for type %1: %2.', $type, $code)); } return $codes[$type][$code]; } /** * Thanks to https://github.com/JeroenVanLeusden for this user submitted enhancement * * @return array */ public function getRawCodes(): array { return [ 'condition_name' => [ 'package_weight' => __('Weight vs. Destination'), 'package_value' => __('Order Subtotal vs. Destination'), 'package_qty' => __('# of Items vs. Destination') ], 'condition_name_short' => [ 'package_weight' => __('Weight'), 'package_value' => __('Order Subtotal'), 'package_qty' => __('# of Items') ] ]; } /** * Get allowed shipping methods * * @return array */ public function getAllowedMethods() { return ['matrixrate' => $this->getConfigData('name')]; } }