Skip to content
This repository was archived by the owner on Apr 29, 2019. It is now read-only.

Commit 7a0534a

Browse files
committed
Fixed decimal handling in order quantities
Added test coverage to getSimpleQtyToShip and getQtyToInvoice Fixes 14328
1 parent 068a97e commit 7a0534a

File tree

2 files changed

+199
-2
lines changed

2 files changed

+199
-2
lines changed

app/code/Magento/Sales/Model/Order/Item.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ public function getQtyToShip()
233233
public function getSimpleQtyToShip()
234234
{
235235
$qty = $this->getQtyOrdered() - $this->getQtyShipped() - $this->getQtyRefunded() - $this->getQtyCanceled();
236-
return max($qty, 0);
236+
return max(round($qty, 8), 0);
237237
}
238238

239239
/**
@@ -248,7 +248,7 @@ public function getQtyToInvoice()
248248
}
249249

250250
$qty = $this->getQtyOrdered() - $this->getQtyInvoiced() - $this->getQtyCanceled();
251-
return max($qty, 0);
251+
return max(round($qty, 8), 0);
252252
}
253253

254254
/**

app/code/Magento/Sales/Test/Unit/Model/Order/ItemTest.php

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,4 +235,201 @@ public function getProductOptionsDataProvider()
235235
]
236236
];
237237
}
238+
239+
/**
240+
* Test different combinations of item qty setups
241+
*
242+
* @param array $options
243+
* @param float $expectedResult
244+
*
245+
* @dataProvider getItemQtyVariants
246+
*/
247+
public function testGetSimpleQtyToShip(array $options, $expectedResult)
248+
{
249+
$this->model->setData($options);
250+
$this->assertSame($this->model->getSimpleQtyToShip(), $expectedResult['to_ship']);
251+
}
252+
253+
/**
254+
* Test different combinations of item qty setups
255+
*
256+
* @param array $options
257+
* @param float $expectedResult
258+
*
259+
* @dataProvider getItemQtyVariants
260+
*/
261+
public function testGetQtyToInvoice(array $options, $expectedResult)
262+
{
263+
$this->model->setData($options);
264+
$this->assertSame($this->model->getQtyToInvoice(), $expectedResult['to_invoice']);
265+
}
266+
267+
/**
268+
* Provides different combinations of qty options for an item and the
269+
* expected qtys pending shipment and invoice
270+
*
271+
* @return array
272+
*/
273+
public function getItemQtyVariants()
274+
{
275+
return [
276+
'empty_item' => [
277+
'options' => [
278+
'qty_ordered' => 0,
279+
'qty_invoiced' => 0,
280+
'qty_refunded' => 0,
281+
'qty_shipped' => 0,
282+
'qty_canceled' => 0,
283+
],
284+
'expectedResult' => [
285+
'to_ship' => 0.0,
286+
'to_invoice' => 0.0
287+
]
288+
],
289+
'ordered_item' => [
290+
'options' => [
291+
'qty_ordered' => 12,
292+
'qty_invoiced' => 0,
293+
'qty_refunded' => 0,
294+
'qty_shipped' => 0,
295+
'qty_canceled' => 0,
296+
],
297+
'expectedResult' => [
298+
'to_ship' => 12.0,
299+
'to_invoice' => 12.0
300+
]
301+
],
302+
'partially_invoiced' => [
303+
'options' => [
304+
'qty_ordered' => 12,
305+
'qty_invoiced' => 4,
306+
'qty_refunded' => 0,
307+
'qty_shipped' => 0,
308+
'qty_canceled' => 0,
309+
],
310+
'expectedResult' => [
311+
'to_ship' => 12.0,
312+
'to_invoice' => 8.0
313+
]
314+
],
315+
'completely_invoiced' => [
316+
'options' => [
317+
'qty_ordered' => 12,
318+
'qty_invoiced' => 12,
319+
'qty_refunded' => 0,
320+
'qty_shipped' => 0,
321+
'qty_canceled' => 0,
322+
],
323+
'expectedResult' => [
324+
'to_ship' => 12.0,
325+
'to_invoice' => 0.0
326+
]
327+
],
328+
'partially_invoiced_refunded' => [
329+
'options' => [
330+
'qty_ordered' => 12,
331+
'qty_invoiced' => 5,
332+
'qty_refunded' => 5,
333+
'qty_shipped' => 0,
334+
'qty_canceled' => 0,
335+
],
336+
'expectedResult' => [
337+
'to_ship' => 7.0,
338+
'to_invoice' => 7.0
339+
]
340+
],
341+
'partially_refunded' => [
342+
'options' => [
343+
'qty_ordered' => 12,
344+
'qty_invoiced' => 12,
345+
'qty_refunded' => 5,
346+
'qty_shipped' => 0,
347+
'qty_canceled' => 0,
348+
],
349+
'expectedResult' => [
350+
'to_ship' => 7.0,
351+
'to_invoice' => 0.0
352+
]
353+
],
354+
'partially_shipped' => [
355+
'options' => [
356+
'qty_ordered' => 12,
357+
'qty_invoiced' => 0,
358+
'qty_refunded' => 0,
359+
'qty_shipped' => 4,
360+
'qty_canceled' => 0,
361+
],
362+
'expectedResult' => [
363+
'to_ship' => 8.0,
364+
'to_invoice' => 12.0
365+
]
366+
],
367+
'partially_refunded_partially_shipped' => [
368+
'options' => [
369+
'qty_ordered' => 12,
370+
'qty_invoiced' => 12,
371+
'qty_refunded' => 5,
372+
'qty_shipped' => 4,
373+
'qty_canceled' => 0,
374+
],
375+
'expectedResult' => [
376+
'to_ship' => 3.0,
377+
'to_invoice' => 0.0
378+
]
379+
],
380+
'complete' => [
381+
'options' => [
382+
'qty_ordered' => 12,
383+
'qty_invoiced' => 12,
384+
'qty_refunded' => 0,
385+
'qty_shipped' => 12,
386+
'qty_canceled' => 0,
387+
],
388+
'expectedResult' => [
389+
'to_ship' => 0.0,
390+
'to_invoice' => 0.0
391+
]
392+
],
393+
'canceled' => [
394+
'options' => [
395+
'qty_ordered' => 12,
396+
'qty_invoiced' => 0,
397+
'qty_refunded' => 0,
398+
'qty_shipped' => 0,
399+
'qty_canceled' => 12,
400+
],
401+
'expectedResult' => [
402+
'to_ship' => 0.0,
403+
'to_invoice' => 0.0
404+
]
405+
],
406+
'completely_shipped_using_decimals' => [
407+
'options' => [
408+
'qty_ordered' => 4.4,
409+
'qty_invoiced' => 0.4,
410+
'qty_refunded' => 0.4,
411+
'qty_shipped' => 4,
412+
'qty_canceled' => 0,
413+
],
414+
'expectedResult' => [
415+
'to_ship' => 0.0,
416+
'to_invoice' => 4.0
417+
]
418+
],
419+
'completely_invoiced_using_decimals' => [
420+
'options' => [
421+
'qty_ordered' => 4.4,
422+
'qty_invoiced' => 4,
423+
'qty_refunded' => 0,
424+
'qty_shipped' => 4,
425+
'qty_canceled' => 0.4,
426+
],
427+
'expectedResult' => [
428+
'to_ship' => 0.0,
429+
'to_invoice' => 0.0
430+
]
431+
]
432+
];
433+
}
434+
238435
}

0 commit comments

Comments
 (0)