Skip to content

Commit c01ef7d

Browse files
authored
Fix line items creation being tied with the number of taxes (Sylius#399)
| Q | A | --------------- | ----- | Branch? | 1.7 | Bug fix? | yes | New feature? | no? | Related tickets | fixes Sylius#367, replaces Sylius#298
2 parents fffec83 + 8db71cc commit c01ef7d

File tree

4 files changed

+356
-71
lines changed

4 files changed

+356
-71
lines changed

spec/Provider/OrderItemNonNeutralTaxesProviderSpec.php

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,153 @@ function it_provides_non_neutral_tax_based_on_given_order_item(
4242

4343
$this->provide($orderItem)->shouldReturn([20]);
4444
}
45+
46+
function it_returns_empty_array_when_no_taxes_exist(
47+
OrderItemInterface $orderItem,
48+
OrderItemUnitInterface $orderItemUnit,
49+
): void {
50+
$orderItem->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
51+
->willReturn(new ArrayCollection([]));
52+
53+
$orderItem->getUnits()->willReturn(new ArrayCollection([$orderItemUnit->getWrappedObject()]));
54+
$orderItemUnit->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
55+
->willReturn(new ArrayCollection([]));
56+
57+
$this->provide($orderItem)->shouldReturn([]);
58+
}
59+
60+
function it_returns_empty_array_when_only_neutral_taxes_exist(
61+
OrderItemInterface $orderItem,
62+
AdjustmentInterface $neutralAdjustment1,
63+
AdjustmentInterface $neutralAdjustment2,
64+
OrderItemUnitInterface $orderItemUnit,
65+
AdjustmentInterface $neutralUnitAdjustment,
66+
): void {
67+
$orderItem->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
68+
->willReturn(new ArrayCollection([
69+
$neutralAdjustment1->getWrappedObject(),
70+
$neutralAdjustment2->getWrappedObject(),
71+
]));
72+
73+
$neutralAdjustment1->isNeutral()->willReturn(true);
74+
$neutralAdjustment1->getAmount()->shouldNotBeCalled();
75+
$neutralAdjustment2->isNeutral()->willReturn(true);
76+
$neutralAdjustment2->getAmount()->shouldNotBeCalled();
77+
78+
$orderItem->getUnits()->willReturn(new ArrayCollection([$orderItemUnit->getWrappedObject()]));
79+
$orderItemUnit->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
80+
->willReturn(new ArrayCollection([$neutralUnitAdjustment->getWrappedObject()]));
81+
82+
$neutralUnitAdjustment->isNeutral()->willReturn(true);
83+
$neutralUnitAdjustment->getAmount()->shouldNotBeCalled();
84+
85+
$this->provide($orderItem)->shouldReturn([]);
86+
}
87+
88+
function it_collects_multiple_non_neutral_taxes_from_order_item_and_units(
89+
OrderItemInterface $orderItem,
90+
AdjustmentInterface $orderItemTax1,
91+
AdjustmentInterface $orderItemTax2,
92+
OrderItemUnitInterface $orderItemUnit1,
93+
OrderItemUnitInterface $orderItemUnit2,
94+
AdjustmentInterface $unit1Tax,
95+
AdjustmentInterface $unit2Tax,
96+
): void {
97+
$orderItem->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
98+
->willReturn(new ArrayCollection([
99+
$orderItemTax1->getWrappedObject(),
100+
$orderItemTax2->getWrappedObject(),
101+
]));
102+
103+
$orderItemTax1->isNeutral()->willReturn(false);
104+
$orderItemTax1->getAmount()->willReturn(100);
105+
$orderItemTax2->isNeutral()->willReturn(false);
106+
$orderItemTax2->getAmount()->willReturn(50);
107+
108+
$orderItem->getUnits()->willReturn(new ArrayCollection([
109+
$orderItemUnit1->getWrappedObject(),
110+
$orderItemUnit2->getWrappedObject(),
111+
]));
112+
113+
$orderItemUnit1->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
114+
->willReturn(new ArrayCollection([$unit1Tax->getWrappedObject()]));
115+
$orderItemUnit2->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
116+
->willReturn(new ArrayCollection([$unit2Tax->getWrappedObject()]));
117+
118+
$unit1Tax->isNeutral()->willReturn(false);
119+
$unit1Tax->getAmount()->willReturn(25);
120+
$unit2Tax->isNeutral()->willReturn(false);
121+
$unit2Tax->getAmount()->willReturn(25);
122+
123+
$this->provide($orderItem)->shouldReturn([100, 50, 25, 25]);
124+
}
125+
126+
function it_filters_out_neutral_taxes_and_only_returns_non_neutral(
127+
OrderItemInterface $orderItem,
128+
AdjustmentInterface $nonNeutralTax,
129+
AdjustmentInterface $neutralTax,
130+
OrderItemUnitInterface $orderItemUnit,
131+
AdjustmentInterface $unitNonNeutralTax,
132+
AdjustmentInterface $unitNeutralTax,
133+
): void {
134+
$orderItem->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
135+
->willReturn(new ArrayCollection([
136+
$nonNeutralTax->getWrappedObject(),
137+
$neutralTax->getWrappedObject(),
138+
]));
139+
140+
$nonNeutralTax->isNeutral()->willReturn(false);
141+
$nonNeutralTax->getAmount()->willReturn(200);
142+
$neutralTax->isNeutral()->willReturn(true);
143+
$neutralTax->getAmount()->shouldNotBeCalled();
144+
145+
$orderItem->getUnits()->willReturn(new ArrayCollection([$orderItemUnit->getWrappedObject()]));
146+
$orderItemUnit->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
147+
->willReturn(new ArrayCollection([
148+
$unitNonNeutralTax->getWrappedObject(),
149+
$unitNeutralTax->getWrappedObject(),
150+
]));
151+
152+
$unitNonNeutralTax->isNeutral()->willReturn(false);
153+
$unitNonNeutralTax->getAmount()->willReturn(30);
154+
$unitNeutralTax->isNeutral()->willReturn(true);
155+
$unitNeutralTax->getAmount()->shouldNotBeCalled();
156+
157+
$this->provide($orderItem)->shouldReturn([200, 30]);
158+
}
159+
160+
function it_handles_multiple_units_with_different_tax_amounts(
161+
OrderItemInterface $orderItem,
162+
OrderItemUnitInterface $unit1,
163+
OrderItemUnitInterface $unit2,
164+
OrderItemUnitInterface $unit3,
165+
AdjustmentInterface $unit1Tax,
166+
AdjustmentInterface $unit2Tax,
167+
AdjustmentInterface $unit3Tax,
168+
): void {
169+
$orderItem->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
170+
->willReturn(new ArrayCollection([]));
171+
172+
$orderItem->getUnits()->willReturn(new ArrayCollection([
173+
$unit1->getWrappedObject(),
174+
$unit2->getWrappedObject(),
175+
$unit3->getWrappedObject(),
176+
]));
177+
178+
$unit1->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
179+
->willReturn(new ArrayCollection([$unit1Tax->getWrappedObject()]));
180+
$unit2->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
181+
->willReturn(new ArrayCollection([$unit2Tax->getWrappedObject()]));
182+
$unit3->getAdjustments(AdjustmentInterface::TAX_ADJUSTMENT)
183+
->willReturn(new ArrayCollection([$unit3Tax->getWrappedObject()]));
184+
185+
$unit1Tax->isNeutral()->willReturn(false);
186+
$unit1Tax->getAmount()->willReturn(100);
187+
$unit2Tax->isNeutral()->willReturn(false);
188+
$unit2Tax->getAmount()->willReturn(100);
189+
$unit3Tax->isNeutral()->willReturn(false);
190+
$unit3Tax->getAmount()->willReturn(100);
191+
192+
$this->provide($orderItem)->shouldReturn([100, 100, 100]);
193+
}
45194
}

0 commit comments

Comments
 (0)