Spamworldpro Mini Shell
Spamworldpro


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/Ecombricks/InventoryQuote/Model/Quote/Address/SourceTrait.php
<?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;
    }
    
}

Spamworldpro Mini