From acd29dbb4634023507d90048ea07f75b5d197931 Mon Sep 17 00:00:00 2001 From: duongtq Date: Thu, 18 Jul 2024 14:39:32 +0700 Subject: [PATCH] [IMP] sell_only_by_packaging: support negative rounding when converting packaging qty --- .../models/product_product.py | 13 +++++++++- .../tests/test_sale_only_by_packaging.py | 25 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/sell_only_by_packaging/models/product_product.py b/sell_only_by_packaging/models/product_product.py index 2a3474607b7..22c7058354d 100644 --- a/sell_only_by_packaging/models/product_product.py +++ b/sell_only_by_packaging/models/product_product.py @@ -56,5 +56,16 @@ def _convert_packaging_qty(self, qty, uom, packaging): ) != 0 ): - qty = qty - (qty % q) + q + forced_qty = qty - (qty % q) + q + # Support negative rounding + if ( + float_compare( + qty, + 0.0, + precision_rounding=0.001, + ) + < 0 + ): + forced_qty = forced_qty - q + return forced_qty return qty diff --git a/sell_only_by_packaging/tests/test_sale_only_by_packaging.py b/sell_only_by_packaging/tests/test_sale_only_by_packaging.py index 9b78426af62..63fc1cf96f1 100644 --- a/sell_only_by_packaging/tests/test_sale_only_by_packaging.py +++ b/sell_only_by_packaging/tests/test_sale_only_by_packaging.py @@ -89,6 +89,31 @@ def test_convert_packaging_qty(self): self.assertAlmostEqual( so_line.product_uom_qty, 220, places=self.precision ) + # Check with negative quantity + so_line.product_uom_qty = -52 + self.assertAlmostEqual( + so_line.product_uom_qty, -60, places=self.precision + ) + so_line.product_uom_qty = -40 + self.assertAlmostEqual( + so_line.product_uom_qty, -40, places=self.precision + ) + so_line.product_uom_qty = -38 + self.assertAlmostEqual( + so_line.product_uom_qty, -40, places=self.precision + ) + so_line.product_uom_qty = -22 + self.assertAlmostEqual( + so_line.product_uom_qty, -40, places=self.precision + ) + so_line.product_uom_qty = -72 + self.assertAlmostEqual( + so_line.product_uom_qty, -80, places=self.precision + ) + so_line.product_uom_qty = -209.98 + self.assertAlmostEqual( + so_line.product_uom_qty, -220, places=self.precision + ) def test_onchange_qty_is_not_pack_multiple(self): """Check package when qantity is not a multiple of package quantity.