84 lines
3.3 KiB
Python
84 lines
3.3 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.fields import Command
|
|
from odoo.tests import tagged
|
|
from odoo.addons.mrp.tests.common import TestMrpCommon
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestMrpRepairFlow(TestMrpCommon):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
cls.env.ref('base.group_user').write({'implied_ids': [(4, cls.env.ref('stock.group_production_lot').id)]})
|
|
|
|
def test_repair_with_manufacture_mto_link(self):
|
|
"""
|
|
Test the integration between a repair order and a manufacturing order (MTO)
|
|
for a product with 'Make to Order' (MTO) and 'Manufacture' routes.
|
|
|
|
Validates that a repair order triggers a manufacturing order with correct product
|
|
and quantity, and ensures proper linking via the procurement group.
|
|
"""
|
|
mto_route = self.env.ref('stock.route_warehouse0_mto')
|
|
mto_route.active = True
|
|
manufacturing_route = self.env['stock.rule'].search([('action', '=', 'manufacture')]).route_id
|
|
rule = mto_route.rule_ids.filtered(lambda r: r.picking_type_id.code == 'repair_operation')
|
|
rule.procure_method = 'make_to_order'
|
|
|
|
product = self.product_2
|
|
product.write({
|
|
'route_ids': [Command.set([mto_route.id, manufacturing_route.id])],
|
|
})
|
|
|
|
repair = self.env['repair.order'].create([
|
|
{
|
|
'move_ids': [
|
|
Command.create({
|
|
'repair_line_type': 'add',
|
|
'product_id': product.id,
|
|
'product_uom_qty': 1.0,
|
|
})
|
|
]
|
|
}
|
|
])
|
|
|
|
repair.action_validate()
|
|
|
|
production = repair.procurement_group_id.stock_move_ids.created_production_id
|
|
self.assertEqual(production.product_id, product)
|
|
self.assertEqual(production.product_qty, 1.0)
|
|
self.assertEqual(production.move_dest_ids.repair_id, repair)
|
|
self.assertEqual(production.repair_count, 1)
|
|
self.assertEqual(repair.production_count, 1)
|
|
|
|
def test_adding_kit_parts_to_confirmed_repair(self):
|
|
"""Test adding a kit product to a confirmed repair order.
|
|
This ensures that:
|
|
- Its moves are correctly exploded into their component parts.
|
|
- The generated component moves are properly linked to the repair order.
|
|
"""
|
|
repair = self.env['repair.order'].create({
|
|
'product_id': self.product.id,
|
|
'picking_type_id': self.warehouse_1.repair_type_id.id,
|
|
})
|
|
repair.action_validate()
|
|
self.assertEqual(repair.state, 'confirmed')
|
|
self.assertEqual(len(repair.move_ids), 0)
|
|
# Ensure the product is a kit
|
|
self.assertTrue(self.product_5.is_kits)
|
|
# Add the kit to the repair order
|
|
self.env['stock.move'].create({
|
|
'repair_id': repair.id,
|
|
'product_id': self.product_5.id,
|
|
'product_uom_qty': 1.0,
|
|
'repair_line_type': 'add',
|
|
})
|
|
# Check that the kit has been exploded into its components
|
|
self.assertEqual(len(repair.move_ids), 2)
|
|
self.assertEqual(
|
|
set(repair.move_ids.product_id.ids),
|
|
set(self.product_5.bom_ids.bom_line_ids.product_id.ids)
|
|
)
|