diff options
Diffstat (limited to 'addons/stock_account/models/product.py')
| -rw-r--r-- | addons/stock_account/models/product.py | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/addons/stock_account/models/product.py b/addons/stock_account/models/product.py index 278507aad06..226dad016ac 100644 --- a/addons/stock_account/models/product.py +++ b/addons/stock_account/models/product.py @@ -5,6 +5,7 @@ from odoo import api, fields, models, _ from odoo.exceptions import UserError from odoo.tools import float_is_zero, float_repr from odoo.exceptions import ValidationError +from collections import defaultdict class ProductTemplate(models.Model): @@ -659,17 +660,21 @@ class ProductProduct(models.Model): if not qty_to_invoice: return 0.0 - if not qty_to_invoice: - return 0 - + returned_quantities = defaultdict(float) + for move in stock_moves: + if move.origin_returned_move_id: + returned_quantities[move.origin_returned_move_id.id] += abs(sum(move.stock_valuation_layer_ids.mapped('quantity'))) candidates = stock_moves\ .sudo()\ + .filtered(lambda m: not (m.origin_returned_move_id and sum(m.stock_valuation_layer_ids.mapped('quantity')) >= 0))\ .mapped('stock_valuation_layer_ids')\ .sorted() qty_to_take_on_candidates = qty_to_invoice tmp_value = 0 # to accumulate the value taken on the candidates for candidate in candidates: candidate_quantity = abs(candidate.quantity) + if candidate.stock_move_id.id in returned_quantities: + candidate_quantity -= returned_quantities[candidate.stock_move_id.id] if float_is_zero(candidate_quantity, precision_rounding=candidate.uom_id.rounding): continue # correction entries if not float_is_zero(qty_invoiced, precision_rounding=candidate.uom_id.rounding): |
