public function incrementCouponUsage(OrderInterface $order)
 {
     $coupon = $order->getPromotionCoupon();
     if (null !== $coupon) {
         $coupon->incrementUsed();
     }
 }
 function it_decrements_a_usage_of_promotions_and_promotion_coupon_applied_on_order(OrderInterface $order, PromotionInterface $firstPromotion, PromotionInterface $secondPromotion, PromotionCouponInterface $promotionCoupon)
 {
     $order->getPromotions()->willReturn([$firstPromotion, $secondPromotion]);
     $order->getPromotionCoupon()->willReturn($promotionCoupon);
     $firstPromotion->decrementUsed()->shouldBeCalled();
     $secondPromotion->decrementUsed()->shouldBeCalled();
     $promotionCoupon->decrementUsed()->shouldBeCalled();
     $this->decrement($order);
 }
 function it_returns_false_if_subject_coupon_is_eligible_to_promotion_and_number_of_usages_is_bigger_than_coupon_usage_limit(OrderRepositoryInterface $orderRepository, OrderInterface $subject, PromotionInterface $promotion, CouponInterface $coupon, CustomerInterface $customer)
 {
     $subject->getPromotionCoupon()->willReturn($coupon);
     $promotion->isCouponBased()->willReturn(true);
     $subject->getCustomer()->willReturn($customer);
     $coupon->getPromotion()->willReturn($promotion);
     $coupon->getPerCustomerUsageLimit()->willReturn(5);
     $orderRepository->countByCustomerAndCoupon($customer, $coupon)->willReturn(6);
     $this->isEligible($subject, $promotion)->shouldReturn(false);
 }
 function it_dispatches_event_and_returns_false_if_subject_coupon_is_eligible_to_promotion_and_number_of_usages_is_bigger_than_coupon_usage_limit(CouponInterface $coupon, CustomerInterface $customer, EventDispatcherInterface $eventDispatcher, OrderInterface $subject, OrderRepositoryInterface $orderRepository, PromotionInterface $promotion)
 {
     $subject->getPromotionCoupon()->willReturn($coupon);
     $coupon->getPromotion()->willReturn($promotion);
     $subject->getCustomer()->willReturn($customer);
     $coupon->getPerCustomerUsageLimit()->willReturn(5);
     $orderRepository->countByCustomerAndCoupon($customer, $coupon)->willReturn(6);
     $eventDispatcher->dispatch(SyliusPromotionEvents::COUPON_NOT_ELIGIBLE, Argument::type(GenericEvent::class))->shouldBeCalled();
     $this->isEligible($subject, $promotion)->shouldReturn(false);
 }
 /**
  * {@inheritdoc}
  */
 public function decrement(OrderInterface $order)
 {
     foreach ($order->getPromotions() as $promotion) {
         $promotion->decrementUsed();
     }
     $promotionCoupon = $order->getPromotionCoupon();
     if (null !== $promotionCoupon) {
         $promotionCoupon->decrementUsed();
     }
 }
 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);
 }
 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->getPromotionCoupon()->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);
 }
 function it_increments_coupon_usage_if_coupon_was_set(OrderInterface $order, CouponInterface $coupon)
 {
     $order->getPromotionCoupon()->willReturn($coupon);
     $coupon->incrementUsed()->shouldBeCalled();
     $this->incrementCouponUsage($order);
 }