Files
test/mrp_workorder/wizard/additional_product.py
2023-04-14 17:42:23 +08:00

87 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, api, fields
class MrpWorkorderAdditionalProduct(models.TransientModel):
_name = "mrp_workorder.additional.product"
_description = "Additional Product"
product_id = fields.Many2one(
'product.product',
'Product',
required=True,
domain="[('company_id', 'in', (company_id, False)), ('type', '!=', 'service')]")
product_tracking = fields.Selection(related='product_id.tracking')
product_qty = fields.Float('Quantity', default=1, required=True)
product_uom_id = fields.Many2one('uom.uom', domain="[('category_id', '=', product_uom_category_id)]")
product_uom_category_id = fields.Many2one(related='product_id.uom_id.category_id')
type = fields.Selection([
('component', 'Component'),
('byproduct', 'By-Product')])
workorder_id = fields.Many2one(
'mrp.workorder', required=True,
default=lambda self: self.env.context.get('active_id', None),
)
company_id = fields.Many2one(related='workorder_id.company_id')
@api.onchange('product_id')
def _onchange_product_id(self):
if self.product_id:
self.product_uom_id = self.product_id.uom_id
if self.product_tracking == 'serial':
self.product_qty = 1
def add_product(self):
"""Create workorder line for the additional product."""
wo = self.workorder_id
if self.type == 'component':
test_type = self.env.ref('mrp_workorder.test_type_register_consumed_materials')
move = self.env['stock.move'].create(
wo.production_id._get_move_raw_values(
self.product_id,
self.product_qty,
self.product_id.uom_id,
operation_id=wo.operation_id.id,
)
)
else:
test_type = self.env.ref('mrp_workorder.test_type_register_byproducts')
move = self.env['stock.move'].create(
wo.production_id._get_move_finished_values(
self.product_id.id,
self.product_qty,
self.product_id.uom_id.id,
operation_id=wo.operation_id.id,
)
)
move = move._action_confirm()
check = {
'workorder_id': wo.id,
'component_id': self.product_id.id,
'product_id': wo.product_id.id,
'company_id': self.company_id.id,
'team_id': self.env['quality.alert.team'].search([], limit=1).id,
'finished_product_sequence': wo.qty_produced,
'test_type_id': test_type.id,
'qty_done': self.product_qty,
'move_id': move.id,
}
additional_check = self.env['quality.check'].create(check)
# Insert the quality check in the chain. The process is slightly different
# if we are between two quality checks or at the summary step.
if wo.current_quality_check_id:
additional_check._insert_in_chain('before', wo.current_quality_check_id)
wo._change_quality_check(position='previous')
else:
last_check = wo.check_ids.filtered(
lambda c: not c.next_check_id and
c.finished_product_sequence == wo.qty_produced and
c != additional_check
)
additional_check._insert_in_chain('after', last_check)
wo._change_quality_check(position='last')