diff --git a/addons/stock/models/stock_move_line.py b/addons/stock/models/stock_move_line.py index 1e4b5a5e68f..a254417e11d 100644 --- a/addons/stock/models/stock_move_line.py +++ b/addons/stock/models/stock_move_line.py @@ -250,7 +250,7 @@ class StockMoveLine(models.Model): # undo the original move line qty_done_orig = ml.move_id.product_uom._compute_quantity(ml.qty_done, ml.move_id.product_id.uom_id, rounding_method='HALF-UP') in_date = Quant._update_available_quantity(ml.product_id, ml.location_dest_id, -qty_done_orig, lot_id=ml.lot_id, - package_id=ml.package_id, owner_id=ml.owner_id)[1] + package_id=ml.result_package_id, owner_id=ml.owner_id)[1] Quant._update_available_quantity(ml.product_id, ml.location_id, qty_done_orig, lot_id=ml.lot_id, package_id=ml.package_id, owner_id=ml.owner_id, in_date=in_date) diff --git a/addons/stock/tests/test_move.py b/addons/stock/tests/test_move.py index 2f965636dd0..ef23b7c9496 100644 --- a/addons/stock/tests/test_move.py +++ b/addons/stock/tests/test_move.py @@ -2202,6 +2202,46 @@ class StockMove(TransactionCase): move1.move_line_ids.qty_done = 2 self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location, lot_id=lot1), 24.0) + def test_edit_done_move_line_13(self): + """ Test that editing a done stock move line linked to a packed and tracked product correctly + and directly adapts the transfer. In this case, we edit the lot to another available one + that we put in the same pack. + """ + lot1 = self.env['stock.production.lot'].create({ + 'name': 'lot1', + 'product_id': self.product1.id, + }) + lot2 = self.env['stock.production.lot'].create({ + 'name': 'lot2', + 'product_id': self.product1.id, + }) + package1 = self.env['stock.quant.package'].create({'name': 'test_edit_reserved_move_line_5'}) + + move1 = self.env['stock.move'].create({ + 'name': 'test_edit_moveline_1', + 'location_id': self.supplier_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product3.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 1.0, + }) + move1._action_confirm() + move1._action_assign() + move1.move_line_ids.qty_done = 1 + move1.move_line_ids.lot_id = lot1.id + move1.move_line_ids.result_package_id = package1.id + move1._action_done() + + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location), 1.0) + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location, lot_id=lot1, package_id=package1), 1.0) + + move1.move_line_ids.write({'lot_id': lot2.id}) + + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location), 1.0) + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location, lot_id=lot1), 0.0) + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location, lot_id=lot1, package_id=package1), 0.0) + self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product3, self.stock_location, lot_id=lot2, package_id=package1), 1.0) + def test_immediate_validate_1(self): """ Create a picking and simulates validate button effect. Move line quantity should be set to their reservation quantity automatically