summaryrefslogtreecommitdiff
path: root/addons/mrp/wizard/mrp_immediate_production.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mrp/wizard/mrp_immediate_production.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mrp/wizard/mrp_immediate_production.py')
-rw-r--r--addons/mrp/wizard/mrp_immediate_production.py82
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
+