From c1d63fc599719ad9858cfcc6904eaeee1014ef06 Mon Sep 17 00:00:00 2001 From: Julien Castiaux Date: Fri, 19 Jul 2019 12:45:29 +0000 Subject: [PATCH] [FIX] stock: scrap from current picking Steps to reproduce: 1) Make sure you don't have any piece of the product you're about to sell on hand. 2) Create two sale order, each with 10 pieces of the product and validate them 3) Do a RFQ and buy 15 pieces. 4) On the earliest sale order, check the availability, it should autofill the desired quantity with 10 5) Do the same on the second, it autofills 5. 6) On the later delivery, scrap one. => The product is scrapped from the early picking. Sort the candidates so the current picking is on top, this ensure the current picking is the first scraped. opw-2036381 closes odoo/odoo#35021 Signed-off-by: Arnold Moyaux --- addons/stock/models/stock_move_line.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/stock/models/stock_move_line.py b/addons/stock/models/stock_move_line.py index ae675f7c71c..d490a3e7053 100644 --- a/addons/stock/models/stock_move_line.py +++ b/addons/stock/models/stock_move_line.py @@ -487,7 +487,7 @@ class StockMoveLine(models.Model): if quantity > available_quantity: # We now have to find the move lines that reserved our now unavailable quantity. We # take care to exclude ourselves and the move lines were work had already been done. - oudated_move_lines_domain = [ + outdated_move_lines_domain = [ ('move_id.state', 'not in', ['done', 'cancel']), ('product_id', '=', product_id.id), ('lot_id', '=', lot_id.id if lot_id else False), @@ -497,14 +497,15 @@ class StockMoveLine(models.Model): ('product_qty', '>', 0.0), ('id', 'not in', ml_to_ignore.ids), ] - oudated_candidates = self.env['stock.move.line'].search(oudated_move_lines_domain) + current_picking_first = lambda cand: cand.picking_id != self.move_id.picking_id + outdated_candidates = self.env['stock.move.line'].search(outdated_move_lines_domain).sorted(current_picking_first) # As the move's state is not computed over the move lines, we'll have to manually # recompute the moves which we adapted their lines. move_to_recompute_state = self.env['stock.move'] rounding = self.product_uom_id.rounding - for candidate in oudated_candidates: + for candidate in outdated_candidates: if float_compare(candidate.product_qty, quantity, precision_rounding=rounding) <= 0: quantity -= candidate.product_qty move_to_recompute_state |= candidate.move_id