![]() 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/Ecombricks/InventoryQuote/Model/Quote/Address/ |
<?php /** * Copyright © eComBricks. All rights reserved. * See LICENSE.txt for license details. */ namespace Ecombricks\InventoryQuote\Model\Quote\Address; /** * Quote address source trait */ trait SourceTrait { /** * Get source codes * * @return array */ public function getSourceCodes() { $sourceCodes = []; foreach ($this->getAllItems() as $item) { $sourceCode = $item->getSourceCode(); if (empty($sourceCode)) { continue; } if (in_array($sourceCode, $sourceCodes)) { continue; } $sourceCodes[] = $sourceCode; } return $sourceCodes; } /** * Reset source items collection * * @return $this */ protected function resetSourceItemsCollection() { $sourceCode = $this->getSourceCode(); if (empty($sourceCode)) { return $this; } $itemsCollection = $this->getItemsCollection(); $sourceItemsCollection = clone $itemsCollection; foreach ($itemsCollection as $itemKey => $item) { $sourceItemsCollection->removeItemByKey($itemKey); } foreach ($itemsCollection as $item) { if ($item->getSourceCode() !== $sourceCode || $item->getParentItem()) { continue; } $sourceItem = clone $item; $sourceItem->setId($item->getId()); $sourceItem->setAddress($this); foreach ($item->getChildren() as $childItem) { if ($childItem->getSourceCode() !== $sourceCode) { continue; } $sourceChildItem = clone $childItem; $sourceChildItem->setId($childItem->getId()); $sourceChildItem->setAddress($this); $sourceChildItem->setParentItem($sourceItem); $sourceItemsCollection->addItem($sourceChildItem); } $sourceItemsCollection->addItem($sourceItem); } $this->unsetData(['cached_items_all', 'item_qty']); $this->_items = $sourceItemsCollection; return $this; } /** * Set source code * * @param string $sourceCode * @return $this */ public function setSourceCode($sourceCode) { $this->setData('source_code', $sourceCode); $this->resetSourceItemsCollection(); if ($this->getAddressType() == self::ADDRESS_TYPE_SHIPPING) { $this->setShippingMethod([$sourceCode => $this->getSourceShippingMethod($sourceCode)]); $this->setLimitCarrier([$sourceCode => $this->getSourceLimitCarrier($sourceCode)]); } $this->unsetTotals(); return $this; } /** * Create source clone * * @param string $sourceCode * @return \Magento\Quote\Api\Data\AddressInterface */ public function createSourceClone($sourceCode) { $sourceQuote = $this->getQuote()->createSourceClone($sourceCode); $sourceQuoteAddress = clone $this; $sourceQuoteAddress->setId($this->getId()); $sourceQuoteAddress->setQuote($sourceQuote); $sourceQuoteAddress->setSourceCode($sourceCode); $this->totalsCollector->collectAddressTotals($sourceQuote, $sourceQuoteAddress); return $sourceQuoteAddress; } /** * Get store * * @return \Magento\Store\Api\Data\StoreInterface */ protected function getStore() { $quote = $this->getQuote(); if (empty($quote) || !$quote->getStoreId()) { return $this->inventoryStoreManager->getStore(); } return $quote->getStore(); } /** * Create shipping rate request * * @return \Magento\Quote\Model\Quote\Address\RateRequest */ public function createShippingRateRequest() { $store = $this->getStore(); $website = $store->getWebsite(); $rateRequest = $this->_rateRequestFactory->create(); $rateRequest->setStoreId($store->getId()); $rateRequest->setWebsiteId($website->getId()); $rateRequest->setBaseCurrency($store->getBaseCurrency()); $rateRequest->setPackageCurrency($store->getCurrentCurrency()); $rateRequest->setDestCountryId($this->getCountryId()); $rateRequest->setDestRegionId($this->getRegionId()); $rateRequest->setDestRegionCode($this->getRegionCode()); $rateRequest->setDestStreet($this->getStreetFull()); $rateRequest->setDestCity($this->getCity()); $rateRequest->setDestPostcode($this->getPostcode()); return $rateRequest; } /** * Create item shipping rate request * * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @return \Magento\Quote\Model\Quote\Address\RateRequest */ public function createItemShippingRateRequest(\Magento\Quote\Model\Quote\Item\AbstractItem $item) { $sourceCode = $item->getSourceCode(); $rateRequest = $this->createShippingRateRequest(); $rateRequest->setSourceCode($sourceCode); $rateRequest->setAllItems([$item]); $rateRequest->setPackageValue($item->getBaseRowTotal()); $rateRequest->setPackageValueWithDiscount($item->getBaseRowTotal() - $item->getBaseDiscountAmount()); $rateRequest->setPackageWeight($item->getRowWeight()); $rateRequest->setPackageQty($item->getQty()); $rateRequest->setPackagePhysicalValue($item->getBaseRowTotal()); $rateRequest->setBaseSubtotalInclTax($this->getBaseSubtotalTotalInclTax()); $rateRequest->setFreeMethodWeight(0); $rateRequest->setFreeShipping($this->getFreeShipping()); $rateRequest->setLimitCarrier($this->getSourceLimitCarrier($sourceCode)); return $rateRequest; } /** * Request item shipping rates * * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @return bool */ public function requestItemShippingRates(\Magento\Quote\Model\Quote\Item\AbstractItem $item) { $found = false; $configSourceCode = $this->_scopeConfig->getSourceCode(); $this->_scopeConfig->setSourceCode($item->getSourceCode()); $result = $this->_rateCollector->create() ->collectRates($this->createItemShippingRateRequest($item)) ->getResult(); $this->_scopeConfig->setSourceCode($configSourceCode); if (empty($result)) { return $found; } $sourceCode = $item->getSourceCode(); foreach ($result->getAllRates() as $rateResult) { $rate = $this->_addressRateFactory->create()->importShippingRate($rateResult); $rate->setSourceCode($sourceCode); if ($this->getSourceShippingMethod($sourceCode) === $rate->getCode()) { $item->setBaseShippingAmount($rate->getPrice()); $found = true; } } return $found; } /** * Create item shipping rate request * * @param \Magento\Quote\Api\Data\AddressInterface $address * @return \Magento\Quote\Model\Quote\Address\RateRequest */ public function createAddressShippingRateRequest(\Magento\Quote\Api\Data\AddressInterface $address) { $sourceCode = $address->getSourceCode(); $includeTax = $this->_scopeConfig->getValue('tax/calculation/price_includes_tax', \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $this->getStore()->getId()); $baseSubtotal = $includeTax ? $address->getBaseSubtotalTotalInclTax() : $address->getBaseSubtotal(); $baseSubtotalWithDiscount = $baseSubtotal + $address->getBaseDiscountAmount(); $baseSubtotalWithoutVirtualAmount = $baseSubtotal - $this->getBaseVirtualAmount(); $rateRequest = $this->createShippingRateRequest(); $rateRequest->setSourceCode($sourceCode); $rateRequest->setAllItems($address->getAllItems()); $rateRequest->setPackageValue($baseSubtotal); $rateRequest->setPackageValueWithDiscount($baseSubtotalWithDiscount); $rateRequest->setPackageWeight($address->getWeight()); $rateRequest->setPackageQty($address->getItemQty()); $rateRequest->setPackagePhysicalValue($baseSubtotalWithoutVirtualAmount); $rateRequest->setBaseSubtotalInclTax($address->getBaseSubtotalTotalInclTax()); $rateRequest->setFreeMethodWeight($address->getFreeMethodWeight()); $rateRequest->setFreeShipping($address->getFreeShipping()); $rateRequest->setLimitCarrier($address->getSourceLimitCarrier($sourceCode)); return $rateRequest; } /** * Request address shipping rates * * @param \Magento\Quote\Api\Data\AddressInterface $address * @return bool */ public function requestAddressShippingRates(\Magento\Quote\Api\Data\AddressInterface $address) { $found = false; $configSourceCode = $this->_scopeConfig->getSourceCode(); $this->_scopeConfig->setSourceCode($address->getSourceCode()); $result = $this->_rateCollector->create() ->collectRates($this->createAddressShippingRateRequest($address)) ->getResult(); $this->_scopeConfig->setSourceCode($configSourceCode); if (empty($result)) { return $found; } $sourceCode = $address->getSourceCode(); $store = $this->getStore(); $baseCurrency = $store->getBaseCurrency(); $currentCurrencyCode = $store->getCurrentCurrencyCode(); foreach ($result->getAllRates() as $shippingRate) { $rate = $this->_addressRateFactory->create()->importShippingRate($shippingRate); $rate->setSourceCode($sourceCode); $this->addShippingRate($rate); if ($this->getSourceShippingMethod($sourceCode) === $rate->getCode()) { $baseShippingAmount = $rate->getPrice(); $shippingAmount = $baseCurrency->convert($baseShippingAmount, $currentCurrencyCode); $this->setBaseShippingAmount($this->getBaseShippingAmount() + $baseShippingAmount); $this->setShippingAmount($this->getShippingAmount() + $shippingAmount); $found = true; } } return $found; } /** * Request shipping rates * * @param \Magento\Quote\Model\Quote\Item\AbstractItem $item * @return bool */ public function inventoryRequestShippingRates(\Magento\Quote\Model\Quote\Item\AbstractItem $item = null) { if ($item) { return $this->requestItemShippingRates($item); } if (!$this->getQuote()) { return false; } $found = true; $sourceCode = $this->getSourceCode(); if (!$sourceCode) { foreach ($this->getSourceCodes() as $sourceCode) { $sourceFound = $this->requestAddressShippingRates($this->createSourceClone($sourceCode)); $found = $found && $sourceFound; } } else { $found = $this->requestAddressShippingRates($this->createSourceClone($sourceCode)); } return $found; } /** * Get grouped all shipping rates * * @return array */ public function inventoryGetGroupedAllShippingRates() { $groupedRates = []; foreach ($this->getShippingRatesCollection() as $rate) { $sourceCode = $rate->getSourceCode(); $carrierCode = $rate->getCarrier(); $carrier = $this->inventoryCarrierFactory->get($carrierCode); if ($rate->isDeleted() || !$carrier) { continue; } if (!isset($groupedRates[$sourceCode])) { $groupedRates[$sourceCode] = []; } $sourceRates =& $groupedRates[$sourceCode]; if (!isset($sourceRates[$carrierCode])) { $sourceRates[$carrierCode] = []; } $sourceRates[$carrierCode][] = $rate; $sourceRates[$carrierCode][0]->carrier_sort_order = $carrier->getSortOrder(); uasort($sourceRates, [$this, '_sortRates']); } return $groupedRates; } /** * Get source shipping rate by code * * @param string $sourceCode * @param string $code * @return \Magento\Quote\Model\Quote\Address\Rate|null */ public function getSourceShippingRateByCode($sourceCode, $code) { foreach ($this->getShippingRatesCollection() as $rate) { if (($rate->getSourceCode() === $sourceCode) && ($rate->getCode() === $code)) { return $rate; } } return null; } /** * Get shipping rate by code * * @param array $code * @return \Magento\Quote\Model\Quote\Address\Rate[] */ public function inventoryGetShippingRateByCode($code) { if (!is_array($code) || empty($code)) { return []; } $shippingRates = []; foreach ($this->getSourceCodes() as $sourceCode) { if (empty($code[$sourceCode])) { $shippingRates = []; break; } $shippingRates[$sourceCode] = $this->getSourceShippingRateByCode($sourceCode, $code[$sourceCode]); } return $this->filterSourceValues($shippingRates, true); } /** * Get current shipping rate * * @return \Magento\Quote\Model\Quote\Address\Rate[] */ public function getCurrentShippingRate() { $shippingRates = []; foreach ($this->getSourceCodes() as $sourceCode) { $sourceShippingMethod = $this->getSourceShippingMethod($sourceCode); if (empty($sourceShippingMethod)) { continue; } $shippingRates[$sourceCode] = $this->getSourceShippingRateByCode($sourceCode, $sourceShippingMethod); } return $this->filterSourceValues($shippingRates, true); } /** * Unset totals * * @return \Magento\Quote\Api\Data\AddressInterface */ public function unsetTotals() { $this->_totals = []; $this->_totalAmounts = []; $this->_baseTotalAmounts = []; return $this; } /** * Get source shipping method * * @param string $sourceCode * @return string|null */ public function getSourceShippingMethod($sourceCode) { return $this->getSourceAdditionalData($sourceCode, 'shipping_method'); } /** * Set source shipping method * * @param string $sourceCode * @param string $shippingMethod * @return \Magento\Quote\Api\Data\AddressInterface */ public function setSourceShippingMethod($sourceCode, $shippingMethod) { $this->setSourceAdditionalData($sourceCode, 'shipping_method', $shippingMethod); return $this; } /** * Get shipping method * * @return array */ public function inventoryGetShippingMethod() { $value = $this->getData('source_shipping_method'); if (!is_array($value) || empty($value)) { return []; } return $this->filterSourceValues($value, true); } /** * Set shipping method * * @param array $value * @return \Magento\Quote\Api\Data\AddressInterface */ public function inventorySetShippingMethod($value) { if (!is_array($value) || empty($value)) { $value = []; } $this->setData('source_shipping_method', $this->filterSourceValues($value, true)); return $this; } /** * Generate shipping description * * @param array|null $shippingMethods * @return \Magento\Quote\Api\Data\AddressInterface */ public function generateShippingDescription($shippingMethods = null) { if ($shippingMethods === null) { $shippingMethods = $this->getShippingMethod(); } $shippingRates = $this->getShippingRateByCode($shippingMethods); if (empty($shippingRates)) { return ''; } $shippingDescriptionPieces = []; foreach ($shippingRates as $sourceCode => $shippingRate) { $shippingCarrierTitle = $shippingRate->getCarrierTitle(); $shippingMethodTitle = $shippingRate->getMethodTitle(); $source = $this->sourceManagement->getSource($sourceCode); if (empty($source)) { continue; } $shippingDescriptionPieces[] = $source->getName().': '.$shippingCarrierTitle.($shippingMethodTitle ? ' - '.$shippingMethodTitle : ''); } $this->setShippingDescription(implode(', ', $shippingDescriptionPieces)); return $this; } /** * Get source limit carrier * * @param string $sourceCode * @return string|null */ public function getSourceLimitCarrier($sourceCode) { return $this->getSourceAdditionalData($sourceCode, 'limit_carrier'); } /** * Set source limit carrier * * @param string $sourceCode * @param string $carrierCode * @return \Magento\Quote\Api\Data\AddressInterface */ public function setSourceLimitCarrier($sourceCode, $carrierCode) { $this->setSourceAdditionalData($sourceCode, 'limit_carrier', $carrierCode); return $this; } }