diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/mrp/wizard/mrp_immediate_production.py | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/mrp/wizard/mrp_immediate_production.py')
| -rw-r--r-- | addons/mrp/wizard/mrp_immediate_production.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/addons/mrp/wizard/mrp_immediate_production.py b/addons/mrp/wizard/mrp_immediate_production.py new file mode 100644 index 00000000..d1e1b27d --- /dev/null +++ b/addons/mrp/wizard/mrp_immediate_production.py @@ -0,0 +1,82 @@ +# -*- 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 + + +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.filtered(lambda m: m.state not in ['done', 'cancel']): + rounding = move.product_uom.rounding + for move_line in move.move_line_ids: + if move_line.product_uom_qty: + move_line.qty_done = min(move_line.product_uom_qty, move_line.move_id.should_consume_qty) + if float_compare(move.quantity_done, move.should_consume_qty, precision_rounding=rounding) >= 0: + break + if float_compare(move.product_uom_qty, move.quantity_done, precision_rounding=move.product_uom.rounding) == 1: + if move.has_tracking in ('serial', 'lot'): + 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 + return productions_to_validate.with_context(skip_immediate=True).button_mark_done() + return True + |
