From 25a177eb760182cd04da5d554082f3aeb5a6aa2a Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Thu, 27 May 2021 23:58:03 +0200 Subject: [PATCH] Add module sale_mrp_usability (backport of a feature of v14) --- sale_mrp_usability/__init__.py | 1 + sale_mrp_usability/__manifest__.py | 23 ++++++++++++ sale_mrp_usability/models/__init__.py | 2 ++ sale_mrp_usability/models/mrp_production.py | 39 +++++++++++++++++++++ sale_mrp_usability/models/sale.py | 39 +++++++++++++++++++++ sale_mrp_usability/views/mrp_production.xml | 22 ++++++++++++ sale_mrp_usability/views/sale_order.xml | 23 ++++++++++++ stock_usability/procurement.py | 3 ++ 8 files changed, 152 insertions(+) create mode 100644 sale_mrp_usability/__init__.py create mode 100644 sale_mrp_usability/__manifest__.py create mode 100644 sale_mrp_usability/models/__init__.py create mode 100644 sale_mrp_usability/models/mrp_production.py create mode 100644 sale_mrp_usability/models/sale.py create mode 100644 sale_mrp_usability/views/mrp_production.xml create mode 100644 sale_mrp_usability/views/sale_order.xml diff --git a/sale_mrp_usability/__init__.py b/sale_mrp_usability/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/sale_mrp_usability/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_mrp_usability/__manifest__.py b/sale_mrp_usability/__manifest__.py new file mode 100644 index 0000000..ad58776 --- /dev/null +++ b/sale_mrp_usability/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2021 Akretion France (http://www.akretion.com) +# @author Alexis de Lattre +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Sale MRP Usability', + 'version': '12.0.1.0.0', + 'category': 'Sales', + 'license': 'AGPL-3', + 'summary': 'Usability improvements on sale_mrp module', + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'depends': [ + 'sale_mrp', + 'stock_usability', + ], + 'data': [ + # Native in v14. Do no up-port to v14 + 'views/mrp_production.xml', + 'views/sale_order.xml', + ], + 'installable': True, +} diff --git a/sale_mrp_usability/models/__init__.py b/sale_mrp_usability/models/__init__.py new file mode 100644 index 0000000..c0df513 --- /dev/null +++ b/sale_mrp_usability/models/__init__.py @@ -0,0 +1,2 @@ +from . import sale +from . import mrp_production diff --git a/sale_mrp_usability/models/mrp_production.py b/sale_mrp_usability/models/mrp_production.py new file mode 100644 index 0000000..68a919c --- /dev/null +++ b/sale_mrp_usability/models/mrp_production.py @@ -0,0 +1,39 @@ +# Backport from Odoo v14 +# Copyright Odoo SA +# Same licence as Odoo (LGPL) + +from odoo import api, fields, models, _ + + +class MrpProduction(models.Model): + _inherit = 'mrp.production' + + sale_order_count = fields.Integer( + "Count of Source SO", + compute='_compute_sale_order_count', + groups='sales_team.group_sale_salesman') + + @api.depends('move_dest_ids.group_id.sale_id') + def _compute_sale_order_count(self): + for production in self: + production.sale_order_count = len(production.move_dest_ids.mapped('group_id').mapped('sale_id')) + + def action_view_sale_orders(self): + self.ensure_one() + sale_order_ids = self.move_dest_ids.mapped('group_id').mapped('sale_id').ids + action = { + 'res_model': 'sale.order', + 'type': 'ir.actions.act_window', + } + if len(sale_order_ids) == 1: + action.update({ + 'view_mode': 'form', + 'res_id': sale_order_ids[0], + }) + else: + action.update({ + 'name': _("Sources Sale Orders of %s" % self.name), + 'domain': [('id', 'in', sale_order_ids)], + 'view_mode': 'tree,form', + }) + return action diff --git a/sale_mrp_usability/models/sale.py b/sale_mrp_usability/models/sale.py new file mode 100644 index 0000000..92601e1 --- /dev/null +++ b/sale_mrp_usability/models/sale.py @@ -0,0 +1,39 @@ +# This code is a backport from odoo v14 +# Copyright Odoo SA +# Same licence as Odoo (LGPL) + +from odoo import api, fields, models, _ + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + mrp_production_count = fields.Integer( + "Count of MO generated", + compute='_compute_mrp_production_count', + groups='mrp.group_mrp_user') + + @api.depends('procurement_group_id.stock_move_ids.created_production_id') + def _compute_mrp_production_count(self): + for sale in self: + sale.mrp_production_count = len(sale.procurement_group_id.stock_move_ids.mapped('created_production_id')) + + def action_view_mrp_production(self): + self.ensure_one() + mrp_production_ids = self.procurement_group_id.stock_move_ids.mapped('created_production_id').ids + action = { + 'res_model': 'mrp.production', + 'type': 'ir.actions.act_window', + } + if len(mrp_production_ids) == 1: + action.update({ + 'view_mode': 'form', + 'res_id': mrp_production_ids[0], + }) + else: + action.update({ + 'name': _("Manufacturing Orders Generated by %s" % self.name), + 'domain': [('id', 'in', mrp_production_ids)], + 'view_mode': 'tree,form', + }) + return action diff --git a/sale_mrp_usability/views/mrp_production.xml b/sale_mrp_usability/views/mrp_production.xml new file mode 100644 index 0000000..fe861b2 --- /dev/null +++ b/sale_mrp_usability/views/mrp_production.xml @@ -0,0 +1,22 @@ + + + + + + mrp.production + + + + + + + + + diff --git a/sale_mrp_usability/views/sale_order.xml b/sale_mrp_usability/views/sale_order.xml new file mode 100644 index 0000000..03824ee --- /dev/null +++ b/sale_mrp_usability/views/sale_order.xml @@ -0,0 +1,23 @@ + + + + + + sale.order + + + + + + + + + diff --git a/stock_usability/procurement.py b/stock_usability/procurement.py index f097437..f0adf90 100644 --- a/stock_usability/procurement.py +++ b/stock_usability/procurement.py @@ -12,6 +12,9 @@ logger = logging.getLogger(__name__) class ProcurementGroup(models.Model): _inherit = 'procurement.group' + # this field stock_move_ids is native in v14 + stock_move_ids = fields.One2many('stock.move', 'group_id', string="Related Stock Moves") + @api.model def _procure_orderpoint_confirm( self, use_new_cursor=False, company_id=False):