diff --git a/so_bom_selection/models/__init__.py b/so_bom_selection/models/__init__.py index 422f3bd1d..ead819c1d 100644 --- a/so_bom_selection/models/__init__.py +++ b/so_bom_selection/models/__init__.py @@ -22,3 +22,4 @@ from . import sale_order_line from . import mrp_production from . import sale_order +from . import stock_rule \ No newline at end of file diff --git a/so_bom_selection/models/sale_order.py b/so_bom_selection/models/sale_order.py index 4f52c40f7..bdc0e24d6 100644 --- a/so_bom_selection/models/sale_order.py +++ b/so_bom_selection/models/sale_order.py @@ -19,7 +19,7 @@ # If not, see . # ################################################################################ -from odoo import models +from odoo import models, api, fields class SaleOrderInherit(models.Model): @@ -28,7 +28,9 @@ class SaleOrderInherit(models.Model): def action_confirm(self): """ Create manufacturing order of components in selected BOM """ for rec in self.order_line: - if rec.bom_id: + check_route = [routes.name for routes in + rec.product_template_id.route_ids] + if rec.bom_id and 'Manufacture' not in check_route: move_raw = [] bom_line = self.env['mrp.bom.line'].search( [('bom_id', '=', rec.bom_id.id)]) @@ -56,3 +58,5 @@ class SaleOrderInherit(models.Model): 'move_raw_ids': move_raw }) return super(SaleOrderInherit, self).action_confirm() + + diff --git a/so_bom_selection/models/stock_rule.py b/so_bom_selection/models/stock_rule.py new file mode 100644 index 000000000..f06290c98 --- /dev/null +++ b/so_bom_selection/models/stock_rule.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +################################################################################ +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Unnimaya C O (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +################################################################################ + +from odoo import models, api, SUPERUSER_ID, _ +from collections import defaultdict + +from odoo.tools import float_compare + + +class MrpProductionInherit(models.Model): + _inherit = 'stock.rule' + + @api.model + def _run_manufacture(self, procurements): + sale = [] + productions_values_by_company = defaultdict(list) + for procurement, rule in procurements: + if float_compare(procurement.product_qty, 0, + precision_rounding=procurement.product_uom.rounding) <= 0: + # If procurement contains negative quantity, don't create a MO that would be for a negative value. + continue + current_sale_order = self.env['sale.order'].search( + [('name', '=', procurement.origin)]) + if current_sale_order not in sale: + sale.append(current_sale_order) + bom_values = self._find_bom_order_line(sale) + bom_exist = {key: value for key, value in bom_values.items() if value} + if bom_exist: + i = 0 + only_bom_record = list(bom_exist.keys()) + for procurement, rule in procurements: + productions_values_by_company[procurement.company_id.id].append(rule._prepare_mo_vals(*procurement, bom_exist[only_bom_record[i]])) + i = i + 1 + for company_id, productions_values in productions_values_by_company.items(): + # create the MO as SUPERUSER because the current user may not have the rights to do it (mto product launched by a sale for example) + productions = self.env['mrp.production'].with_user( + SUPERUSER_ID).sudo().with_company(company_id).create( + productions_values) + productions.filtered( + self._should_auto_confirm_procurement_mo).action_confirm() + for production in productions: + origin_production = production.move_dest_ids and \ + production.move_dest_ids[ + 0].raw_material_production_id or False + orderpoint = production.orderpoint_id + if orderpoint and orderpoint.create_uid.id == SUPERUSER_ID and orderpoint.trigger == 'manual': + production.message_post( + body=_( + 'This production order has been created from Replenishment Report.'), + message_type='comment', + subtype_xmlid='mail.mt_note') + elif orderpoint: + production.message_post_with_view( + 'mail.message_origin_link', + values={'self': production, 'origin': orderpoint}, + subtype_id=self.env.ref('mail.mt_note').id) + elif origin_production: + production.message_post_with_view( + 'mail.message_origin_link', + values={'self': production, + 'origin': origin_production}, + subtype_id=self.env.ref('mail.mt_note').id) + return True + + def _find_bom_order_line(self, sale): + bom_list = {} + j = 1 + for rec in sale[0].order_line: + if rec.bom_id: + bom_list.update({j: rec.bom_id }) + elif rec.product_template_id.route_ids: + bom = self.env['mrp.bom'].search([("product_tmpl_id","=",rec.product_template_id.id)], limit=1) + bom_list.update({j:bom }) + j = j + 1 + return bom_list