From e0631bf9fe9e8c97eaa740813877ee3074e9ce4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 29 Jul 2020 23:50:03 +0200 Subject: [PATCH] Do not update average cost price if the quantity is negative This is the same test done in Move._compute_product_cost_price. When the stock quantity is below zero, the average cost price should not change. And we process the incoming move first in order to keep quantity positive where possible. issue9484 review325801002 --- product.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/product.py b/product.py index 107d36721b..a737c2a1e5 100644 --- a/product.py +++ b/product.py @@ -143,9 +143,7 @@ class Product(metaclass=PoolMeta): return move.from_location.type == 'storage' def compute_fifo_cost_price(quantity, date): - fifo_moves = self.get_fifo_move( - float(quantity), - date=current_moves[-1].effective_date) + fifo_moves = self.get_fifo_move(float(quantity), date=date) cost_price = Decimal(0) consumed_qty = 0 @@ -159,6 +157,11 @@ class Product(metaclass=PoolMeta): if consumed_qty: return round_price(cost_price / Decimal(str(consumed_qty))) + # For each day, process the incoming moves first + # in order to keep quantity positive where possible + # We do not re-browse because we expect only small changes + moves = sorted(moves, key=lambda m: ( + m.effective_date, out_move(m), m.id)) current_moves = [] current_out_qty = 0 current_cost_price = cost_price @@ -181,7 +184,7 @@ class Product(metaclass=PoolMeta): m for m in out_moves if m.cost_price != fifo_cost_price], dict(cost_price=fifo_cost_price)) - if quantity: + if quantity > 0 and quantity + current_out_qty >= 0: cost_price = ( ((current_cost_price * ( quantity + current_out_qty))