![]() 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/InventoryCatalog/Model/Product/ |
<?php /** * Copyright © eComBricks. All rights reserved. * See LICENSE.txt for license details. */ namespace Ecombricks\InventoryCatalog\Model\Product; /** * Product source quote management */ class SourceQuoteManagement implements \Ecombricks\InventoryCatalog\Api\Product\SourceQuoteManagementInterface { /** * Source manager * * @var \Ecombricks\Inventory\Model\SourceManagement */ protected $sourceManagement; /** * Source item management * * @var \Ecombricks\InventoryInventorySales\Model\SourceItemManagement */ protected $sourceItemManagement; /** * Product repository * * @var \Magento\Catalog\Model\ProductRepository */ protected $productRepository; /** * Product source quote object factory * * @var \Ecombricks\InventoryCatalog\Api\Data\Product\SourceQuoteInterfaceFactory */ protected $productSourceQuoteObjectFactory; /** * Quote factory * * @var \Magento\Quote\Model\QuoteFactory */ protected $quoteFactory; /** * Customer repository * * @var \Magento\Customer\Api\CustomerRepositoryInterface */ protected $customerRepository; /** * User context * * @var \Magento\Authorization\Model\UserContextInterface */ protected $userContext; /** * Store manager * * @var \Magento\Store\Model\StoreManagerInterface */ protected $storeManager; /** * Data object processor * * @var \Magento\Framework\Reflection\DataObjectProcessor */ protected $dataObjectProcessor; /** * Shipping rates converter * * @var \Ecombricks\InventoryCatalog\Model\Product\SourceQuote\ShippingRatesConverter */ protected $shippingRatesConverter; /** * Totals converter * * @var \Ecombricks\InventoryCatalog\Model\Product\SourceQuote\TotalsConverter */ protected $totalsConverter; /** * Constructor * * @param \Ecombricks\Inventory\Model\SourceManagement $sourceManagement * @param \Ecombricks\InventoryInventorySales\Model\SourceItemManagement $sourceItemManagement * @param \Magento\Catalog\Model\ProductRepository $productRepository * @param \Ecombricks\InventoryCatalog\Api\Data\Product\SourceQuoteInterfaceFactory $productSourceQuoteObjectFactory * @param \Magento\Quote\Model\QuoteFactory $quoteFactory * @param \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository * @param \Magento\Authorization\Model\UserContextInterface $userContext * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor * @param \Ecombricks\InventoryCatalog\Model\Product\SourceQuote\ShippingRatesConverter $shippingRatesConverter * @param \Ecombricks\InventoryCatalog\Model\Product\SourceQuote\TotalsConverter $totalsConverter * @return void */ public function __construct( \Ecombricks\Inventory\Model\SourceManagement $sourceManagement, \Ecombricks\InventoryInventorySales\Model\SourceItemManagement $sourceItemManagement, \Magento\Catalog\Model\ProductRepository $productRepository, \Ecombricks\InventoryCatalog\Api\Data\Product\SourceQuoteInterfaceFactory $productSourceQuoteObjectFactory, \Magento\Quote\Model\QuoteFactory $quoteFactory, \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository, \Magento\Authorization\Model\UserContextInterface $userContext, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Reflection\DataObjectProcessor $dataObjectProcessor, \Ecombricks\InventoryCatalog\Model\Product\SourceQuote\ShippingRatesConverter $shippingRatesConverter, \Ecombricks\InventoryCatalog\Model\Product\SourceQuote\TotalsConverter $totalsConverter ) { $this->sourceManagement = $sourceManagement; $this->sourceItemManagement = $sourceItemManagement; $this->productRepository = $productRepository; $this->productSourceQuoteObjectFactory = $productSourceQuoteObjectFactory; $this->quoteFactory = $quoteFactory; $this->customerRepository = $customerRepository; $this->userContext = $userContext; $this->storeManager = $storeManager; $this->dataObjectProcessor = $dataObjectProcessor; $this->shippingRatesConverter = $shippingRatesConverter; $this->totalsConverter = $totalsConverter; } /** * Get store * * @return \Magento\Store\Api\Data\StoreInterface */ protected function getStore() { return $this->storeManager->getStore(); } /** * Get product * * @param string $sku * @return \Magento\Catalog\Api\Data\ProductInterface */ protected function getProduct($sku) { return $this->productRepository->get($sku); } /** * Get customer * * @return \Magento\Customer\Api\Data\CustomerInterface|null */ protected function getCustomer() { $customerId = ($this->userContext->getUserType() === \Magento\Authorization\Model\UserContextInterface::USER_TYPE_CUSTOMER) ? $this->userContext->getUserId() : null; if (!$customerId) { return null; } return $this->customerRepository->getById($customerId); } /** * Get request shipping method * * @param array $request * @param string $sourceCode * @return string|null */ protected function getRequestShippingMethod($request, $sourceCode) { $shippingMethod = null; if (!empty($request['shipping_methods'])) { $shippingMethods = $request['shipping_methods']; if (!empty($shippingMethods[$sourceCode])) { $shippingMethod = $shippingMethods[$sourceCode]; } } return $shippingMethod; } /** * Get request object * * @param array $request * @param string $sourceCode * @return \Magento\Framework\DataObject */ protected function getRequestObject($request, $sourceCode) { return new \Magento\Framework\DataObject(array_merge($request, ['source' => $sourceCode])); } /** * Get source codes * * @param string $sku * @param string $sourceCode * @param \Magento\Quote\Api\Data\AddressInterface $address * @param array $request * @return \Magento\Quote\Api\Data\CartInterface[] */ protected function getSourceQuote($sku, $sourceCode, $address, $request) { $quote = $this->quoteFactory->create(); $quote->setCurrentSourceCode($sourceCode); $quote->setStore($this->getStore()); $customer = $this->getCustomer(); if ($customer) { $quote->setCustomer($customer); $quote->setCustomerIsGuest(0); } else { $quote->setCustomerIsGuest(1); } $addressData = $this->dataObjectProcessor->buildOutputDataArray($address, \Magento\Quote\Api\Data\AddressInterface::class); $quote->getBillingAddress()->addData($addressData); $product = $this->getProduct($sku); if (!$product->isVirtual()) { $shippingAddress = $quote->getShippingAddress(); $shippingAddress->addData($addressData); $shippingMethod = $this->getRequestShippingMethod($request, $sourceCode); if ($shippingMethod) { $shippingAddress->setSourceShippingMethod($sourceCode, $shippingMethod); } $shippingAddress->setCollectShippingRates(true); } $quoteItem = $quote->addProduct($product, $this->getRequestObject($request, $sourceCode)); if (is_string($quoteItem)) { throw new \Magento\Framework\Exception\LocalizedException(__($quoteItem)); } $quote->collectTotals(); return $quote; } /** * Get source codes * * @param string $sku * @param \Magento\Quote\Api\Data\AddressInterface $address * @param array $request * @return \Magento\Quote\Api\Data\CartInterface[] */ protected function getSourceQuotes($sku, $address, $request) { $quotes = []; foreach ($this->sourceItemManagement->getCurrentStockSalableSourceCodes($sku) as $sourceCode) { $quotes[$sourceCode] = $this->getSourceQuote($sku, $sourceCode, $address, $request); } return $quotes; } /** * Get source quote shipping method * * @param \Magento\Quote\Api\Data\CartInterface $quote * @return \Ecombricks\InventoryQuote\Api\Data\ShippingMethodInterface[] */ protected function getSourceQuoteShippingMethod($quote) { if ($quote->isVirtual()) { return null; } return $quote->getShippingAddress()->getSourceShippingMethod($quote->getCurrentSourceCode()); } /** * Prepare request * * @param mixed $request * @return array */ protected function prepareRequest($request) { if (!is_array($request)) { return []; } return $request; } /** * Get list * * @param string $sku * @param \Magento\Quote\Api\Data\AddressInterface $address * @param mixed $request * @return \Ecombricks\InventoryCatalog\Api\Data\Product\SourceQuoteInterface[] */ public function getList($sku, $address, $request = []) { $productSourceQuotes = []; $preparedRequest = $this->prepareRequest($request); foreach ($this->getSourceQuotes($sku, $address, $preparedRequest) as $quote) { $productSourceQuotes[] = $this->productSourceQuoteObjectFactory->create() ->setSourceCode($quote->getCurrentSourceCode()) ->setShippingMethod($this->getSourceQuoteShippingMethod($quote)) ->setShippingRates($this->shippingRatesConverter->process($quote)) ->setTotals($this->totalsConverter->process($quote)); } if (empty($productSourceQuotes)) { throw new \Magento\Framework\Exception\LocalizedException(__('No product quotes found.')); } return $productSourceQuotes; } }