From 5f83c59f75dd378b31a2de9ee2b26abe42d355c8 Mon Sep 17 00:00:00 2001 From: Pierre Masereel Date: Wed, 11 Jul 2018 11:02:42 +0200 Subject: [PATCH] [FIX] stock: assign move line to package_level_id When the move lines reserved are assigned to a package level, it wasn't taking into account the package level of the parent move if it has any. So this could lead to package level state error, if we have two package level with the same package_id. --- addons/stock/models/stock_package_level.py | 2 +- addons/stock/models/stock_picking.py | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/addons/stock/models/stock_package_level.py b/addons/stock/models/stock_package_level.py index ff25957641d..2e2e8b2bc51 100644 --- a/addons/stock/models/stock_package_level.py +++ b/addons/stock/models/stock_package_level.py @@ -49,7 +49,7 @@ class StockPackageLevel(models.Model): if corresponding_ml: corresponding_ml[0].qty_done = corresponding_ml[0].qty_done + quant.quantity else: - corresponding_move = package_level.move_ids.filtered(lambda m: m.product_id == quant.product_id) + corresponding_move = package_level.move_ids.filtered(lambda m: m.product_id == quant.product_id)[:1] self.env['stock.move.line'].create({ 'location_id': package_level.picking_id.location_id.id, 'location_dest_id': package_level.picking_id.location_dest_id.id, diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index 955c1500912..dd78c8dd1f0 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -540,7 +540,7 @@ class Picking(models.Model): @api.multi def action_confirm(self): - self.mapped('package_level_ids').filtered(lambda pl: pl.state == 'draft')._generate_moves() + self.mapped('package_level_ids').filtered(lambda pl: pl.state == 'draft' and not pl.move_ids)._generate_moves() # call `_action_confirm` on every draft move self.mapped('move_lines')\ .filtered(lambda move: move.state == 'draft')\ @@ -647,9 +647,9 @@ class Picking(models.Model): origin_packages = picking.move_line_ids.mapped("package_id") for pack in origin_packages: if picking._check_move_lines_map_quant_package(pack): - package_level = picking.package_level_ids.filtered(lambda pl: pl.package_id == pack) + package_level_ids = picking.package_level_ids.filtered(lambda pl: pl.package_id == pack) move_lines_to_pack = picking.move_line_ids.filtered(lambda ml: ml.package_id == pack) - if not package_level: + if not package_level_ids: self.env['stock.package_level'].create({ 'picking_id': picking.id, 'package_id': pack.id, @@ -657,13 +657,20 @@ class Picking(models.Model): 'location_dest_id': picking.move_line_ids.filtered(lambda ml: ml.package_id == pack).mapped('location_dest_id')[:1].id, 'move_line_ids': [(6, 0, move_lines_to_pack.ids)] }) - picking.move_line_ids.filtered(lambda ml: ml.package_id == pack).write({ + move_lines_to_pack.write({ 'result_package_id': pack.id, }) else: - picking.move_line_ids.filtered(lambda ml: ml.package_id == pack).write({ + move_lines_in_package_level = move_lines_to_pack.filtered(lambda ml: ml.move_id.package_level_id != False) + move_lines_without_package_level = move_lines_to_pack - move_lines_in_package_level + for ml in move_lines_in_package_level: + ml.write({ + 'result_package_id': pack.id, + 'package_level_id': ml.move_id.package_level_id.id, + }) + move_lines_without_package_level.write({ 'result_package_id': pack.id, - 'package_level_id': package_level.id, + 'package_level_id': package_level_ids[0].id, }) @api.multi