private function isCouponEligibleToLimit(CouponInterface $coupon, PromotionInterface $promotion, CustomerInterface $customer = null)
 {
     if (!$coupon instanceof CouponInterface) {
         return true;
     }
     if (!$coupon->getPerCustomerUsageLimit()) {
         return true;
     }
     if (null === $customer && $coupon->getPerCustomerUsageLimit()) {
         return false;
     }
     return $this->isCouponEligible($coupon, $promotion, $customer);
 }
 /**
  * @param CouponInterface $coupon
  * @param CustomerInterface|null $customer
  *
  * @return bool
  */
 private function isCouponEligibleToLimit(CouponInterface $coupon, CustomerInterface $customer = null)
 {
     $couponUsageLimit = $coupon->getPerCustomerUsageLimit();
     if (0 === $couponUsageLimit) {
         return true;
     }
     if (null === $customer) {
         return false;
     }
     $placedOrdersNumber = $this->orderRepository->countByCustomerAndCoupon($customer, $coupon);
     // <= because we need to include the cart orders as well
     return $placedOrdersNumber <= $couponUsageLimit;
 }
 public function it_recognizes_subject_as_not_eligible_if_user_not_linked_to_order(OrderInterface $subject, PromotionInterface $promotion, CouponInterface $coupon)
 {
     $subject->getUser()->willReturn(null);
     $coupon->getCode()->willReturn('D0003');
     $coupon->getPerUserUsageLimit()->willReturn(1);
     $coupon->getPromotion()->willReturn($promotion);
     $subject->getPromotionCoupon()->willReturn($coupon);
     $promotion->getRules()->willReturn(array());
     $promotion->getStartsAt()->willReturn(null);
     $promotion->getEndsAt()->willReturn(null);
     $promotion->isCouponBased()->willReturn(true);
     $promotion->hasCoupons()->willReturn(true);
     $promotion->hasCoupon($coupon)->willReturn(true);
     $promotion->getUsageLimit()->willReturn(null);
     $promotion->getCoupons()->willReturn(array($coupon));
     $this->isEligible($subject, $promotion)->shouldReturn(false);
 }
 /**
  * @Then /^(this coupon) should still exist in the registry$/
  */
 public function couponShouldStillExistInTheRegistry(CouponInterface $coupon)
 {
     Assert::true($this->indexPage->isSingleResourceOnPage(['code' => $coupon->getCode()]), sprintf('Coupon with code %s should exist.', $coupon->getCode()));
 }
 public function it_recognizes_subject_as_eligible_if_customer_not_linked_to_order_and_coupon_not_restricted_by_customer(OrderInterface $subject, PromotionInterface $promotion, CouponInterface $coupon)
 {
     $subject->getCustomer()->willReturn(null);
     $coupon->getCode()->willReturn('D0003');
     $coupon->getPerCustomerUsageLimit()->willReturn(0);
     $coupon->getPromotion()->willReturn($promotion);
     $subject->getPromotionCoupons()->willReturn([$coupon]);
     $promotion->hasRules()->willReturn(false);
     $promotion->getStartsAt()->willReturn(null);
     $promotion->getEndsAt()->willReturn(null);
     $promotion->isCouponBased()->willReturn(true);
     $promotion->hasCoupons()->willReturn(true);
     $promotion->hasCoupon($coupon)->willReturn(true);
     $promotion->getUsageLimit()->willReturn(null);
     $promotion->getCoupons()->willReturn([$coupon]);
     $this->isEligible($subject, $promotion)->shouldReturn(true);
 }