custom/plugins/AcrisProductBadgesCS/src/Components/ProductBadges/ProductBadgesGateway.php line 49

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Acris\ProductBadges\Components\ProductBadges;
  3. use Acris\ProductBadges\Components\ProductBadges\Struct\ProductStreamStruct;
  4. use Shopware\Core\Framework\Context;
  5. use Shopware\Core\Framework\DataAbstractionLayer\EntityCollection;
  6. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsAnyFilter;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\NotFilter;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\RangeFilter;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  15. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  16. class ProductBadgesGateway
  17. {
  18.     /**
  19.      * @var EntityRepositoryInterface
  20.      */
  21.     private $productBadgesRepository;
  22.     /**
  23.      * @var EntityRepositoryInterface
  24.      */
  25.     private $productStreamMappingRepository;
  26.     /**
  27.      * @var EntitySearchResult|null
  28.      */
  29.     private $productBadges;
  30.     private array $ruleIds;
  31.     private array $productStreamIds;
  32.     public function __construct(
  33.         EntityRepositoryInterface $productBadgesRepository,
  34.         EntityRepositoryInterface $productStreamMappingRepository
  35.     ) {
  36.         $this->productBadgesRepository $productBadgesRepository;
  37.         $this->productStreamMappingRepository $productStreamMappingRepository;
  38.         $this->productBadges = [];
  39.         $this->ruleIds = [];
  40.         $this->productStreamIds = [];
  41.     }
  42.     public function getAllProductBadges(array $productStreamIdsSalesChannelContext $salesChannelContext): EntityCollection
  43.     {
  44.         $ruleMatch count(array_intersect($this->ruleIds$salesChannelContext->getRuleIds())) === \count($salesChannelContext->getRuleIds())
  45.             && count(array_intersect($this->productStreamIds$productStreamIds)) === \count($productStreamIds);
  46.         if(!empty($this->productBadges) && $this->productBadges instanceof EntitySearchResult && $ruleMatch) {
  47.             return $this->productBadges->getEntities();
  48.         }
  49.         $criteria = (new Criteria());
  50.         $criteria $this->addCriteria($productStreamIds$criteria$salesChannelContext);
  51.         $this->productBadges $this->productBadgesRepository->search($criteria$salesChannelContext->getContext());
  52.         $this->ruleIds $salesChannelContext->getRuleIds();
  53.         $this->productStreamIds $productStreamIds;
  54.         return $this->productBadges->getEntities();
  55.     }
  56.     private function getActiveFilters(): MultiFilter
  57.     {
  58.         $today = new \DateTime();
  59.         $todayStart $today->format('Y-m-d H:i:s');
  60.         $filterActiveDate = new MultiFilter(
  61.             MultiFilter::CONNECTION_OR,
  62.             [
  63.                 new MultiFilter(
  64.                     MultiFilter::CONNECTION_AND,
  65.                     [
  66.                         new RangeFilter('activeFrom', ['lte' => $todayStart]),
  67.                         new RangeFilter('activeUntil', ['gte' => $todayStart]),
  68.                     ]),
  69.                 new MultiFilter(
  70.                     MultiFilter::CONNECTION_AND,
  71.                     [
  72.                         new RangeFilter('activeFrom', ['lte' => $todayStart]),
  73.                         new EqualsFilter('activeUntil'null),
  74.                     ]),
  75.                 new MultiFilter(
  76.                     MultiFilter::CONNECTION_AND,
  77.                     [
  78.                         new EqualsFilter('activeFrom'null),
  79.                         new RangeFilter('activeUntil', ['gte' => $todayStart]),
  80.                     ]),
  81.                 new MultiFilter(
  82.                     MultiFilter::CONNECTION_AND,
  83.                     [
  84.                         new EqualsFilter('activeFrom'null),
  85.                         new EqualsFilter('activeUntil'null),
  86.                     ])
  87.             ]
  88.         );
  89.         return $filterActiveDate;
  90.     }
  91.     private function addCriteria(array $productStreamIdsCriteria $criteriaSalesChannelContext $salesChannelContext): Criteria
  92.     {
  93.         $filterActiveDate $this->getActiveFilters();
  94.         $criteria->addAssociation('rules')
  95.             ->addAssociation('productStreams')
  96.             ->addAssociation('promotions')
  97.             ->addAssociation('replaceDefaultBadge')
  98.             ->addAssociation('replaceRules')
  99.             ->addAssociation('imageSelection')
  100.             ->addAssociation('imageSelectionShape')
  101.             ->addFilter(new MultiFilter(MultiFilter::CONNECTION_AND, [
  102.                 $filterActiveDate,
  103.                 new EqualsFilter('active'true),
  104.                 new MultiFilter(MultiFilter::CONNECTION_OR, [
  105.                     new MultiFilter(MultiFilter::CONNECTION_AND, [
  106.                         new EqualsFilter('displayCondition'ProductBadgesService::PRODUCT_BADGE_DISPLAY_CONDITION_RULES_AND_DYNAMIC_PRODUCT_GROUPS),
  107.                         new MultiFilter(MultiFilter::CONNECTION_OR, [
  108.                             new EqualsAnyFilter('rules.id'$salesChannelContext->getRuleIds()),
  109.                             new EqualsFilter('rules.id'null),
  110.                         ]),
  111.                         new EqualsAnyFilter('productStreams.id'$productStreamIds),
  112.                         new NotFilter(NotFilter::CONNECTION_AND, [
  113.                             new EqualsFilter('productStreams.id'null)
  114.                         ])
  115.                     ]),
  116.                     new MultiFilter(MultiFilter::CONNECTION_AND, [
  117.                         new EqualsFilter('displayCondition'ProductBadgesService::PRODUCT_BADGE_DISPLAY_CONDITION_PROMOTIONS),
  118.                         new NotFilter(NotFilter::CONNECTION_AND, [
  119.                             new EqualsFilter('promotions.id'null),
  120.                         ]),
  121.                     ]),
  122.                     new MultiFilter(MultiFilter::CONNECTION_AND, [
  123.                         new EqualsFilter('displayCondition'ProductBadgesService::PRODUCT_BADGE_DISPLAY_CONDITION_REPLACE_DEFAULT_BADGE),
  124.                         new MultiFilter(MultiFilter::CONNECTION_OR, [
  125.                             new EqualsAnyFilter('replaceRules.id'$salesChannelContext->getRuleIds()),
  126.                             new EqualsFilter('replaceRules.id'null)
  127.                         ])
  128.                     ]),
  129.                     new EqualsFilter('isDefault'true)
  130.                 ])
  131.             ]))
  132.             ->addSorting(new FieldSorting('priority'FieldSorting::DESCENDING));
  133.         return $criteria;
  134.     }
  135.     public function getProductStreamIds(ProductStreamStruct $productStreamStruct, array $productIdsContext $context): void
  136.     {
  137.         $idSearchResult $this->productStreamMappingRepository->searchIds((new Criteria())->addFilter(new EqualsAnyFilter('productId'$productIds)), $context);
  138.         if ($idSearchResult->getTotal() > 0) {
  139.             foreach ($idSearchResult->getIds() as $ids) {
  140.                 if (!empty($ids) && is_array($ids) && array_key_exists('productStreamId'$ids) && !empty($ids['productStreamId']) && array_key_exists('productId'$ids) && !empty($ids['productId'])) {
  141.                     $productStreamStruct->addProductStreamId($ids['productId'], $ids['productStreamId']);
  142.                 }
  143.             }
  144.         }
  145.     }
  146. }