81 lines
3.8 KiB
Python
81 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import UserError
|
|
from odoo.tools import float_compare, float_is_zero
|
|
|
|
|
|
class MrpImmediateProductionLine(models.TransientModel):
|
|
_name = 'mrp.immediate.production.line'
|
|
_description = 'Immediate Production Line'
|
|
|
|
immediate_production_id = fields.Many2one('mrp.immediate.production', 'Immediate Production', required=True)
|
|
production_id = fields.Many2one('mrp.production', 'Production', required=True)
|
|
to_immediate = fields.Boolean('To Process')
|
|
|
|
|
|
class MrpImmediateProduction(models.TransientModel):
|
|
_name = 'mrp.immediate.production'
|
|
_description = 'Immediate Production'
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
res = super().default_get(fields)
|
|
if 'immediate_production_line_ids' in fields:
|
|
if self.env.context.get('default_mo_ids'):
|
|
res['mo_ids'] = self.env.context['default_mo_ids']
|
|
res['immediate_production_line_ids'] = [(0, 0, {'to_immediate': True, 'production_id': mo_id[1]}) for mo_id in res['mo_ids']]
|
|
return res
|
|
|
|
mo_ids = fields.Many2many('mrp.production', 'mrp_production_production_rel')
|
|
show_productions = fields.Boolean(compute='_compute_show_production')
|
|
immediate_production_line_ids = fields.One2many(
|
|
'mrp.immediate.production.line',
|
|
'immediate_production_id',
|
|
string="Immediate Production Lines")
|
|
|
|
@api.depends('immediate_production_line_ids')
|
|
def _compute_show_production(self):
|
|
for wizard in self:
|
|
wizard.show_productions = len(wizard.immediate_production_line_ids.production_id) > 1
|
|
|
|
def process(self):
|
|
productions_to_do = self.env['mrp.production']
|
|
productions_not_to_do = self.env['mrp.production']
|
|
for line in self.immediate_production_line_ids:
|
|
if line.to_immediate is True:
|
|
productions_to_do |= line.production_id
|
|
else:
|
|
productions_not_to_do |= line.production_id
|
|
|
|
for production in productions_to_do:
|
|
error_msg = ""
|
|
if production.product_tracking in ('lot', 'serial') and not production.lot_producing_id:
|
|
production.action_generate_serial()
|
|
if production.product_tracking == 'serial' and float_compare(production.qty_producing, 1, precision_rounding=production.product_uom_id.rounding) == 1:
|
|
production.qty_producing = 1
|
|
else:
|
|
production.qty_producing = production.product_qty - production.qty_produced
|
|
production._set_qty_producing()
|
|
for move in production.move_raw_ids:
|
|
if move.state in ('done', 'cancel') or not move.product_uom_qty:
|
|
continue
|
|
rounding = move.product_uom.rounding
|
|
if move.has_tracking in ('serial', 'lot') and float_is_zero(move.quantity_done, precision_rounding=rounding):
|
|
error_msg += "\n - %s" % move.product_id.display_name
|
|
|
|
if error_msg:
|
|
error_msg = _('You need to supply Lot/Serial Number for products:') + error_msg
|
|
raise UserError(error_msg)
|
|
|
|
productions_to_validate = self.env.context.get('button_mark_done_production_ids')
|
|
if productions_to_validate:
|
|
productions_to_validate = self.env['mrp.production'].browse(productions_to_validate)
|
|
productions_to_validate = productions_to_validate - productions_not_to_do
|
|
consumption_issues = productions_to_validate._get_consumption_issues()
|
|
if consumption_issues:
|
|
return productions_to_validate._action_generate_consumption_wizard(consumption_issues)
|
|
return productions_to_validate.with_context(skip_immediate=True).button_mark_done()
|
|
return True
|