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