custom/plugins/AcrisDiscountGroupCS/src/Core/Content/Product/SalesChannel/Price/ProductPriceCalculator.php line 48

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\DiscountGroup\Core\Content\Product\SalesChannel\Price;
  3. use Acris\DiscountGroup\Components\DiscountGroupService;
  4. use Acris\DiscountGroup\Components\ListPriceService;
  5. use Acris\DiscountGroup\Core\Checkout\Promotion\Cart\PromotionCollector;
  6. use Acris\DiscountGroup\Core\Content\Product\Cart\ProductCartProcessor;
  7. use Shopware\Core\Content\Product\SalesChannel\Price\AbstractProductPriceCalculator;
  8. use Shopware\Core\Content\Product\SalesChannel\SalesChannelProductEntity;
  9. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  10. use Shopware\Core\Content\Product\SalesChannel\Price\ProductPriceCalculator as ParentClass;
  11. class ProductPriceCalculator extends ParentClass
  12. {
  13.     /**
  14.      * @var AbstractProductPriceCalculator
  15.      */
  16.     private $parent;
  17.     /**
  18.      * @var DiscountGroupService
  19.      */
  20.     private $discountGroupService;
  21.     /**
  22.      * @var ListPriceService
  23.      */
  24.     private $listPriceService;
  25.     public function __construct(AbstractProductPriceCalculator $parentDiscountGroupService $discountGroupServiceListPriceService  $listPriceService)
  26.     {
  27.         $this->parent $parent;
  28.         $this->discountGroupService $discountGroupService;
  29.         $this->listPriceService $listPriceService;
  30.     }
  31.     public function getDecorated(): AbstractProductPriceCalculator
  32.     {
  33.         return $this->parent->getDecorated();
  34.     }
  35.     public function calculate(iterable $productsSalesChannelContext $context): void
  36.     {
  37.         $this->parent->calculate($products$context);
  38.         if ($this->preventDiscountGroup($context$products) === true) return;
  39.         $this->discountGroupService->calculateProductPrices($products$context);
  40.         $this->listPriceService->calculateProductListPrices$products$context );
  41.     }
  42.     private function preventDiscountGroup(SalesChannelContext $contextiterable $products): bool
  43.     {
  44.         $match false;
  45.         foreach ($products as $product) {
  46.             if (!$product instanceof SalesChannelProductEntity) continue;
  47.             if ($product->hasExtension(ProductCartProcessor::DISCOUNT_GROUP_PROMOTION_PREVENT)) {
  48.                 $match true;
  49.                 $product->removeExtension(ProductCartProcessor::DISCOUNT_GROUP_PROMOTION_PREVENT);
  50.             }
  51.         }
  52.         return $match && $context->hasExtension(PromotionCollector::CONTEXT_PREVENT_DISCOUNT_GROUP_KEY) && !empty($context->getExtension(PromotionCollector::CONTEXT_PREVENT_DISCOUNT_GROUP_KEY));
  53.     }
  54. }