diff --git a/addons/mrp/models/mrp_production.py b/addons/mrp/models/mrp_production.py
index 8fd18aa854e6a369780c0d5eaf6bafa142b8820f..cdb1858c5799c90a55a84bdaacf9e868c3038feb 100644
--- a/addons/mrp/models/mrp_production.py
+++ b/addons/mrp/models/mrp_production.py
@@ -1476,14 +1476,8 @@ class MrpProduction(models.Model):
                         else:
                             move_vals[0]['production_id'] = backorder_mo.id
                         new_moves_vals.append(move_vals[0])
-                new_moves = self.env['stock.move'].create(new_moves_vals)
+                self.env['stock.move'].create(new_moves_vals)
             backorders |= backorder_mo
-            for old_wo, wo in zip(production.workorder_ids, backorder_mo.workorder_ids):
-                wo.qty_produced = max(old_wo.qty_produced - old_wo.qty_producing, 0)
-                if wo.product_tracking == 'serial':
-                    wo.qty_producing = 1
-                else:
-                    wo.qty_producing = wo.qty_remaining
 
             # We need to adapt `duration_expected` on both the original workorders and their
             # backordered workorders. To do that, we use the original `duration_expected` and the
@@ -1506,6 +1500,13 @@ class MrpProduction(models.Model):
         backorders.move_raw_ids.move_line_ids.filtered(lambda ml: ml.product_id.tracking == 'serial' and ml.product_qty == 0).unlink()
         backorders.move_raw_ids._recompute_state()
 
+        for old_wo, wo in zip(self.workorder_ids, backorders.workorder_ids):
+            wo.qty_produced = max(old_wo.qty_produced - old_wo.qty_producing, 0)
+            if wo.product_tracking == 'serial':
+                wo.qty_producing = 1
+            else:
+                wo.qty_producing = wo.qty_remaining
+
         return backorders
 
     def button_mark_done(self):