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); }
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_does_not_recognize_a_subject_as_eligible_if_items_from_required_taxon_has_too_low_total(TaxonRepositoryInterface $taxonRepository, OrderInterface $order, OrderItemInterface $compositeBowItem, OrderItemInterface $longswordItem, ProductInterface $compositeBow, ProductInterface $longsword, TaxonInterface $bows) { $order->getItems()->willReturn([$compositeBowItem, $longswordItem]); $taxonRepository->findOneBy(['code' => 'bows'])->willReturn($bows); $compositeBowItem->getProduct()->willReturn($compositeBow); $compositeBow->hasTaxon($bows)->willReturn(true); $compositeBowItem->getTotal()->willReturn(5000); $longswordItem->getProduct()->willReturn($longsword); $longsword->hasTaxon($bows)->willReturn(false); $longswordItem->getTotal()->willReturn(4000); $this->isEligible($order, ['taxon' => 'bows', 'amount' => 10000])->shouldReturn(false); }
function it_does_not_apply_promotions_with_amount_0($adjustmentFactory, $distributor, $originator, $priceRangeFilter, $taxonFilter, AdjustmentInterface $promotionAdjustment1, Collection $originalItems, Collection $units, OrderInterface $order, OrderItemInterface $orderItem1, OrderItemInterface $orderItem2, OrderItemInterface $orderItem3, OrderItemUnitInterface $unit1, OrderItemUnitInterface $unit2, PromotionInterface $promotion) { $order->getItems()->willReturn($originalItems); $originalItems->toArray()->willReturn([$orderItem1, $orderItem2, $orderItem3]); $priceRangeFilter->filter([$orderItem1, $orderItem2, $orderItem3], ['percentage' => 0.2, 'filters' => ['taxons' => ['testTaxon']]])->willReturn([$orderItem1, $orderItem2]); $taxonFilter->filter([$orderItem1, $orderItem2], ['percentage' => 0.2, 'filters' => ['taxons' => ['testTaxon']]])->willReturn([$orderItem1]); $orderItem1->getQuantity()->willReturn(2); $orderItem1->getUnits()->willReturn($units); $units->getIterator()->willReturn(new \ArrayIterator([$unit1->getWrappedObject(), $unit2->getWrappedObject()])); $orderItem1->getTotal()->willReturn(5); $distributor->distribute(1, 2)->willReturn([1, 0]); $promotion->getDescription()->willReturn('Test description'); $adjustmentFactory->createNew()->willReturn($promotionAdjustment1); $promotionAdjustment1->setType(AdjustmentInterface::ORDER_ITEM_PROMOTION_ADJUSTMENT)->shouldBeCalled(); $promotionAdjustment1->setLabel('Test description')->shouldBeCalled(); $promotionAdjustment1->setAmount(-1)->shouldBeCalled(); $originator->setOrigin($promotionAdjustment1, $promotion)->shouldBeCalled(); $unit1->addAdjustment($promotionAdjustment1)->shouldBeCalled(); $unit2->addAdjustment(Argument::any())->shouldNotBeCalled(); $this->execute($order, ['percentage' => 0.2, 'filters' => ['taxons' => ['testTaxon']]], $promotion); }
function it_does_not_include_shipping_promotion_adjustment_in_order_promotion_total(AdjustmentInterface $shippingPromotionAdjustment, OrderItemInterface $orderItem1) { $orderItem1->getTotal()->willReturn(500); $orderItem1->getAdjustmentsTotalRecursively(AdjustmentInterface::ORDER_PROMOTION_ADJUSTMENT)->willReturn(-400); $shippingPromotionAdjustment->getType()->willReturn(AdjustmentInterface::ORDER_PROMOTION_ADJUSTMENT); $shippingPromotionAdjustment->isNeutral()->willReturn(false); $shippingPromotionAdjustment->getAmount()->willReturn(-100); $orderItem1->setOrder($this)->shouldBeCalled(); $this->addItem($orderItem1); $shippingPromotionAdjustment->setAdjustable($this)->shouldBeCalled(); $this->addAdjustment($shippingPromotionAdjustment); $this->getOrderPromotionTotal()->shouldReturn(-400); }
function it_does_not_apply_taxes_with_amount_0($adjustmentsFactory, $calculator, $distributor, $taxRateResolver, Collection $items, Collection $units, OrderInterface $order, OrderItemInterface $orderItem, OrderItemUnitInterface $unit1, OrderItemUnitInterface $unit2, ProductVariantInterface $productVariant, TaxRateInterface $taxRate, ZoneInterface $zone) { $order->getItems()->willReturn($items); $items->count()->willReturn(1); $items->getIterator()->willReturn(new \ArrayIterator([$orderItem->getWrappedObject()])); $orderItem->getQuantity()->willReturn(2); $orderItem->getVariant()->willReturn($productVariant); $taxRateResolver->resolve($productVariant, ['zone' => $zone])->willReturn($taxRate); $orderItem->getTotal()->willReturn(1000); $calculator->calculate(1000, $taxRate)->willReturn(0); $taxRate->getLabel()->willReturn('Simple tax (0%)'); $taxRate->isIncludedInPrice()->willReturn(false); $orderItem->getUnits()->willReturn($units); $units->getIterator()->willReturn(new \ArrayIterator([$unit1->getWrappedObject(), $unit2->getWrappedObject()])); $distributor->distribute(0, 2)->willReturn([0, 0]); $adjustmentsFactory->createWithData(AdjustmentInterface::TAX_ADJUSTMENT, 'Simple tax (0%)', 0, false)->shouldNotBeCalled(); $this->apply($order, $zone); }
function it_not_a_backorder_if_contains_no_backordered_units(InventoryUnitInterface $unit1, InventoryUnitInterface $unit2, OrderItemInterface $item) { $unit1->getInventoryState()->willReturn(InventoryUnitInterface::STATE_SOLD); $unit2->getInventoryState()->willReturn(InventoryUnitInterface::STATE_SOLD); $item->getUnits()->willReturn([$unit1, $unit2]); $item->getTotal()->willReturn(4000); $item->setOrder($this)->shouldBeCalled(); $this->addItem($item); $this->shouldNotBeBackorder(); }
function it_does_not_recognize_a_subject_as_eligible_if_items_from_required_taxon_has_too_low_total(ChannelInterface $channel, OrderInterface $order, OrderItemInterface $compositeBowItem, OrderItemInterface $longswordItem, ProductInterface $compositeBow, ProductInterface $longsword, ProductTaxonInterface $bowsProductTaxon, TaxonInterface $bows, TaxonRepositoryInterface $taxonRepository) { $order->getChannel()->willReturn($channel); $channel->getCode()->willReturn('WEB_US'); $order->getItems()->willReturn([$compositeBowItem, $longswordItem]); $taxonRepository->findOneBy(['code' => 'bows'])->willReturn($bows); $compositeBowItem->getProduct()->willReturn($compositeBow); $compositeBow->filterProductTaxonsByTaxon($bows)->willReturn(new ArrayCollection([$bowsProductTaxon])); $compositeBowItem->getTotal()->willReturn(5000); $longswordItem->getProduct()->willReturn($longsword); $longsword->filterProductTaxonsByTaxon($bows)->willReturn(new ArrayCollection([])); $longswordItem->getTotal()->willReturn(4000); $this->isEligible($order, ['WEB_US' => ['taxon' => 'bows', 'amount' => 10000]])->shouldReturn(false); }
function it_returns_promotions_total_recursively(AdjustmentInterface $orderPromotionAdjustment, AdjustmentInterface $orderItemPromotionAdjustment, OrderItemInterface $orderItem) { $orderPromotionAdjustment->getAmount()->willReturn(10000); $orderItemPromotionAdjustment->getAmount()->willReturn(5000); $orderPromotionAdjustment->isNeutral()->willReturn(false); $orderItemPromotionAdjustment->isNeutral()->willReturn(false); $orderPromotionAdjustment->getType()->willReturn(AdjustmentInterface::ORDER_PROMOTION_ADJUSTMENT); $orderItemPromotionAdjustment->getType()->willReturn(AdjustmentInterface::ORDER_ITEM_PROMOTION_ADJUSTMENT); $orderPromotionAdjustment->setAdjustable($this)->shouldBeCalled(); $orderItem->getAdjustmentsRecursively(AdjustmentInterface::ORDER_ITEM_PROMOTION_ADJUSTMENT)->willReturn([$orderItemPromotionAdjustment]); $orderItem->setOrder($this)->shouldBeCalled(); $orderItem->getTotal()->willReturn(15000); $orderItem->getAdjustmentsRecursively(AdjustmentInterface::ORDER_PROMOTION_ADJUSTMENT)->willReturn([]); $this->addItem($orderItem); $this->addAdjustment($orderPromotionAdjustment); $this->getPromotionsTotalRecursively()->shouldReturn(15000); }