rule = $rule; } /** * @param CartCustomer $cartCustomer * @return array */ public function findMatchedRoleDiscounts(CartCustomer $cartCustomer): array { $roleDiscounts = $this->rule->getRoleDiscounts(); if (!$roleDiscounts) { return []; } if (!($currentUserRoles = $cartCustomer->getRoles())) { return []; } $matchedRoleDiscounts = []; foreach ($roleDiscounts as $roleDiscount) { if (count(array_intersect($roleDiscount->getRoles(), $currentUserRoles))) { $matchedRoleDiscounts[] = $roleDiscount; } } return $matchedRoleDiscounts; } /** * @param Cart $cart * @param CartItemsCollection $collection */ public function processItems(&$cart, &$collection) { foreach ($this->findMatchedRoleDiscounts($cart->getContext()->getCustomer()) as $roleDiscount) { if ( ! $roleDiscount->getDiscount()) { continue; } /** @var PriceCalculator $priceCalculator */ $priceCalculator = Factory::get( "Core_RuleProcessor_PriceCalculator", $this->rule, $roleDiscount->getDiscount() ); foreach ($collection->get_items() as &$item) { $priceCalculator->applyItemDiscount($item, $cart, $roleDiscount); } } } /** * @param Cart $cart * @param CartSetCollection $collection */ public function processSets(&$cart, &$collection) { foreach ($this->findMatchedRoleDiscounts($cart->getContext()->getCustomer()) as $roleDiscount) { /** @var PriceCalculator $priceCalculator */ $priceCalculator = Factory::get( "Core_RuleProcessor_PriceCalculator", $this->rule, $roleDiscount->getDiscount() ); foreach ($collection->getSets() as $set) { $priceCalculator->calculatePriceForSet($set, $cart, $roleDiscount); } } } }