diff --git a/mrp_multi_level/README.rst b/mrp_multi_level/README.rst index f45bdc7df..961b46eac 100644 --- a/mrp_multi_level/README.rst +++ b/mrp_multi_level/README.rst @@ -82,6 +82,46 @@ To launch replenishment orders (moves, purchases, production orders...): Changelog ========= +12.0.2.0.0 (2020-03-31) +~~~~~~~~~~~~~~~~~~~~~~~ +* Improving the management of planned orders: + + * Add menu entry for planned orders + * Add button to navigate from planned orders to linked manufacturing orders + * Add action to convert planned orders to fixed + * When changing the due date in a planned order the release date is recomputed + +* [IMP] Minor changes" + (`#470 `_). + + * Planned Order release and due date become required. + * Add button to Product MRP Area to update MOQ from Supplier Info. + * Link Manufacturing Orders with Planned Orders. + * Allow Mrp Inventory Procure Wizard to be used from other models. + * Make MRP Inventory creation more extensible. + * Main Supplier computation (v13 requires explicit False definitions) + +* [IMP] Minor changes + (`#468 `_). + + * Planned Orders become fixed on manual creation by default + * Released Quantity becomes readonly + * Add product reference if Planned Order name is not defined on bom explosion + +* [FIX] Minor changes + (`#469 `_). + + * Fix Main supplier computation in multi company + * Drop Triplicated field in search view + + +* [IMP] Minor changes + (`#463 `_). + + * Show supply method on MRP Inventory + * Allow no-MRP users to look into Products + + 12.0.1.0.0 (2019-08-05) ~~~~~~~~~~~~~~~~~~~~~~~ @@ -158,14 +198,15 @@ Authors ~~~~~~~ * Ucamco -* Eficent +* ForgeFlow Contributors ~~~~~~~~~~~~ * Wim Audenaert -* Jordi Ballester -* Lois Rilo +* Jordi Ballester +* Lois Rilo +* Héctor Villarreal Maintainers ~~~~~~~~~~~ @@ -180,16 +221,16 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -.. |maintainer-jbeficent| image:: https://github.com/jbeficent.png?size=40px - :target: https://github.com/jbeficent - :alt: jbeficent -.. |maintainer-lreficent| image:: https://github.com/lreficent.png?size=40px - :target: https://github.com/lreficent - :alt: lreficent +.. |maintainer-JordiBForgeFlow| image:: https://github.com/JordiBForgeFlow.png?size=40px + :target: https://github.com/JordiBForgeFlow + :alt: JordiBForgeFlow +.. |maintainer-LoisRForgeFlow| image:: https://github.com/LoisRForgeFlow.png?size=40px + :target: https://github.com/LoisRForgeFlow + :alt: LoisRForgeFlow Current `maintainers `__: -|maintainer-jbeficent| |maintainer-lreficent| +|maintainer-JordiBForgeFlow| |maintainer-LoisRForgeFlow| This module is part of the `OCA/manufacture `_ project on GitHub. diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index 105467870..89b30a468 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -1,5 +1,5 @@ # Copyright 2016 Ucamco - Wim Audenaert -# Copyright 2016-19 Eficent Business and IT Consulting Services S.L. +# Copyright 2016-19 ForgeFlow S.L. (https://www.forgeflow.com) # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). { @@ -8,9 +8,9 @@ 'development_status': 'Beta', 'license': 'LGPL-3', 'author': 'Ucamco, ' - 'Eficent, ' + 'ForgeFlow, ' 'Odoo Community Association (OCA)', - 'maintainers': ['jbeficent', 'lreficent'], + "maintainers": ["JordiBForgeFlow", "LoisRForgeFlow"], 'summary': 'Adds an MRP Scheduler', 'website': 'https://github.com/OCA/manufacture', 'category': 'Manufacturing', @@ -20,19 +20,20 @@ 'mrp_warehouse_calendar', ], 'data': [ - 'security/mrp_multi_level_security.xml', - 'security/ir.model.access.csv', - 'views/mrp_area_views.xml', - 'views/product_product_views.xml', - 'views/product_template_views.xml', - 'views/product_mrp_area_views.xml', - 'views/stock_location_views.xml', - 'wizards/mrp_inventory_procure_views.xml', - 'views/mrp_inventory_views.xml', - 'wizards/mrp_multi_level_views.xml', - 'views/mrp_menuitem.xml', - 'data/mrp_multi_level_cron.xml', - 'data/mrp_area_data.xml', + "security/mrp_multi_level_security.xml", + "security/ir.model.access.csv", + "views/mrp_area_views.xml", + "views/product_product_views.xml", + "views/product_template_views.xml", + "views/product_mrp_area_views.xml", + "views/stock_location_views.xml", + "wizards/mrp_inventory_procure_views.xml", + "views/mrp_inventory_views.xml", + "views/mrp_planned_order_views.xml", + "wizards/mrp_multi_level_views.xml", + "views/mrp_menuitem.xml", + "data/mrp_multi_level_cron.xml", + "data/mrp_area_data.xml", ], 'demo': [ 'demo/product_category_demo.xml', diff --git a/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py b/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py index afd5d1925..3530db10c 100644 --- a/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py +++ b/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py @@ -1,4 +1,4 @@ -# Copyright 2019 Eficent Business and IT Consulting Services, S.L. +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com) # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). import logging from odoo import api, SUPERUSER_ID diff --git a/mrp_multi_level/models/__init__.py b/mrp_multi_level/models/__init__.py index 486079907..0ebdf3353 100644 --- a/mrp_multi_level/models/__init__.py +++ b/mrp_multi_level/models/__init__.py @@ -6,3 +6,5 @@ from . import mrp_move from . import mrp_planned_order from . import mrp_inventory from . import product_mrp_area +from . import stock_rule +from . import mrp_production diff --git a/mrp_multi_level/models/mrp_area.py b/mrp_multi_level/models/mrp_area.py index b7c426e2d..c7131b2ef 100644 --- a/mrp_multi_level/models/mrp_area.py +++ b/mrp_multi_level/models/mrp_area.py @@ -1,5 +1,5 @@ # © 2016 Ucamco - Wim Audenaert -# © 2016-19 Eficent Business and IT Consulting Services S.L. +# © 2016-19 ForgeFlow S.L. (https://www.forgeflow.com) # - Jordi Ballester Alomar # - Lois Rilo Antelo # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). diff --git a/mrp_multi_level/models/mrp_inventory.py b/mrp_multi_level/models/mrp_inventory.py index 75ae6b023..03534fa3b 100644 --- a/mrp_multi_level/models/mrp_inventory.py +++ b/mrp_multi_level/models/mrp_inventory.py @@ -1,5 +1,5 @@ # © 2016 Ucamco - Wim Audenaert -# Copyright 2016-19 Eficent Business and IT Consulting Services S.L. +# Copyright 2016-19 ForgeFlow S.L. (https://www.forgeflow.com) # - Jordi Ballester Alomar # - Lois Rilo Antelo # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). @@ -67,6 +67,12 @@ class MrpInventory(models.Model): inverse_name="mrp_inventory_id", readonly=True, ) + supply_method = fields.Selection( + string="Supply Method", + related="product_mrp_area_id.supply_method", + readonly=True, + store=True, + ) @api.multi def _compute_uom_id(self): diff --git a/mrp_multi_level/models/mrp_move.py b/mrp_multi_level/models/mrp_move.py index 059cd0416..e6fcc959a 100644 --- a/mrp_multi_level/models/mrp_move.py +++ b/mrp_multi_level/models/mrp_move.py @@ -1,5 +1,5 @@ # © 2016 Ucamco - Wim Audenaert -# © 2016-18 Eficent Business and IT Consulting Services S.L. +# © 2016-18 ForgeFlow S.L. (https://www.forgeflow.com) # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import models, fields diff --git a/mrp_multi_level/models/mrp_planned_order.py b/mrp_multi_level/models/mrp_planned_order.py index 9959788c5..2531e1561 100644 --- a/mrp_multi_level/models/mrp_planned_order.py +++ b/mrp_multi_level/models/mrp_planned_order.py @@ -1,8 +1,9 @@ -# Copyright 2019 Eficent Business and IT Consulting Services S.L. +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com) # - Lois Rilo Antelo # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from datetime import timedelta -from odoo import models, fields +from odoo import api, fields, models class MrpPlannedOrder(models.Model): @@ -37,15 +38,15 @@ class MrpPlannedOrder(models.Model): readonly=True, ) order_release_date = fields.Date( - string="Release Date", - help="Order release date planned by MRP.", + string="Release Date", help="Order release date planned by MRP.", required=True ) due_date = fields.Date( string="Due Date", help="Date in which the supply must have been completed.", + required=True, ) - qty_released = fields.Float() - fixed = fields.Boolean() + qty_released = fields.Float(readonly=True) + fixed = fields.Boolean(default=True) mrp_qty = fields.Float(string="Quantity") mrp_move_down_ids = fields.Many2many( comodel_name="mrp.move", @@ -68,3 +69,38 @@ class MrpPlannedOrder(models.Model): comodel_name="mrp.inventory", ondelete="set null", ) + mrp_production_ids = fields.One2many( + "mrp.production", "planned_order_id", string="Manufacturing Orders" + ) + mo_count = fields.Integer(compute="_compute_mrp_production_count") + + def _compute_mrp_production_count(self): + for rec in self: + rec.mo_count = len(rec.mrp_production_ids) + + @api.onchange("due_date") + def _onchange_due_date(self): + if self.due_date: + if self.product_mrp_area_id.mrp_lead_time: + calendar = self.mrp_area_id.calendar_id + if calendar: + dt = fields.Datetime.from_string(self.due_date) + res = calendar.plan_days( + -1 * (self.product_mrp_area_id.mrp_lead_time + 1), dt + ) + self.order_release_date = res.date() + else: + self.order_release_date = fields.Date.from_string( + self.due_date + ) - timedelta(days=self.product_mrp_area_id.mrp_lead_time) + + def action_toggle_fixed(self): + for rec in self: + rec.fixed = not rec.fixed + + def action_open_linked_mrp_production(self): + action = self.env.ref("mrp.mrp_production_action") + result = action.read()[0] + result["context"] = {} + result["domain"] = "[('id','in',%s)]" % self.mrp_production_ids.ids + return result diff --git a/mrp_multi_level/models/mrp_production.py b/mrp_multi_level/models/mrp_production.py new file mode 100644 index 000000000..53601bf21 --- /dev/null +++ b/mrp_multi_level/models/mrp_production.py @@ -0,0 +1,12 @@ +# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) +# - Héctor Villarreal +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from odoo import fields, models + + +class MrpProduction(models.Model): + """ Manufacturing Orders """ + + _inherit = "mrp.production" + + planned_order_id = fields.Many2one(comodel_name="mrp.planned.order") diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index 9ad15df03..24b9140c0 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -1,5 +1,5 @@ # Copyright 2016 Ucamco - Wim Audenaert -# Copyright 2016-19 Eficent Business and IT Consulting Services S.L. +# Copyright 2016-19 ForgeFlow S.L. (https://www.forgeflow.com) # - Jordi Ballester Alomar # - Lois Rilo Antelo # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). @@ -190,9 +190,14 @@ class ProductMRPArea(models.Model): and (not r.company_id or r.company_id == rec.company_id) ) if not suppliers: + rec.main_supplierinfo_id = False + rec.main_supplier_id = False continue rec.main_supplierinfo_id = suppliers[0] rec.main_supplier_id = suppliers[0].name + for rec in self.filtered(lambda r: r.supply_method != "buy"): + rec.main_supplierinfo_id = False + rec.main_supplier_id = False @api.multi def _adjust_qty_to_order(self, qty_to_order): @@ -209,3 +214,9 @@ class ProductMRPArea(models.Model): self.mrp_maximum_order_qty: return self.mrp_maximum_order_qty return qty_to_order + + def update_min_qty_from_main_supplier(self): + for rec in self.filtered( + lambda r: r.main_supplierinfo_id and r.supply_method == "buy" + ): + rec.mrp_minimum_order_qty = rec.main_supplierinfo_id.min_qty diff --git a/mrp_multi_level/models/product_product.py b/mrp_multi_level/models/product_product.py index b52802067..989f56e12 100644 --- a/mrp_multi_level/models/product_product.py +++ b/mrp_multi_level/models/product_product.py @@ -1,5 +1,5 @@ # Copyright 2016 Ucamco - Wim Audenaert -# Copyright 2016-18 Eficent Business and IT Consulting Services S.L. +# Copyright 2016-18 ForgeFlow S.L. (https://www.forgeflow.com) # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). import ast from odoo import api, fields, models diff --git a/mrp_multi_level/models/product_template.py b/mrp_multi_level/models/product_template.py index bcea26a27..cc3b4eee9 100644 --- a/mrp_multi_level/models/product_template.py +++ b/mrp_multi_level/models/product_template.py @@ -1,4 +1,4 @@ -# Copyright 2018 Eficent Business and IT Consulting Services S.L. +# Copyright 2018 ForgeFlow S.L. (https://www.forgeflow.com) # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). import ast from odoo import api, fields, models diff --git a/mrp_multi_level/models/stock_location.py b/mrp_multi_level/models/stock_location.py index 3c574443c..757a48beb 100644 --- a/mrp_multi_level/models/stock_location.py +++ b/mrp_multi_level/models/stock_location.py @@ -1,5 +1,5 @@ # © 2016 Ucamco - Wim Audenaert -# © 2016 Eficent Business and IT Consulting Services S.L. +# © 2016 ForgeFlow S.L. (https://www.forgeflow.com) # - Jordi Ballester Alomar # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). diff --git a/mrp_multi_level/models/stock_rule.py b/mrp_multi_level/models/stock_rule.py new file mode 100644 index 000000000..8d24460c1 --- /dev/null +++ b/mrp_multi_level/models/stock_rule.py @@ -0,0 +1,33 @@ +# Copyright 2020 ForgeFlow S.L. (https://www.forgeflow.com) +# - Héctor Villarreal +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from odoo import models + + +class StockRule(models.Model): + _inherit = "stock.rule" + + def _prepare_mo_vals( + self, + product_id, + product_qty, + product_uom, + location_id, + name, + origin, + values, + bom, + ): + res = super()._prepare_mo_vals( + product_id, + product_qty, + product_uom, + location_id, + name, + origin, + values, + bom, + ) + if "planned_order_id" in values: + res["planned_order_id"] = values["planned_order_id"] + return res diff --git a/mrp_multi_level/readme/CONTRIBUTORS.rst b/mrp_multi_level/readme/CONTRIBUTORS.rst index 63a6a5199..8c327e8ca 100644 --- a/mrp_multi_level/readme/CONTRIBUTORS.rst +++ b/mrp_multi_level/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * Wim Audenaert -* Jordi Ballester -* Lois Rilo +* Jordi Ballester +* Lois Rilo +* Héctor Villarreal diff --git a/mrp_multi_level/readme/HISTORY.rst b/mrp_multi_level/readme/HISTORY.rst index c1596d26c..da410f9c8 100644 --- a/mrp_multi_level/readme/HISTORY.rst +++ b/mrp_multi_level/readme/HISTORY.rst @@ -1,3 +1,43 @@ +12.0.2.0.0 (2020-03-31) +~~~~~~~~~~~~~~~~~~~~~~~ +* Improving the management of planned orders: + + * Add menu entry for planned orders + * Add button to navigate from planned orders to linked manufacturing orders + * Add action to convert planned orders to fixed + * When changing the due date in a planned order the release date is recomputed + +* [IMP] Minor changes" + (`#470 `_). + + * Planned Order release and due date become required. + * Add button to Product MRP Area to update MOQ from Supplier Info. + * Link Manufacturing Orders with Planned Orders. + * Allow Mrp Inventory Procure Wizard to be used from other models. + * Make MRP Inventory creation more extensible. + * Main Supplier computation (v13 requires explicit False definitions) + +* [IMP] Minor changes + (`#468 `_). + + * Planned Orders become fixed on manual creation by default + * Released Quantity becomes readonly + * Add product reference if Planned Order name is not defined on bom explosion + +* [FIX] Minor changes + (`#469 `_). + + * Fix Main supplier computation in multi company + * Drop Triplicated field in search view + + +* [IMP] Minor changes + (`#463 `_). + + * Show supply method on MRP Inventory + * Allow no-MRP users to look into Products + + 12.0.1.0.0 (2019-08-05) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/security/ir.model.access.csv b/mrp_multi_level/security/ir.model.access.csv index e709cbec1..ed7fba05f 100644 --- a/mrp_multi_level/security/ir.model.access.csv +++ b/mrp_multi_level/security/ir.model.access.csv @@ -7,5 +7,6 @@ access_mrp_area_user,mrp.area user,model_mrp_area,mrp.group_mrp_user,1,0,0,0 access_mrp_area_manager,mrp.area manager,model_mrp_area,mrp.group_mrp_manager,1,1,1,1 access_product_mrp_area_user,product.mrp.area user,model_product_mrp_area,mrp.group_mrp_user,1,1,1,0 access_product_mrp_area_manager,product.mrp.area manager,model_product_mrp_area,mrp.group_mrp_manager,1,1,1,1 +access_product_mrp_area_read,product.mrp.area read,model_product_mrp_area,base.group_user,1,0,0,0 access_mrp_planned_order_user,mrp.planned.order user,model_mrp_planned_order,mrp.group_mrp_user,1,0,0,0 access_mrp_planned_order_manager,mrp.planned.order manager,model_mrp_planned_order,mrp.group_mrp_manager,1,1,1,1 diff --git a/mrp_multi_level/static/description/index.html b/mrp_multi_level/static/description/index.html index 493ebe4f0..cc5b73f2d 100644 --- a/mrp_multi_level/static/description/index.html +++ b/mrp_multi_level/static/description/index.html @@ -3,7 +3,7 @@ - + MRP Multi Level