diff --git a/vendor/magento/module-customer-segment/Model/CustomerSegmentsProvider.php b/vendor/magento/module-customer-segment/Model/CustomerSegmentsProvider.php index 565733506f1c..c0ca9513c852 100644 --- a/vendor/magento/module-customer-segment/Model/CustomerSegmentsProvider.php +++ b/vendor/magento/module-customer-segment/Model/CustomerSegmentsProvider.php @@ -67,4 +67,48 @@ public function getCustomerSegmentIdsByCustomerId(?int $customerId, int $website return $customerSegmentIds; } + + /** + * Get customer segment ids by customer id, if customer id is null return segments for visitor and quote id + * + * @param int|null $customerId + * @param int $websiteId + * @param int $quoteId + * @return array + */ + public function getCustomerSegmentIdsByCustomerIdQuoteId(?int $customerId, int $websiteId, int $quoteId): array + { + $collection = $this->collectionFactory->create(); + $collection->addIsActiveFilter(1); + $collection->addWebsiteFilter($websiteId); + + $customerSegmentIds = []; + if ($customerId) { + $collection->addFieldToFilter( + 'apply_to', + [Segment::APPLY_TO_REGISTERED, Segment::APPLY_TO_VISITORS_AND_REGISTERED] + ); + foreach ($collection as $segment) { + if ($segment->validateCustomer($customerId, $websiteId)) { + $customerSegmentIds[] = $segment->getId(); + } + } + } else { + $collection->addFieldToFilter( + 'apply_to', + [Segment::APPLY_TO_VISITORS, Segment::APPLY_TO_VISITORS_AND_REGISTERED] + ); + foreach ($collection as $segment) { + $conditions = $segment->getConditions()->asArray(); + $segment->setQuoteId($quoteId); + if (empty($conditions['conditions'])) { + $customerSegmentIds[] = $segment->getId(); + } elseif ($segment->validateCustomer($customerId, $websiteId)) { + $customerSegmentIds[] = $segment->getId(); + } + } + } + + return $customerSegmentIds; + } } diff --git a/vendor/magento/module-customer-segment/Model/Segment/Condition/FilterTextGenerator/Segment.php b/vendor/magento/module-customer-segment/Model/Segment/Condition/FilterTextGenerator/Segment.php index 03be576ca0f9..cbb201cf6b48 100644 --- a/vendor/magento/module-customer-segment/Model/Segment/Condition/FilterTextGenerator/Segment.php +++ b/vendor/magento/module-customer-segment/Model/Segment/Condition/FilterTextGenerator/Segment.php @@ -7,6 +7,7 @@ use Magento\CustomerSegment\Model\Segment\Condition\ConcreteCondition\Segment as FilterableSegment; use Magento\AdvancedRule\Model\Condition\FilterTextGeneratorInterface; +use Magento\CustomerSegment\Model\CustomerSegmentsProvider; /** * For the current quote, generates the filter text strings for sales rules that reference Customer Segment ids. @@ -24,19 +25,30 @@ class Segment implements FilterTextGeneratorInterface */ private $segmentCustomer; + /** + * @var CustomerSegmentsProvider + */ + private $customerSegmentProvider; + /** * @param \Magento\CustomerSegment\Helper\Data $segmentHelper * @param \Magento\CustomerSegment\Model\Customer $segmentCustomer + * @param CustomerSegmentsProvider|null $customerSegmentProvider */ public function __construct( \Magento\CustomerSegment\Helper\Data $segmentHelper, - \Magento\CustomerSegment\Model\Customer $segmentCustomer + \Magento\CustomerSegment\Model\Customer $segmentCustomer, + ?CustomerSegmentsProvider $customerSegmentProvider = null ) { $this->segmentHelper = $segmentHelper; $this->segmentCustomer = $segmentCustomer; + $this->customerSegmentProvider = $customerSegmentProvider ?: + \Magento\Framework\App\ObjectManager::getInstance()->get(CustomerSegmentsProvider::class); } /** + * Generate the sales rule filter_text conditions for the given quote address and a customer segment + * * @param \Magento\Framework\DataObject $quoteAddress * @return string[] */ @@ -47,7 +59,11 @@ public function generateFilterText(\Magento\Framework\DataObject $quoteAddress) $websiteId = $quoteAddress->getQuote()->getStore()->getWebsiteId(); $customerId = $quoteAddress->getCustomerId(); $customerSegmentIds = $this->segmentHelper->isEnabled() - ? $this->segmentCustomer->getCustomerSegmentIdsForWebsite($customerId, $websiteId) + ? $this->customerSegmentProvider->getCustomerSegmentIdsByCustomerIdQuoteId( + $customerId, + $websiteId, + (int) $quoteAddress->getQuoteId() + ) : []; foreach ($customerSegmentIds as $customerSegmentId) { @@ -65,7 +81,8 @@ public function generateFilterText(\Magento\Framework\DataObject $quoteAddress) * * @return string[] * - * @deprecated 101.0.0 This method works incorrectly in admin panel + * @deprecated 101.0.0 + * @see This method works incorrectly in admin panel */ protected function getCustomerSegmentIds() {