21 private $tierPricePersistence;
28 private $tierPriceValidator;
35 private $tierPriceFactory;
42 private $priceIndexer;
49 private $productIdLocator;
70 private $indexerChunkValue = 500;
90 $this->tierPricePersistence = $tierPricePersistence;
91 $this->tierPriceValidator = $tierPriceValidator;
93 $this->priceIndexer = $priceIndexer;
94 $this->productIdLocator = $productIdLocator;
96 $this->typeList = $typeList;
104 $skus = $this->tierPriceValidator->validateSkus(
$skus);
106 return $this->getExistingPrices(
$skus);
114 $affectedIds = $this->retrieveAffectedProductIdsForPrices(
$prices);
115 $skus = array_unique(
116 array_map(
function (
$price) {
120 $result = $this->tierPriceValidator->retrieveValidationResult(
$prices, $this->getExistingPrices(
$skus,
true));
122 $formattedPrices = $this->retrieveFormattedPrices(
$prices);
123 $this->tierPricePersistence->update($formattedPrices);
124 $this->reindexPrices($affectedIds);
125 $this->invalidateFullPageCache();
127 return $result->getFailedItems();
135 $result = $this->tierPriceValidator->retrieveValidationResult(
$prices);
137 $affectedIds = $this->retrieveAffectedProductIdsForPrices(
$prices);
138 $formattedPrices = $this->retrieveFormattedPrices(
$prices);
139 $this->tierPricePersistence->replace($formattedPrices, $affectedIds);
140 $this->reindexPrices($affectedIds);
141 $this->invalidateFullPageCache();
143 return $result->getFailedItems();
151 $affectedIds = $this->retrieveAffectedProductIdsForPrices(
$prices);
152 $result = $this->tierPriceValidator->retrieveValidationResult(
$prices);
154 $priceIds = $this->retrieveAffectedPriceIds(
$prices);
155 $this->tierPricePersistence->delete($priceIds);
156 $this->reindexPrices($affectedIds);
157 $this->invalidateFullPageCache();
159 return $result->getFailedItems();
169 private function getExistingPrices(array
$skus, $groupBySku =
false)
171 $ids = $this->retrieveAffectedIds(
$skus);
172 $rawPrices = $this->tierPricePersistence->get($ids);
175 $linkField = $this->tierPricePersistence->getEntityLinkField();
176 $skuByIdLookup = $this->buildSkuByIdLookup(
$skus);
177 foreach ($rawPrices as $rawPrice) {
178 $sku = $skuByIdLookup[$rawPrice[$linkField]];
179 $price = $this->tierPriceFactory->create($rawPrice, $sku);
196 private function retrieveFormattedPrices(array
$prices)
198 $formattedPrices = [];
201 $idsBySku = $this->productIdLocator->retrieveProductIdsBySkus([
$price->getSku()]);
202 $ids = array_keys($idsBySku[
$price->getSku()]);
203 foreach ($ids as
$id) {
204 $formattedPrices[] = $this->tierPriceFactory->createSkeleton(
$price,
$id);
208 return $formattedPrices;
217 private function retrieveAffectedProductIdsForPrices(array
$prices)
219 $skus = array_unique(
220 array_map(
function (
$price) {
225 return $this->retrieveAffectedIds(
$skus);
234 private function retrieveAffectedIds(array
$skus)
238 foreach ($this->productIdLocator->retrieveProductIdsBySkus(
$skus) as
$productId) {
239 $affectedIds = array_merge($affectedIds, array_keys(
$productId));
242 return array_unique($affectedIds);
251 private function retrieveAffectedPriceIds(array
$prices)
253 $affectedIds = $this->retrieveAffectedProductIdsForPrices(
$prices);
254 $formattedPrices = $this->retrieveFormattedPrices(
$prices);
255 $existingPrices = $this->tierPricePersistence->get($affectedIds);
258 foreach ($formattedPrices as
$price) {
259 $priceIds[] = $this->retrievePriceId(
$price, $existingPrices);
272 private function retrievePriceId(array
$price, array $existingPrices)
274 $linkField = $this->tierPricePersistence->getEntityLinkField();
276 foreach ($existingPrices as $existingPrice) {
277 if ($existingPrice[
'all_groups'] ==
$price[
'all_groups']
278 && $existingPrice[
'customer_group_id'] ==
$price[
'customer_group_id']
279 && $existingPrice[
'qty'] ==
$price[
'qty']
280 && $this->isCorrectPriceValue($existingPrice,
$price)
281 && $existingPrice[$linkField] ==
$price[$linkField]
283 return $existingPrice[
'value_id'];
297 private function isCorrectPriceValue(array $existingPrice, array
$price)
299 return ($existingPrice[
'value'] != 0 && $existingPrice[
'value'] ==
$price[
'value'])
300 || ($existingPrice[
'percentage_value'] !==
null 301 && $existingPrice[
'percentage_value'] ==
$price[
'percentage_value']);
310 private function buildSkuByIdLookup(
$skus)
313 foreach ($this->productIdLocator->retrieveProductIdsBySkus(
$skus) as $sku => $ids) {
314 foreach (array_keys($ids) as
$id) {
327 private function invalidateFullPageCache()
329 if ($this->config->isEnabled()) {
330 $this->typeList->invalidate(
'full_page');
340 private function reindexPrices(array $ids)
342 foreach (array_chunk($ids, $this->indexerChunkValue) as $affectedIds) {
343 $this->priceIndexer->execute($affectedIds);
354 private function removeIncorrectPrices(array
$prices, array $ids)
356 foreach ($ids as
$id) {
foreach($websiteCodes as $websiteCode) $skus
__construct(TierPricePersistence $tierPricePersistence, \Magento\Catalog\Model\Product\Price\Validation\TierPriceValidator $tierPriceValidator, TierPriceFactory $tierPriceFactory, \Magento\Catalog\Model\Indexer\Product\Price $priceIndexer, \Magento\Catalog\Model\ProductIdLocatorInterface $productIdLocator, \Magento\PageCache\Model\Config $config, \Magento\Framework\App\Cache\TypeListInterface $typeList)