diff --git a/addons/stock/models/stock_picking.py b/addons/stock/models/stock_picking.py index 557f544cf38..a8083451bca 100644 --- a/addons/stock/models/stock_picking.py +++ b/addons/stock/models/stock_picking.py @@ -1245,16 +1245,10 @@ class Picking(models.Model): for picking in self: if picking.picking_type_id.create_backorder != 'ask': continue - quantity_todo = {} - quantity_done = {} - for move in picking.move_ids.filtered(lambda m: m.state != "cancel"): - quantity_todo.setdefault(move.product_id.id, 0) - quantity_done.setdefault(move.product_id.id, 0) - quantity_todo[move.product_id.id] += move.product_uom._compute_quantity(move.product_uom_qty, move.product_id.uom_id, rounding_method='HALF-UP') - quantity_done[move.product_id.id] += move.product_uom._compute_quantity(move.quantity_done, move.product_id.uom_id, rounding_method='HALF-UP') if any( - float_compare(quantity_done[x], quantity_todo.get(x, 0), precision_digits=prec,) == -1 - for x in quantity_done + float_compare(move.quantity_done, move.product_uom_qty, precision_digits=prec) < 0 + for move in picking.move_ids + if move.state != 'cancel' ): backorder_pickings |= picking return backorder_pickings diff --git a/addons/stock/tests/test_stock_flow.py b/addons/stock/tests/test_stock_flow.py index cc6ab052f1d..53f941a280b 100644 --- a/addons/stock/tests/test_stock_flow.py +++ b/addons/stock/tests/test_stock_flow.py @@ -2643,3 +2643,36 @@ class TestStockFlowPostInstall(TestStockCommon): delivery.button_validate() self.assertEqual(sn.last_delivery_partner_id, partner) + + def test_several_sm_with_same_product_and_backorders(self): + picking = self.env['stock.picking'].create({ + 'picking_type_id': self.picking_type_in, + 'location_id': self.supplier_location, + 'location_dest_id': self.stock_location, + }) + move01, move02 = self.env['stock.move'].create([{ + 'name': self.productA.name, + 'product_id': self.productA.id, + 'product_uom_qty': 10, + 'product_uom': self.productA.uom_id.id, + 'description_picking': desc, + 'picking_id': picking.id, + 'location_id': self.supplier_location, + 'location_dest_id': self.stock_location, + } for desc in ['Lorem', 'Ipsum']]) + + picking.action_confirm() + + move01.quantity_done = 12 + move02.quantity_done = 8 + + res = picking.button_validate() + self.assertIsInstance(res, dict) + self.assertEqual(res.get('res_model'), 'stock.backorder.confirmation') + + wizard = Form(self.env[res['res_model']].with_context(res['context'])).save() + wizard.process() + + backorder = picking.backorder_ids + self.assertEqual(backorder.move_ids.product_uom_qty, 2) + self.assertEqual(backorder.move_ids.description_picking, 'Ipsum')