From f5d6404ccb756a5c6d55ea4b5427999bda72a3c8 Mon Sep 17 00:00:00 2001 From: asas1asas200 <asas1asas200@gmail.com> Date: Thu, 16 Nov 2023 23:21:24 +0800 Subject: [PATCH 1/4] fix(mrp_bom): ensure self.ids is not empty --- extra-addons/kci-mrp/models/mrp_bom.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extra-addons/kci-mrp/models/mrp_bom.py b/extra-addons/kci-mrp/models/mrp_bom.py index fc3ca6b5a6a..b62284d8075 100644 --- a/extra-addons/kci-mrp/models/mrp_bom.py +++ b/extra-addons/kci-mrp/models/mrp_bom.py @@ -50,7 +50,8 @@ class Bom(models.Model): print('----------------------') print(self.user_id.partner_id.email) mail_template = self.env.ref('kci-mrp.bom_email_template') - # mail_template.send_mail(self.ids[0], force_send=True, email_values=email_values) + #if len(self.ids): + # mail_template.send_mail(self.ids[0], force_send=True, email_values=email_values) def write(self, vals): if self.status == 'internal': -- GitLab From 72712e2724988f2f07d121ecaa75fa6c2cef9d68 Mon Sep 17 00:00:00 2001 From: asas1asas200 <asas1asas200@gmail.com> Date: Fri, 17 Nov 2023 10:31:24 +0800 Subject: [PATCH 2/4] feat(mrp): create requisition model prototype --- extra-addons/kci-mrp/__manifest__.py | 3 ++- extra-addons/kci-mrp/models/__init__.py | 1 + .../kci-mrp/models/mrp_requisition.py | 11 +++++++++ .../kci-mrp/security/ir.model.access.csv | 3 ++- .../kci-mrp/views/mrp_requisition_views.xml | 13 +++++++++++ extra-addons/kci-mrp/views/mrp_views_menu.xml | 23 +++++++++++++++++++ 6 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 extra-addons/kci-mrp/models/mrp_requisition.py create mode 100644 extra-addons/kci-mrp/views/mrp_requisition_views.xml diff --git a/extra-addons/kci-mrp/__manifest__.py b/extra-addons/kci-mrp/__manifest__.py index cb03dcbc474..ba278fc2bb2 100644 --- a/extra-addons/kci-mrp/__manifest__.py +++ b/extra-addons/kci-mrp/__manifest__.py @@ -19,6 +19,7 @@ This module contains all the common features of Drawings. 'views/mrp_bom_views.xml', 'views/mrp_views_menu.xml', 'views/mrp_groups.xml', + 'views/mrp_requisition_views.xml', 'report/bom_for_sales.xml', 'data/bom_email.xml', ], @@ -26,4 +27,4 @@ This module contains all the common features of Drawings. 'installable': True, 'auto_install': False, 'license': 'LGPL-3', -} \ No newline at end of file +} diff --git a/extra-addons/kci-mrp/models/__init__.py b/extra-addons/kci-mrp/models/__init__.py index 34293b0b4b9..fe3783d25fd 100644 --- a/extra-addons/kci-mrp/models/__init__.py +++ b/extra-addons/kci-mrp/models/__init__.py @@ -4,3 +4,4 @@ from . import mrp_drawing from . import product from . import mrp_bom +from . import mrp_requisition diff --git a/extra-addons/kci-mrp/models/mrp_requisition.py b/extra-addons/kci-mrp/models/mrp_requisition.py new file mode 100644 index 00000000000..38fcd472e8b --- /dev/null +++ b/extra-addons/kci-mrp/models/mrp_requisition.py @@ -0,0 +1,11 @@ +from odoo import models, fields, api + + +class MrpRequisition(models.Model): + _inherit = 'mrp.bom' + _name = 'mrp.requisition' + + +class MrpRequisitionLine(models.Model): + _inherit = 'mrp.bom.line' + _name = 'mrp.requisition.line' diff --git a/extra-addons/kci-mrp/security/ir.model.access.csv b/extra-addons/kci-mrp/security/ir.model.access.csv index c9791fcc4a0..d66d6ba12a6 100644 --- a/extra-addons/kci-mrp/security/ir.model.access.csv +++ b/extra-addons/kci-mrp/security/ir.model.access.csv @@ -4,4 +4,5 @@ access_mrp_drawing_manager,MRP Drawing Manager Access,model_mrp_drawing,mrp_draw access_mrp_drawing_line_user,MRP Drawing Line User Access,model_mrp_drawing_line,mrp_drawing_group_user,1,0,0,0 access_mrp_drawing_line_manager,MRP Drawing Line Manager Access,model_mrp_drawing_line,mrp_drawing_group_manager,1,1,1,1 access_mrp_drawing_material_user,MRP Drawing Material User Access,model_mrp_drawing_material,mrp_drawing_group_user,1,0,0,0 -access_mrp_drawing_material_manager,MRP Drawing Material Manager Access,model_mrp_drawing_material,mrp_drawing_group_manager,1,1,1,1 \ No newline at end of file +access_mrp_drawing_material_manager,MRP Drawing Material Manager Access,model_mrp_drawing_material,mrp_drawing_group_manager,1,1,1,1 +access_mrp_requisition_user, MRp Requisition User Access,model_mrp_requisition,base.group_user,1,0,0,0 \ No newline at end of file diff --git a/extra-addons/kci-mrp/views/mrp_requisition_views.xml b/extra-addons/kci-mrp/views/mrp_requisition_views.xml new file mode 100644 index 00000000000..f970f92ddc4 --- /dev/null +++ b/extra-addons/kci-mrp/views/mrp_requisition_views.xml @@ -0,0 +1,13 @@ +<odoo> + <data> + <record id="mrp_requisition_view_form" model="ir.ui.view"> + <field name="name">mrp.requisition.view.form</field> + <field name="model">mrp.requisition</field> + <field name="arch" type="xml"> + <form> + <field name="code"/> + </form> + </field> + </record> + </data> +</odoo> \ No newline at end of file diff --git a/extra-addons/kci-mrp/views/mrp_views_menu.xml b/extra-addons/kci-mrp/views/mrp_views_menu.xml index 9944bac2973..a511a08f63a 100644 --- a/extra-addons/kci-mrp/views/mrp_views_menu.xml +++ b/extra-addons/kci-mrp/views/mrp_views_menu.xml @@ -69,6 +69,29 @@ parent="mrp.menu_mrp_bom" sequence="2"/> + <record id="requisition_form_action" model="ir.actions.act_window"> + <field name="name">隢贝頃�鱓</field> + <field name="res_model">mrp.requisition</field> + <field name="view_mode">list,tree,form</field> + <field name="view_id" ref="mrp_requisition_view_form"/> + <field name="help" type="html"> + <p class="o_view_nocontent_smiling_face"> + No product found. Let's create one! + </p><p> + Define the components and finished products you wish to use in + bill of materials and manufacturing orders. + </p> + </field> + </record> + + <menuitem action="requisition_form_action" + id="root_menu_mrp_requisition_form_action" + name="隢贝頃�鱓" + parent="mrp.menu_mrp_bom" + sequence="3" + + /> + <!-- <menuitem id="root_menu_mrp_bom_form_action"--> <!-- action="mrp.mrp_bom_form_action"--> -- GitLab From 10efc3ca0c495268a782792697b8f6ff43bfd90f Mon Sep 17 00:00:00 2001 From: asas1asas200 <asas1asas200@gmail.com> Date: Mon, 20 Nov 2023 15:09:55 +0800 Subject: [PATCH 3/4] feat(mrp-requisition): add basic view and func --- .../kci-mrp/models/mrp_requisition.py | 52 ++++++++++++++++++- .../kci-mrp/security/ir.model.access.csv | 3 +- .../kci-mrp/views/mrp_requisition_views.xml | 46 ++++++++++++++-- extra-addons/kci-mrp/views/mrp_views_menu.xml | 5 +- 4 files changed, 98 insertions(+), 8 deletions(-) diff --git a/extra-addons/kci-mrp/models/mrp_requisition.py b/extra-addons/kci-mrp/models/mrp_requisition.py index 38fcd472e8b..2f0864fa0c0 100644 --- a/extra-addons/kci-mrp/models/mrp_requisition.py +++ b/extra-addons/kci-mrp/models/mrp_requisition.py @@ -2,10 +2,58 @@ from odoo import models, fields, api class MrpRequisition(models.Model): - _inherit = 'mrp.bom' _name = 'mrp.requisition' + _description = "Mrp requisition model" + _inherit = ['mail.thread'] + + name = fields.Char(string="璅䠷��", required=True) + state = fields.Selection([ + ('draft', '��厩阮'), + ('pending', '撌脤�𡁶䰻�繧鞈�'), + ('done', '撌脣遣蝡𧢲繧鞈澆鱓'), + ('cancel', '��𡝗��'), + ], string='����', readonly=True, copy=False, index=True, tracking=True, default='draft') + create_date = fields.Date( + string="撱箇�𧢲𠯫���", default=fields.Datetime.now, tracking=True) + engineer = fields.Many2one( + 'res.users', string='撌亦�见葦', store=True, default=lambda self: self.env.user, required=True) + requisition_line_ids = fields.One2many( + 'mrp.requisition.line', 'requisition_id', 'Requisition Lines') + amount_total = fields.Float( + string='蝮質��', compute='_compute_amount_total', store=True) + ref_purchase_id = fields.Many2one( + 'purchase.order', string='�繧鞈澆鱓', store=True) + + @api.depends('requisition_line_ids.price_subtotal', 'requisition_line_ids') + def _compute_amount_total(self): + for requisition in self: + requisition.amount_total = sum( + line.price_subtotal for line in requisition.requisition_line_ids) + + def notify_purchase(self): + pass + + def confirm(self): + pass + + def cancel(self): + pass class MrpRequisitionLine(models.Model): - _inherit = 'mrp.bom.line' _name = 'mrp.requisition.line' + + requisition_id = fields.Many2one( + 'mrp.requisition', index=True, ondelete='cascade', + required=True) + product_tmpl_id = fields.Many2one( + 'product.template', string='����', store=True) + price_unit = fields.Float(string='�鱓��', store=True) + product_qty = fields.Float(string='�彍���', required=True) + price_subtotal = fields.Float( + string='�寥椙撠讛��', compute='_compute_price_subtotal', store=True) + + @api.depends('product_qty', 'price_unit') + def _compute_price_subtotal(self): + for line in self: + line.price_subtotal = line.product_qty * line.price_unit diff --git a/extra-addons/kci-mrp/security/ir.model.access.csv b/extra-addons/kci-mrp/security/ir.model.access.csv index d66d6ba12a6..cfa7d4abba3 100644 --- a/extra-addons/kci-mrp/security/ir.model.access.csv +++ b/extra-addons/kci-mrp/security/ir.model.access.csv @@ -5,4 +5,5 @@ access_mrp_drawing_line_user,MRP Drawing Line User Access,model_mrp_drawing_line access_mrp_drawing_line_manager,MRP Drawing Line Manager Access,model_mrp_drawing_line,mrp_drawing_group_manager,1,1,1,1 access_mrp_drawing_material_user,MRP Drawing Material User Access,model_mrp_drawing_material,mrp_drawing_group_user,1,0,0,0 access_mrp_drawing_material_manager,MRP Drawing Material Manager Access,model_mrp_drawing_material,mrp_drawing_group_manager,1,1,1,1 -access_mrp_requisition_user, MRp Requisition User Access,model_mrp_requisition,base.group_user,1,0,0,0 \ No newline at end of file +access_mrp_requisition_user, MRp Requisition User Access,model_mrp_requisition,base.group_user,1,1,1,1 +access_mrp_requisition_line_user, MRP Requisition Line User Access,model_mrp_requisition_line,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/extra-addons/kci-mrp/views/mrp_requisition_views.xml b/extra-addons/kci-mrp/views/mrp_requisition_views.xml index f970f92ddc4..6f1b2778851 100644 --- a/extra-addons/kci-mrp/views/mrp_requisition_views.xml +++ b/extra-addons/kci-mrp/views/mrp_requisition_views.xml @@ -1,13 +1,53 @@ <odoo> <data> - <record id="mrp_requisition_view_form" model="ir.ui.view"> - <field name="name">mrp.requisition.view.form</field> + <record id="mrp_requisition_form_view" model="ir.ui.view"> + <field name="name">mrp.requisition.form.view</field> <field name="model">mrp.requisition</field> + <field name="priority">100</field> <field name="arch" type="xml"> <form> - <field name="code"/> + <header> + <button name="notify_purchase" class="oe_highlight" type="object" string="�𡁶䰻�繧鞈�" attrs="{'invisible': [('state', '!=', 'draft')]}"/> + <button name="confirm" class="oe_highlight" type="object" string="撱箇�𧢲繧鞈潸��鱓" attrs="{'invisible': [('state', '!=', 'pending')]}"/> + <button name="cancel" class="btn btn-secondary" type="object" string="��𡝗��" help="��𡝗��迨隢贝頃�鱓" attrs="{'invisible': [('state', '=', 'cancel')]}"/> + + <field name="state" widget="statusbar" statusbar_visible="draft,pending,done"/> + </header> + <sheet> + <group> + <group> + <field name="name"/> + <field name="engineer"/> + </group> + <group> + <field name="create_date" readonly="1"/> + <field name="amount_total"/> + <field name="ref_purchase_id" readonly="1"/> + </group> + </group> + <field name="requisition_line_ids" widget="one2many" context="{'default_requisition_id': id}"> + <tree string="Components" editable="bottom"> + <field name="product_tmpl_id"/> + <field name="product_qty"/> + <field name="price_unit"/> + <field name="price_subtotal"/> + </tree> + </field> + </sheet> </form> </field> </record> + + <record id="mrp_requisition_tree_view" model="ir.ui.view"> + <field name="name">mrp.requisition.tree.view</field> + <field name="model">mrp.requisition</field> + <field name="priority">100</field> + <field name="arch" type="xml"> + <tree> + <field name="name"/> + <field name="engineer"/> + </tree> + </field> + </record> </data> </odoo> \ No newline at end of file diff --git a/extra-addons/kci-mrp/views/mrp_views_menu.xml b/extra-addons/kci-mrp/views/mrp_views_menu.xml index a511a08f63a..2a70561cae1 100644 --- a/extra-addons/kci-mrp/views/mrp_views_menu.xml +++ b/extra-addons/kci-mrp/views/mrp_views_menu.xml @@ -72,8 +72,9 @@ <record id="requisition_form_action" model="ir.actions.act_window"> <field name="name">隢贝頃�鱓</field> <field name="res_model">mrp.requisition</field> - <field name="view_mode">list,tree,form</field> - <field name="view_id" ref="mrp_requisition_view_form"/> + <field name="view_mode">tree,form</field> + <!-- <field name="view_id" ref="mrp_requisition_view_form"/> + <field name="search_view_id" ref="mrp_requisition_view_tree"/> --> <field name="help" type="html"> <p class="o_view_nocontent_smiling_face"> No product found. Let's create one! -- GitLab From ad6c2c7c134ba64300ccb612923574168eb98c5e Mon Sep 17 00:00:00 2001 From: asas1asas200 <asas1asas200@gmail.com> Date: Wed, 22 Nov 2023 00:26:51 +0800 Subject: [PATCH 4/4] feat(mrp-requisition): impl all requisition flow Main feats: + Create purchase order when confirm the requisition + Send mail when `notify_purchase` has been clicked + Only user in purchase group can convert requisition to purchase order + Every item in requisition line must be set a supplier before converting to purchase order + Read-only when requisition is `done` or `cancel` + I don't limit min qty from supplier info, if it is needed I will add it in future Notice: + You should update `purchase` module due to `purchase.order` has been inherited in `requisition` module + Mail function has not been tested yet --- extra-addons/kci-mrp/__manifest__.py | 1 + .../kci-mrp/data/requisition_email.xml | 15 +++++ .../kci-mrp/models/mrp_requisition.py | 62 +++++++++++++++++-- .../kci-mrp/views/mrp_requisition_views.xml | 32 ++++++---- extra-addons/kci-mrp/views/mrp_views_menu.xml | 4 +- 5 files changed, 95 insertions(+), 19 deletions(-) create mode 100644 extra-addons/kci-mrp/data/requisition_email.xml diff --git a/extra-addons/kci-mrp/__manifest__.py b/extra-addons/kci-mrp/__manifest__.py index ba278fc2bb2..cfcbfb5781b 100644 --- a/extra-addons/kci-mrp/__manifest__.py +++ b/extra-addons/kci-mrp/__manifest__.py @@ -21,6 +21,7 @@ This module contains all the common features of Drawings. 'views/mrp_groups.xml', 'views/mrp_requisition_views.xml', 'report/bom_for_sales.xml', + 'data/requisition_email.xml', 'data/bom_email.xml', ], 'application': True, diff --git a/extra-addons/kci-mrp/data/requisition_email.xml b/extra-addons/kci-mrp/data/requisition_email.xml new file mode 100644 index 00000000000..9728dbb6ce7 --- /dev/null +++ b/extra-addons/kci-mrp/data/requisition_email.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <data> + <record id="requisition_email_template" model="mail.template"> + <field name="name">Requisition Email Template</field> + <field name="email_from">erp_system@kci-gloabl.com.tw</field> + <field name="subject">[KCI ERP System] Requisition �𡁶䰻</field> + <field name="model_id" ref="kci-mrp.model_mrp_requisition"/> + <field name="auto_delete" eval="False"/> + <field name="body_html" type="html"> + <div>test</div> + </field> + </record> + </data> +</odoo> \ No newline at end of file diff --git a/extra-addons/kci-mrp/models/mrp_requisition.py b/extra-addons/kci-mrp/models/mrp_requisition.py index 2f0864fa0c0..855d52c3f75 100644 --- a/extra-addons/kci-mrp/models/mrp_requisition.py +++ b/extra-addons/kci-mrp/models/mrp_requisition.py @@ -1,4 +1,12 @@ from odoo import models, fields, api +from odoo.exceptions import ValidationError + + +class PurchaseOrder(models.Model): + _inherit = 'purchase.order' + + requisition_id = fields.Many2one( + 'mrp.requisition', string='隢贝頃�鱓', default=False) class MrpRequisition(models.Model): @@ -21,8 +29,8 @@ class MrpRequisition(models.Model): 'mrp.requisition.line', 'requisition_id', 'Requisition Lines') amount_total = fields.Float( string='蝮質��', compute='_compute_amount_total', store=True) - ref_purchase_id = fields.Many2one( - 'purchase.order', string='�繧鞈澆鱓', store=True) + ref_purchase_ids = fields.One2many( + 'purchase.order', 'requisition_id', string='撱箇�讠��繧鞈潸��鱓', readonly=True, copy=False) @api.depends('requisition_line_ids.price_subtotal', 'requisition_line_ids') def _compute_amount_total(self): @@ -31,13 +39,53 @@ class MrpRequisition(models.Model): line.price_subtotal for line in requisition.requisition_line_ids) def notify_purchase(self): - pass + self.state = 'pending' + message = f'{self.engineer.name} 撱箇�衤�銝��𧢲鰵���繧鞈潮�瘙��鱓 {self.name}' + group = self.env['mail.channel'].search( + [('group_public_id', '=', self.env.ref('kci-purchase.kci_purchase_group').id)]) + email_to = '' + for partner in group.channel_partner_ids: + email_to += f'{partner.email}, ' + email_values = { + 'email_to': email_to, + 'email_cc': self.env.user.partner_id.email, + 'email_from': "erp_system@kci-global.com.tw", + 'body_html': message, + } + mail_template = self.env.ref('kci-mrp.requisition_email_template') + mail_template.send_mail(self.id, email_values=email_values) def confirm(self): - pass + supplier_mapping = {} + + for line in self.requisition_line_ids: + if not line.product_tmpl_id.seller_ids: + raise ValidationError( + f'���� {line.product_tmpl_id.name} 撠𡁏𧊋����帋�𥟇�匧�嚗諹𥅾�𧊋�枂�𣶹靘𥟇�匧��賊�嚗諹�见���箇𤩎���鰵憓硺�𥟇�匧�') + if line.supplier_id.name.id not in supplier_mapping: + supplier_mapping[line.supplier_id.name.id] = [] + supplier_mapping[line.supplier_id.name.id].append(line) + + for partner_id, lines in supplier_mapping.items(): + purchase_order = self.env['purchase.order'].create({ + 'partner_id': partner_id, + 'requisition_id': self.id, + 'user_id': self.env.user.id, + }) + for line in lines: + self.env['purchase.order.line'].create({ + 'product_id': line.product_tmpl_id.product_variant_ids[0].id, + 'name': line.product_tmpl_id.name, + 'product_qty': line.product_qty, + 'price_unit': line.price_unit, + 'order_id': purchase_order.id, + }) + self.ref_purchase_ids += purchase_order + + self.state = 'done' def cancel(self): - pass + self.state = 'cancel' class MrpRequisitionLine(models.Model): @@ -47,7 +95,9 @@ class MrpRequisitionLine(models.Model): 'mrp.requisition', index=True, ondelete='cascade', required=True) product_tmpl_id = fields.Many2one( - 'product.template', string='����', store=True) + 'product.template', string='����', domain='[("purchase_ok", "=", True)]', store=True) + supplier_id = fields.Many2one( + 'product.supplierinfo', string='靘𥟇�匧�', domain='[("product_tmpl_id", "=", product_tmpl_id)]', store=True) price_unit = fields.Float(string='�鱓��', store=True) product_qty = fields.Float(string='�彍���', required=True) price_subtotal = fields.Float( diff --git a/extra-addons/kci-mrp/views/mrp_requisition_views.xml b/extra-addons/kci-mrp/views/mrp_requisition_views.xml index 6f1b2778851..633a9b74b90 100644 --- a/extra-addons/kci-mrp/views/mrp_requisition_views.xml +++ b/extra-addons/kci-mrp/views/mrp_requisition_views.xml @@ -8,8 +8,8 @@ <form> <header> <button name="notify_purchase" class="oe_highlight" type="object" string="�𡁶䰻�繧鞈�" attrs="{'invisible': [('state', '!=', 'draft')]}"/> - <button name="confirm" class="oe_highlight" type="object" string="撱箇�𧢲繧鞈潸��鱓" attrs="{'invisible': [('state', '!=', 'pending')]}"/> - <button name="cancel" class="btn btn-secondary" type="object" string="��𡝗��" help="��𡝗��迨隢贝頃�鱓" attrs="{'invisible': [('state', '=', 'cancel')]}"/> + <button name="confirm" class="oe_highlight" type="object" string="撱箇�𧢲繧鞈潸��鱓" groups="kci-purchase.kci_purchase_group" attrs="{'invisible': [('state', '!=', 'pending')]}"/> + <button name="cancel" class="btn btn-secondary" type="object" string="��𡝗��" help="��𡝗��迨隢贝頃�鱓" attrs="{'invisible': [('state', 'in', ('cancel', 'done'))]}"/> <field name="state" widget="statusbar" statusbar_visible="draft,pending,done"/> </header> @@ -22,17 +22,26 @@ <group> <field name="create_date" readonly="1"/> <field name="amount_total"/> - <field name="ref_purchase_id" readonly="1"/> </group> </group> - <field name="requisition_line_ids" widget="one2many" context="{'default_requisition_id': id}"> - <tree string="Components" editable="bottom"> - <field name="product_tmpl_id"/> - <field name="product_qty"/> - <field name="price_unit"/> - <field name="price_subtotal"/> - </tree> - </field> + + <notebook> + <page string="鞈潸眺皜��鱓"> + <field name="requisition_line_ids" widget="one2many" context="{'default_requisition_id': id}" attrs="{'readonly': [('state', 'in', ('done', 'cancel'))]}"> + <tree editable="bottom"> + <field name="product_tmpl_id"/> + <field name="supplier_id" options="{'no_create': True}"/> + <field name="product_qty"/> + <field name="price_unit"/> + <field name="price_subtotal"/> + </tree> + </field> + </page> + + <page string="撱箇�讠��繧鞈潸��鱓" autofocus="autofocus" attrs="{'invisible': [('state', 'not in', ('cancel', 'done'))]}"> + <field name="ref_purchase_ids" /> + </page> + </notebook> </sheet> </form> </field> @@ -46,6 +55,7 @@ <tree> <field name="name"/> <field name="engineer"/> + <field name="state"/> </tree> </field> </record> diff --git a/extra-addons/kci-mrp/views/mrp_views_menu.xml b/extra-addons/kci-mrp/views/mrp_views_menu.xml index 2a70561cae1..b3f100a900b 100644 --- a/extra-addons/kci-mrp/views/mrp_views_menu.xml +++ b/extra-addons/kci-mrp/views/mrp_views_menu.xml @@ -88,8 +88,8 @@ <menuitem action="requisition_form_action" id="root_menu_mrp_requisition_form_action" name="隢贝頃�鱓" - parent="mrp.menu_mrp_bom" - sequence="3" + parent="mrp.menu_mrp_root" + sequence="150" /> -- GitLab