Files
manufacture/quality_control_stock_oca/tests/test_quality_control_stock.py
Jordi Ballester Alomar 0996836986 [quality_control_stock][FIX] the stock user should be able to
create quality control inspection without necessarily being
quality control user. It is common that the person doing the
picking is not going to be the same as the one doing the inspection.

So when a stock user create the transfer, the system will create
the necessary qc inspections, regardless if the user has permissions
to process them.
2021-10-04 12:19:41 +02:00

294 lines
12 KiB
Python

# Copyright 2015 Oihane Crucelaegui - AvanzOSC
# Copyright 2018 Simone Rubino - Agile Business Group
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tests.common import TransactionCase
class TestQualityControl(TransactionCase):
def setUp(self):
super(TestQualityControl, self).setUp()
self.users_model = self.env['res.users']
self.picking_model = self.env['stock.picking']
self.inspection_model = self.env['qc.inspection']
self.qc_trigger_model = self.env['qc.trigger']
self.picking_type_model = self.env['stock.picking.type']
self.product = self.env.ref('product.product_product_2')
self.partner1 = self.env.ref('base.res_partner_2')
self.partner2 = self.env.ref('base.res_partner_4')
self.test = self.env.ref('quality_control.qc_test_1')
self.picking_type = self.env.ref('stock.picking_type_out')
self.location_dest = self.env.ref('stock.stock_location_customers')
self.sequence = self.env['ir.sequence'] \
.search([('prefix', 'like', '/OUT/')], limit=1)
inspection_lines = (
self.inspection_model._prepare_inspection_lines(self.test))
self.inspection1 = self.inspection_model.create({
'name': 'Test Inspection',
'inspection_lines': inspection_lines,
})
self.trigger = self.qc_trigger_model.search(
[('picking_type_id', '=', self.picking_type.id)])
self.lot = self.env['stock.production.lot'].create({
'name': 'Lot for tests',
'product_id': self.product.id,
})
self.group_stock_user = self.env.ref('stock.group_stock_user')
self.company1 = self.env.ref('base.main_company')
self.user1_id = self._create_user(
'user_1', [self.group_stock_user], self.company1)
move_vals = {
'name': self.product.name,
'product_id': self.product.id,
'product_uom': self.product.uom_id.id,
'product_uom_qty': 2.0,
'location_id': self.picking_type.default_location_src_id.id,
'location_dest_id': self.location_dest.id,
'quantity_done': 1.0
}
self.picking1 = self.picking_model.sudo(self.user1_id) \
.with_context(default_picking_type_id=self.picking_type.id) \
.create({
'partner_id': self.partner1.id,
'picking_type_id': self.picking_type.id,
'move_lines': [(0, 0, move_vals)],
'location_dest_id': self.location_dest.id
})
self.picking1.action_confirm()
self.picking1.force_assign()
sequence = 10
for line in self.picking1.move_lines.filtered(
lambda r: r.product_id == self.product):
line.write({
'move_line_ids': [(0, 0, {
'lot_id': self.lot.id,
'product_uom_qty': 1.0,
'qty_done': 1.0,
'product_uom_id': line.product_uom.id,
'product_id': line.product_id.id,
'location_id': line.location_id.id,
'location_dest_id': line.location_dest_id.id,
})],
'sequence': sequence
})
sequence += 10
def _create_user(self, login, groups, company):
""" Create a user."""
group_ids = [group.id for group in groups]
user = self.users_model.with_context({'no_reset_password': True}).\
create({
'name': 'Sale User',
'login': login,
'password': 'test',
'email': 'test@yourcompany.com',
'company_id': company.id,
'company_ids': [(4, company.id)],
'groups_id': [(6, 0, group_ids)]
})
return user.id
def test_inspection_create_for_product(self):
self.product.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
inspection = self.picking1.qc_inspections_ids[:1]
self.assertEqual(inspection.qty, 2.0)
self.assertEqual(inspection.test, self.test,
'Wrong test picked when creating inspection.')
# Try in this context if onchange with an stock.pack.operation works
inspection.qty = 5
inspection.onchange_object_id()
self.assertEqual(inspection.qty, 2.0)
def test_inspection_create_for_template(self):
self.product.product_tmpl_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.picking1.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
def test_inspection_create_for_category(self):
self.product.categ_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.picking1.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
def test_inspection_create_for_product_partner(self):
self.product.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
'partners': [(6, 0, self.partner1.ids)],
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.picking1.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
def test_inspection_create_for_template_partner(self):
self.product.product_tmpl_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
'partners': [(6, 0, self.partner1.ids)],
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.picking1.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
def test_inspection_create_for_category_partner(self):
self.product.categ_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
'partners': [(6, 0, self.partner1.ids)],
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.picking1.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
def test_inspection_create_for_product_wrong_partner(self):
self.product.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
'partners': [(6, 0, self.partner2.ids)],
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 0,
'No inspection must be created')
def test_inspection_create_for_template_wrong_partner(self):
self.product.product_tmpl_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
'partners': [(6, 0, self.partner2.ids)],
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 0,
'No inspection must be created')
def test_inspection_create_for_category_wrong_partner(self):
self.product.categ_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
'partners': [(6, 0, self.partner2.ids)],
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 0,
'No inspection must be created')
def test_inspection_create_only_one(self):
self.product.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
}
)]
self.product.categ_id.qc_triggers = [(
0, 0, {
'trigger': self.trigger.id,
'test': self.test.id,
}
)]
self.picking1.do_transfer()
self.assertEqual(self.picking1.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.picking1.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
self.assertEqual(self.lot.created_inspections, 1,
'Only one inspection must be created')
self.assertEqual(self.lot.qc_inspections_ids[:1].test, self.test,
'Wrong test picked when creating inspection.')
def test_picking_type(self):
picking_type = self.picking_type_model.create({
'name': 'Test Picking Type',
'code': 'outgoing',
'sequence_id': self.sequence.id
})
trigger = self.qc_trigger_model.search(
[('picking_type_id', '=', picking_type.id)])
self.assertEqual(len(trigger), 1,
'One trigger must have been created.')
self.assertEqual(trigger.name, picking_type.name,
'Trigger name must match picking type name.')
picking_type.write({
'name': 'Test Name Change',
})
self.assertEqual(trigger.name, picking_type.name,
'Trigger name must match picking type name.')
def test_qc_inspection_picking(self):
self.inspection1.write({
'name': self.picking1.move_lines[:1]._name + "inspection",
'object_id': '%s,%d' % (self.picking1._name,
self.picking1.id),
})
self.assertEqual(self.inspection1.picking_id,
self.picking1)
def test_qc_inspection_stock_move(self):
self.inspection1.write({
'name': self.picking1.move_lines[:1]._name + "inspection",
'object_id': '%s,%d' % (self.picking1.move_lines[:1]._name,
self.picking1.move_lines[:1].id),
})
self.inspection1.onchange_object_id()
self.assertEqual(self.inspection1.picking_id,
self.picking1)
self.assertEqual(self.inspection1.lot_id,
self.lot)
self.assertEqual(self.inspection1.product_id,
self.picking1.move_lines[:1].product_id)
self.assertEqual(self.inspection1.qty,
self.picking1.move_lines[:1].product_qty)
def test_qc_inspection_lot(self):
self.inspection1.write({
'name': self.picking1.move_lines[:1]._name + "inspection",
'object_id': '%s,%d' % (self.lot._name,
self.lot.id),
})
self.inspection1.onchange_object_id()
self.assertEqual(self.inspection1.lot_id,
self.lot)
self.assertEqual(self.inspection1.product_id,
self.lot.product_id)