diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index b34508eda6f..1081d1fb67d 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -1133,7 +1133,7 @@ class Picking(models.Model): body=_('The backorder %s has been created.') % ( backorder_picking.id, backorder_picking.name)) moves_to_backorder.write({'picking_id': backorder_picking.id}) - moves_to_backorder.mapped('package_level_id').write({'picking_id':backorder_picking.id}) + moves_to_backorder.move_line_ids.package_level_id.write({'picking_id':backorder_picking.id}) moves_to_backorder.mapped('move_line_ids').write({'picking_id': backorder_picking.id}) backorders |= backorder_picking if backorder_picking.picking_type_id.reservation_method == 'at_confirm': diff --git a/addons/stock/tests/test_packing.py b/addons/stock/tests/test_packing.py index fee21dd3944..9944761e4b7 100644 --- a/addons/stock/tests/test_packing.py +++ b/addons/stock/tests/test_packing.py @@ -831,3 +831,61 @@ class TestPacking(TestPackingCommon): self.assertEqual(receipt.state, 'assigned') receipt.move_ids_without_package[1].product_uom_qty = 0 self.assertEqual(receipt.state, 'assigned') + + def test_2_steps_and_backorder(self): + """ When creating a backorder with a package, the latter should be reserved in the new picking. Moreover, + the initial picking shouldn't have any line about this package """ + def create_picking(pick_type, from_loc, to_loc): + picking = self.env['stock.picking'].create({ + 'picking_type_id': pick_type.id, + 'location_id': from_loc.id, + 'location_dest_id': to_loc.id, + }) + move_A, move_B = self.env['stock.move'].create([{ + 'name': self.productA.name, + 'product_id': self.productA.id, + 'product_uom_qty': 1, + 'product_uom': self.productA.uom_id.id, + 'picking_id': picking.id, + 'location_id': from_loc.id, + 'location_dest_id': to_loc.id, + }, { + 'name': self.productB.name, + 'product_id': self.productB.id, + 'product_uom_qty': 1, + 'product_uom': self.productB.uom_id.id, + 'picking_id': picking.id, + 'location_id': from_loc.id, + 'location_dest_id': to_loc.id, + }]) + picking.action_confirm() + picking.action_assign() + return picking, move_A, move_B + + self.warehouse.delivery_steps = 'pick_ship' + pick_type = self.warehouse.pick_type_id + delivery_type = self.warehouse.out_type_id + + self.env['stock.quant']._update_available_quantity(self.productA, self.stock_location, 1) + self.env['stock.quant']._update_available_quantity(self.productB, self.stock_location, 1) + + picking, moveA, moveB = create_picking(pick_type, pick_type.default_location_src_id, pick_type.default_location_dest_id) + moveA.move_line_ids.qty_done = 1 + picking.action_put_in_pack() + moveB.move_line_ids.qty_done = 1 + picking.action_put_in_pack() + picking.button_validate() + + picking, _, _ = create_picking(delivery_type, delivery_type.default_location_src_id, self.customer_location) + packB = picking.package_level_ids[1] + with Form(picking) as picking_form: + with picking_form.package_level_ids_details.edit(0) as package_level: + package_level.is_done = True + action_data = picking.button_validate() + backorder_wizard = Form(self.env['stock.backorder.confirmation'].with_context(action_data['context'])).save() + backorder_wizard.process() + bo = self.env['stock.picking'].search([('backorder_id', '=', picking.id)]) + + self.assertNotIn(packB, picking.package_level_ids) + self.assertEqual(packB, bo.package_level_ids) + self.assertEqual(bo.package_level_ids.state, 'assigned')