![]() 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/magento/module-catalog/Model/Product/ |
<?php /** * * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Catalog\Model\Product; use Magento\Catalog\Api\ProductRepositoryInterface; use Magento\Customer\Api\GroupManagementInterface; use Magento\Customer\Api\GroupRepositoryInterface; use Magento\Framework\Exception\CouldNotSaveException; use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Exception\TemporaryStateExceptionInterface; use Magento\Framework\Validator\FloatUtils; use Magento\Framework\Validator\ValidatorChain; use Magento\Store\Api\Data\WebsiteInterface; use Magento\Store\Model\ScopeInterface; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class TierPriceManagement implements \Magento\Catalog\Api\ProductTierPriceManagementInterface { /** * @var \Magento\Catalog\Api\ProductRepositoryInterface */ protected $productRepository; /** * @var \Magento\Catalog\Api\Data\ProductTierPriceInterfaceFactory */ protected $priceFactory; /** * @var \Magento\Store\Model\StoreManagerInterface */ protected $storeManager; /** * @var \Magento\Catalog\Model\Product\PriceModifier */ protected $priceModifier; /** * @var \Magento\Framework\App\Config\ScopeConfigInterface */ protected $config; /** * @var GroupManagementInterface */ protected $groupManagement; /** * @var GroupRepositoryInterface */ protected $groupRepository; /** * @param ProductRepositoryInterface $productRepository * @param \Magento\Catalog\Api\Data\ProductTierPriceInterfaceFactory $priceFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param PriceModifier $priceModifier * @param \Magento\Framework\App\Config\ScopeConfigInterface $config * @param GroupManagementInterface $groupManagement * @param GroupRepositoryInterface $groupRepository */ public function __construct( ProductRepositoryInterface $productRepository, \Magento\Catalog\Api\Data\ProductTierPriceInterfaceFactory $priceFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Model\Product\PriceModifier $priceModifier, \Magento\Framework\App\Config\ScopeConfigInterface $config, GroupManagementInterface $groupManagement, GroupRepositoryInterface $groupRepository ) { $this->productRepository = $productRepository; $this->priceFactory = $priceFactory; $this->storeManager = $storeManager; $this->priceModifier = $priceModifier; $this->config = $config; $this->groupManagement = $groupManagement; $this->groupRepository = $groupRepository; } /** * @inheritdoc * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function add($sku, $customerGroupId, $price, $qty) { if (!is_float($price) && !is_int($price) && !ValidatorChain::is((string)$price, FloatUtils::class) || !is_float($qty) && !is_int($qty) && !ValidatorChain::is((string)$qty, FloatUtils::class) || $price <= 0 || $qty <= 0 ) { throw new InputException(__('The data was invalid. Verify the data and try again.')); } $product = $this->productRepository->get($sku, ['edit_mode' => true]); $tierPrices = $product->getData('tier_price'); $websiteIdentifier = 0; $value = $this->config->getValue('catalog/price/scope', ScopeInterface::SCOPE_WEBSITE); if ($value != 0) { $websiteIdentifier = $this->storeManager->getWebsite()->getId(); } $found = false; foreach ($tierPrices as &$item) { if ('all' == $customerGroupId) { $isGroupValid = ($item['all_groups'] == 1); } else { $isGroupValid = ($item['cust_group'] == $customerGroupId); } if ($isGroupValid && $item['website_id'] == $websiteIdentifier && $item['price_qty'] == $qty) { $item['price'] = $price; $found = true; break; } } if (!$found) { $mappedCustomerGroupId = 'all' == $customerGroupId ? $this->groupManagement->getAllCustomersGroup()->getId() : $this->groupRepository->getById($customerGroupId)->getId(); $tierPrices[] = [ 'cust_group' => $mappedCustomerGroupId, 'price' => $price, 'website_price' => $price, 'website_id' => $websiteIdentifier, 'price_qty' => $qty, ]; } $product->setData('tier_price', $tierPrices); $errors = $product->validate(); if (is_array($errors) && count($errors)) { $errorAttributeCodes = implode(', ', array_keys($errors)); throw new InputException( __('Values in the %1 attributes are invalid. Verify the values and try again.', $errorAttributeCodes) ); } try { $this->productRepository->save($product); } catch (\Exception $e) { if ($e instanceof TemporaryStateExceptionInterface) { // temporary state exception must be already localized throw $e; } throw new CouldNotSaveException(__("The group price couldn't be saved.")); } return true; } /** * @inheritdoc */ public function remove($sku, $customerGroupId, $qty) { $product = $this->productRepository->get($sku, ['edit_mode' => true]); $websiteIdentifier = 0; if ($this->getPriceScopeConfig() !== 0) { $websiteIdentifier = $this->getCurrentWebsite()->getId(); } $this->priceModifier->removeTierPrice($product, $customerGroupId, $qty, $websiteIdentifier); return true; } /** * @inheritdoc */ public function getList($sku, $customerGroupId) { $product = $this->productRepository->get($sku, ['edit_mode' => true]); $cgi = $customerGroupId === 'all' ? $this->groupManagement->getAllCustomersGroup()->getId() : $customerGroupId; $prices = []; $tierPrices = $product->getData('tier_price'); if ($tierPrices !== null) { $priceKey = $this->getPriceKey(); foreach ($tierPrices as $price) { if ($this->isCustomerGroupApplicable($customerGroupId, $price)) { /** @var \Magento\Catalog\Api\Data\ProductTierPriceInterface $tierPrice */ $tierPrice = $this->priceFactory->create(); $tierPrice->setValue($price[$priceKey]) ->setQty($price['price_qty']) ->setCustomerGroupId($cgi); $prices[] = $tierPrice; } } } return $prices; } /** * Returns attribute code (key) that contains price * * @return string */ private function getPriceKey(): string { return $this->getPriceScopeConfig() === 0 ? 'price' : 'website_price'; } /** * Returns whether Price is applicable for provided Customer Group * * @param string $customerGroupId * @param array $priceArray * @return bool */ private function isCustomerGroupApplicable(string $customerGroupId, array $priceArray): bool { return ($customerGroupId === 'all' && $priceArray['all_groups']) || (is_numeric($customerGroupId) && (int)$priceArray['cust_group'] === (int)$customerGroupId); } /** * Returns current Price Scope configuration value * * @return int */ private function getPriceScopeConfig(): int { return (int)$this->config->getValue('catalog/price/scope', ScopeInterface::SCOPE_WEBSITE); } /** * Returns current Website object * * @return WebsiteInterface * @throws LocalizedException */ private function getCurrentWebsite(): WebsiteInterface { return $this->storeManager->getWebsite(); } }