/** * {@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; }
/** * {@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); }
/** * {@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); }
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); }
/** * {@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); }
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); }