/**
  * {@inheritdoc}
  */
 public function execute(PromotionSubjectInterface $subject, array $configuration, PromotionInterface $promotion)
 {
     if (!$this->isSubjectValid($subject)) {
         return false;
     }
     $channelCode = $subject->getChannel()->getCode();
     if (!isset($configuration[$channelCode])) {
         return false;
     }
     try {
         $this->isConfigurationValid($configuration[$channelCode]);
     } catch (\InvalidArgumentException $exception) {
         return false;
     }
     $promotionAmount = $this->calculateAdjustmentAmount($subject->getPromotionSubjectTotal(), $configuration[$channelCode]['amount']);
     if (0 === $promotionAmount) {
         return false;
     }
     $itemsTotals = [];
     foreach ($subject->getItems() as $item) {
         $itemsTotals[] = $item->getTotal();
     }
     $splitPromotion = $this->proportionalDistributor->distribute($itemsTotals, $promotionAmount);
     $this->unitsPromotionAdjustmentsApplicator->apply($subject, $promotion, $splitPromotion);
     return true;
 }
 function it_uses_distributor_and_applicator_to_execute_promotion_action(OrderInterface $order, OrderItemInterface $firstItem, OrderItemInterface $secondItem, PromotionInterface $promotion, IntegerDistributorInterface $integerDistributor, UnitsPromotionAdjustmentsApplicatorInterface $unitsPromotionAdjustmentsApplicator)
 {
     $order->countItems()->willReturn(2);
     $order->getItems()->willReturn(new \ArrayIterator([$firstItem->getWrappedObject(), $secondItem->getWrappedObject()]));
     $order->getPromotionSubjectTotal()->willReturn(10000);
     $integerDistributor->distribute(-1000, 2)->willReturn([-500, -500]);
     $unitsPromotionAdjustmentsApplicator->apply($order, $promotion, [-500, -500])->shouldBeCalled();
     $this->execute($order, ['percentage' => 0.1], $promotion);
 }
Exemplo n.º 3
0
 function it_does_not_apply_bigger_promotion_than_promotion_subject_total(OrderInterface $order, OrderItemInterface $firstItem, OrderItemInterface $secondItem, PromotionInterface $promotion, ProportionalIntegerDistributorInterface $proportionalIntegerDistributor, UnitsPromotionAdjustmentsApplicatorInterface $unitsPromotionAdjustmentsApplicator)
 {
     $order->countItems()->willReturn(2);
     $order->getItems()->willReturn(new \ArrayIterator([$firstItem->getWrappedObject(), $secondItem->getWrappedObject()]));
     $order->getPromotionSubjectTotal()->willReturn(10000);
     $firstItem->getTotal()->willReturn(6000);
     $secondItem->getTotal()->willReturn(4000);
     $proportionalIntegerDistributor->distribute([6000, 4000], -10000)->willReturn([-6000, -4000]);
     $unitsPromotionAdjustmentsApplicator->apply($order, $promotion, [-6000, -4000])->shouldBeCalled();
     $this->execute($order, ['amount' => 15000], $promotion);
 }
 function it_uses_distributor_and_applicator_to_execute_promotion_action(OrderInterface $order, OrderItemInterface $firstItem, OrderItemInterface $secondItem, PromotionInterface $promotion, ProportionalIntegerDistributorInterface $distributor, UnitsPromotionAdjustmentsApplicatorInterface $unitsPromotionAdjustmentsApplicator)
 {
     $order->countItems()->willReturn(2);
     $order->getItems()->willReturn([$firstItem, $secondItem]);
     $firstItem->getTotal()->willReturn(200);
     $secondItem->getTotal()->willReturn(800);
     $order->getPromotionSubjectTotal()->willReturn(10000);
     $distributor->distribute([200, 800], -1000)->willReturn([-200, -800]);
     $unitsPromotionAdjustmentsApplicator->apply($order, $promotion, [-200, -800])->shouldBeCalled();
     $this->execute($order, ['percentage' => 0.1], $promotion);
 }
 /**
  * {@inheritdoc}
  */
 public function execute(PromotionSubjectInterface $subject, array $configuration, PromotionInterface $promotion)
 {
     if (!$this->isSubjectValid($subject)) {
         return;
     }
     $this->isConfigurationValid($configuration);
     $promotionAmount = $this->calculateAdjustmentAmount($subject->getPromotionSubjectTotal(), $configuration['percentage']);
     if (0 === $promotionAmount) {
         return;
     }
     $splitPromotion = $this->distributor->distribute($promotionAmount, $subject->countItems());
     $this->unitsPromotionAdjustmentsApplicator->apply($subject, $promotion, $splitPromotion);
 }
Exemplo n.º 6
0
 /**
  * {@inheritdoc}
  */
 public function execute(PromotionSubjectInterface $subject, array $configuration, PromotionInterface $promotion)
 {
     if (!$this->isSubjectValid($subject)) {
         return;
     }
     $this->isConfigurationValid($configuration);
     $promotionAmount = $this->calculateAdjustmentAmount($subject->getPromotionSubjectTotal(), $configuration['amount']);
     if (0 === $promotionAmount) {
         return;
     }
     $itemsTotals = [];
     foreach ($subject->getItems() as $item) {
         $itemsTotals[] = $item->getTotal();
     }
     $splitPromotion = $this->proportionalDistributor->distribute($itemsTotals, $promotionAmount);
     $this->unitsPromotionAdjustmentsApplicator->apply($subject, $promotion, $splitPromotion);
 }
 /**
  * {@inheritdoc}
  */
 public function execute(PromotionSubjectInterface $subject, array $configuration, PromotionInterface $promotion)
 {
     /** @var OrderInterface $subject */
     if (!$this->isSubjectValid($subject)) {
         return;
     }
     $this->isConfigurationValid($configuration);
     $promotionAmount = $this->calculateAdjustmentAmount($subject->getPromotionSubjectTotal(), $configuration['percentage']);
     if (0 === $promotionAmount) {
         return;
     }
     $itemsTotal = [];
     foreach ($subject->getItems() as $orderItem) {
         $itemsTotal[] = $orderItem->getTotal();
     }
     $splitPromotion = $this->distributor->distribute($itemsTotal, $promotionAmount);
     $this->unitsPromotionAdjustmentsApplicator->apply($subject, $promotion, $splitPromotion);
 }