diff --git a/addons/stock_account/models/stock_move.py b/addons/stock_account/models/stock_move.py index 829d15ac0d5..d313ad0a481 100644 --- a/addons/stock_account/models/stock_move.py +++ b/addons/stock_account/models/stock_move.py @@ -45,7 +45,9 @@ class StockMove(models.Model): precision = self.env['decimal.precision'].precision_get('Product Price') # If the move is a return, use the original move's price unit. if self.origin_returned_move_id and self.origin_returned_move_id.sudo().stock_valuation_layer_ids: - return self.origin_returned_move_id.sudo().stock_valuation_layer_ids[-1].unit_cost + layers = self.origin_returned_move_id.sudo().stock_valuation_layer_ids + quantity = sum(layers.mapped("quantity")) + return layers.currency_id.round(sum(layers.mapped("value")) / quantity) if not float_is_zero(quantity, layers.uom_id.rounding) else 0 return price_unit if not float_is_zero(price_unit, precision) or self._should_force_price_unit() else self.product_id.standard_price @api.model diff --git a/addons/stock_account/tests/test_stockvaluationlayer.py b/addons/stock_account/tests/test_stockvaluationlayer.py index 871c75a7bf6..b92f197f131 100644 --- a/addons/stock_account/tests/test_stockvaluationlayer.py +++ b/addons/stock_account/tests/test_stockvaluationlayer.py @@ -518,6 +518,16 @@ class TestStockValuationAVCO(TestStockValuationCommon): self.assertEqual(self.product1.quantity_svl, 0) self.assertEqual(self.product1.standard_price, 1.01) + def test_return_delivery_2(self): + self.product1.write({"standard_price": 1}) + move1 = self._make_out_move(self.product1, 10, create_picking=True, force_assign=True) + self._make_in_move(self.product1, 10, unit_cost=2) + self._make_return(move1, 10) + + self.assertEqual(self.product1.value_svl, 20) + self.assertEqual(self.product1.quantity_svl, 10) + self.assertEqual(self.product1.standard_price, 2) + class TestStockValuationFIFO(TestStockValuationCommon): @classmethod @@ -689,6 +699,15 @@ class TestStockValuationFIFO(TestStockValuationCommon): returned = self._make_return(out_move02, 1) self.assertEqual(returned.stock_valuation_layer_ids.value, 0) + def test_return_delivery_3(self): + self.product1.write({"standard_price": 1}) + move1 = self._make_out_move(self.product1, 10, create_picking=True, force_assign=True) + self._make_in_move(self.product1, 10, unit_cost=2) + self._make_return(move1, 10) + + self.assertEqual(self.product1.value_svl, 20) + self.assertEqual(self.product1.quantity_svl, 10) + class TestStockValuationChangeCostMethod(TestStockValuationCommon): def test_standard_to_fifo_1(self):