[FIX] mrp,stock: use correct qty to backorder in MO simplified view

The problem arises when a user creates a backorder for a MO after
registering overconsumption of some components through the simplified view.
The quantities of the components of the new backordered MO are then wrong.
Components that were over consumed in the first MO will have smaller
quantities in the new MO, the difference being the amount over consumed.
This problem does not appear in the case of the Tablet View where a proper
recalculation of quantities is done.

closes odoo/odoo#64911

Signed-off-by: Arnold Moyaux <amoyaux@users.noreply.github.com>
This commit is contained in:
Nicolas Pierre
2021-06-02 10:26:28 +00:00
parent 43de70124c
commit 8883c06ada
2 changed files with 42 additions and 1 deletions
+3 -1
View File
@@ -1451,15 +1451,17 @@ class MrpProduction(models.Model):
if self.env.context.get('mo_ids_to_backorder'):
productions_to_backorder = self.browse(self.env.context['mo_ids_to_backorder'])
productions_not_to_backorder = self - productions_to_backorder
close_mo = False
else:
productions_not_to_backorder = self
productions_to_backorder = self.env['mrp.production']
close_mo = True
self.workorder_ids.button_finish()
backorders = productions_to_backorder._generate_backorder_productions(close_mo=close_mo)
productions_not_to_backorder._post_inventory(cancel_backorder=True)
productions_to_backorder._post_inventory(cancel_backorder=False)
backorders = productions_to_backorder._generate_backorder_productions()
# if completed products make other confirmed/partially_available moves available, assign them
done_move_finished_ids = (productions_to_backorder.move_finished_ids | productions_not_to_backorder.move_finished_ids).filtered(lambda m: m.state == 'done')
+39
View File
@@ -1824,3 +1824,42 @@ class TestMrpOrder(TestMrpCommon):
tuesday = date_planned + timedelta(days=1)
self.assertEqual(mo.workorder_ids[1].date_planned_start, tuesday.replace(hour=1))
self.assertEqual(mo.workorder_ids[1].date_planned_finished, tuesday.replace(hour=2))
def test_backorder_with_overconsumption(self):
""" Check that the components of the backorder have the correct quantities
when there is overconsumption in the initial MO
"""
mo, _, _, _, _ = self.generate_mo(qty_final=30, qty_base_1=2, qty_base_2=3)
mo.action_confirm()
mo.qty_producing = 10
mo.move_raw_ids[0].quantity_done = 90
mo.move_raw_ids[1].quantity_done = 70
action = mo.button_mark_done()
backorder = Form(self.env['mrp.production.backorder'].with_context(**action['context']))
backorder.save().action_backorder()
mo_backorder = mo.procurement_group_id.mrp_production_ids[-1]
# Check quantities of the original MO
self.assertEqual(mo.product_uom_qty, 10.0)
self.assertEqual(mo.qty_produced, 10.0)
move_prod_1 = self.env['stock.move'].search([
('product_id', '=', mo.bom_id.bom_line_ids[0].product_id.id),
('raw_material_production_id', '=', mo.id)])
move_prod_2 = self.env['stock.move'].search([
('product_id', '=', mo.bom_id.bom_line_ids[1].product_id.id),
('raw_material_production_id', '=', mo.id)])
self.assertEqual(sum(move_prod_1.mapped('quantity_done')), 90.0)
self.assertEqual(sum(move_prod_1.mapped('product_uom_qty')), 90.0)
self.assertEqual(sum(move_prod_2.mapped('quantity_done')), 70.0)
self.assertEqual(sum(move_prod_2.mapped('product_uom_qty')), 70.0)
# Check quantities of the backorder MO
self.assertEqual(mo_backorder.product_uom_qty, 20.0)
move_prod_1_bo = self.env['stock.move'].search([
('product_id', '=', mo.bom_id.bom_line_ids[0].product_id.id),
('raw_material_production_id', '=', mo_backorder.id)])
move_prod_2_bo = self.env['stock.move'].search([
('product_id', '=', mo.bom_id.bom_line_ids[1].product_id.id),
('raw_material_production_id', '=', mo_backorder.id)])
self.assertEqual(sum(move_prod_1_bo.mapped('product_uom_qty')), 60.0)
self.assertEqual(sum(move_prod_2_bo.mapped('product_uom_qty')), 40.0)