3 changed files with 101 additions and 2 deletions
@ -0,0 +1,94 @@ |
|||
# -*- coding: utf-8 -*- |
|||
################################################################################ |
|||
# |
|||
# Cybrosys Technologies Pvt. Ltd. |
|||
# |
|||
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). |
|||
# 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 <http://www.gnu.org/licenses/>. |
|||
# |
|||
################################################################################ |
|||
|
|||
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 |
Loading…
Reference in new issue