Ease bill of material - operation configuration. - allow to change the BoM of an operation, - allow to update a BoM by duplicating existing operations(& quality points), - by extension, changing the operation of a quality point update the products. closes odoo/odoo#65628 Task: 2413246 Related: odoo/enterprise#16159 Signed-off-by: William Henrotin <Whenrow@users.noreply.github.com>
82 lines
4.2 KiB
Python
82 lines
4.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import api, fields, models, _
|
|
|
|
|
|
class MrpRoutingWorkcenter(models.Model):
|
|
_name = 'mrp.routing.workcenter'
|
|
_description = 'Work Center Usage'
|
|
_order = 'bom_id, sequence, id'
|
|
_check_company_auto = True
|
|
|
|
name = fields.Char('Operation', required=True)
|
|
active = fields.Boolean(default=True)
|
|
workcenter_id = fields.Many2one('mrp.workcenter', 'Work Center', required=True, check_company=True)
|
|
sequence = fields.Integer(
|
|
'Sequence', default=100,
|
|
help="Gives the sequence order when displaying a list of routing Work Centers.")
|
|
bom_id = fields.Many2one(
|
|
'mrp.bom', 'Bill of Material',
|
|
index=True, ondelete='cascade', required=True,
|
|
help="The Bill of Material this operation is linked to")
|
|
company_id = fields.Many2one('res.company', 'Company', related='bom_id.company_id')
|
|
worksheet_type = fields.Selection([
|
|
('pdf', 'PDF'), ('google_slide', 'Google Slide'), ('text', 'Text')],
|
|
string="Work Sheet", default="text",
|
|
help="Defines if you want to use a PDF or a Google Slide as work sheet."
|
|
)
|
|
note = fields.Text('Description', help="Text worksheet description")
|
|
worksheet = fields.Binary('PDF')
|
|
worksheet_google_slide = fields.Char('Google Slide', help="Paste the url of your Google Slide. Make sure the access to the document is public.")
|
|
time_mode = fields.Selection([
|
|
('auto', 'Compute based on tracked time'),
|
|
('manual', 'Set duration manually')], string='Duration Computation',
|
|
default='manual')
|
|
time_mode_batch = fields.Integer('Based on', default=10)
|
|
time_computed_on = fields.Char('Computed on last', compute='_compute_time_computed_on')
|
|
time_cycle_manual = fields.Float(
|
|
'Manual Duration', default=60,
|
|
help="Time in minutes:"
|
|
"- In manual mode, time used"
|
|
"- In automatic mode, supposed first time when there aren't any work orders yet")
|
|
time_cycle = fields.Float('Duration', compute="_compute_time_cycle")
|
|
workorder_count = fields.Integer("# Work Orders", compute="_compute_workorder_count")
|
|
workorder_ids = fields.One2many('mrp.workorder', 'operation_id', string="Work Orders")
|
|
|
|
@api.depends('time_mode', 'time_mode_batch')
|
|
def _compute_time_computed_on(self):
|
|
for operation in self:
|
|
operation.time_computed_on = _('%i work orders') % operation.time_mode_batch if operation.time_mode != 'manual' else False
|
|
|
|
@api.depends('time_cycle_manual', 'time_mode', 'workorder_ids')
|
|
def _compute_time_cycle(self):
|
|
manual_ops = self.filtered(lambda operation: operation.time_mode == 'manual')
|
|
for operation in manual_ops:
|
|
operation.time_cycle = operation.time_cycle_manual
|
|
for operation in self - manual_ops:
|
|
data = self.env['mrp.workorder'].read_group([
|
|
('operation_id', '=', operation.id),
|
|
('qty_produced', '>', 0),
|
|
('state', '=', 'done')], ['operation_id', 'duration', 'qty_produced'], ['operation_id'],
|
|
limit=operation.time_mode_batch)
|
|
count_data = dict((item['operation_id'][0], (item['duration'], item['qty_produced'])) for item in data)
|
|
if count_data.get(operation.id) and count_data[operation.id][1]:
|
|
operation.time_cycle = (count_data[operation.id][0] / count_data[operation.id][1]) * (operation.workcenter_id.capacity or 1.0)
|
|
else:
|
|
operation.time_cycle = operation.time_cycle_manual
|
|
|
|
def _compute_workorder_count(self):
|
|
data = self.env['mrp.workorder'].read_group([
|
|
('operation_id', 'in', self.ids),
|
|
('state', '=', 'done')], ['operation_id'], ['operation_id'])
|
|
count_data = dict((item['operation_id'][0], item['operation_id_count']) for item in data)
|
|
for operation in self:
|
|
operation.workorder_count = count_data.get(operation.id, 0)
|
|
|
|
def copy_to_bom(self):
|
|
if 'bom_id' in self.env.context:
|
|
bom_id = self.env.context.get('bom_id')
|
|
for operation in self:
|
|
operation.copy({'name': _("%s (copy)", operation.name), 'bom_id': bom_id})
|