From e78c2585e04c09e7aa28f40820ec8781d346fe66 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Thu, 21 Jun 2018 12:05:41 +0200 Subject: [PATCH 001/188] [11.0][REN] multi_level_mrp -> mrp_multi_level --- mrp_multi_level/README.rst | 76 ++ mrp_multi_level/__init__.py | 2 + mrp_multi_level/__manifest__.py | 43 + mrp_multi_level/data/mrp_area_data.xml | 8 + mrp_multi_level/data/mrp_multi_level_cron.xml | 17 + mrp_multi_level/demo/initial_on_hand_demo.xml | 32 + mrp_multi_level/demo/mrp_bom_demo.xml | 81 ++ .../demo/product_category_demo.xml | 6 + mrp_multi_level/demo/product_product_demo.xml | 59 ++ .../demo/product_supplierinfo_demo.xml | 18 + mrp_multi_level/demo/res_partner_demo.xml | 10 + mrp_multi_level/models/__init__.py | 6 + mrp_multi_level/models/mrp_area.py | 19 + mrp_multi_level/models/mrp_inventory.py | 44 + mrp_multi_level/models/mrp_move.py | 173 ++++ mrp_multi_level/models/mrp_product.py | 119 +++ mrp_multi_level/models/product.py | 47 + mrp_multi_level/models/stock_location.py | 16 + mrp_multi_level/security/ir.model.access.csv | 9 + .../security/mrp_multi_level_security.xml | 10 + mrp_multi_level/static/src/img/icon.png | Bin 0 -> 9455 bytes mrp_multi_level/tests/__init__.py | 2 + mrp_multi_level/tests/test_mrp_multi_level.py | 366 +++++++ mrp_multi_level/views/mrp_area_view.xml | 60 ++ mrp_multi_level/views/mrp_inventory_view.xml | 97 ++ mrp_multi_level/views/mrp_menuitem.xml | 33 + mrp_multi_level/views/mrp_product_view.xml | 176 ++++ mrp_multi_level/views/product_view.xml | 32 + mrp_multi_level/views/stock_location_view.xml | 38 + mrp_multi_level/wizards/__init__.py | 2 + .../wizards/mrp_inventory_procure.py | 133 +++ .../wizards/mrp_inventory_procure_view.xml | 59 ++ mrp_multi_level/wizards/mrp_multi_level.py | 971 ++++++++++++++++++ .../wizards/mrp_multi_level_view.xml | 27 + 34 files changed, 2791 insertions(+) create mode 100644 mrp_multi_level/README.rst create mode 100644 mrp_multi_level/__init__.py create mode 100644 mrp_multi_level/__manifest__.py create mode 100644 mrp_multi_level/data/mrp_area_data.xml create mode 100755 mrp_multi_level/data/mrp_multi_level_cron.xml create mode 100644 mrp_multi_level/demo/initial_on_hand_demo.xml create mode 100644 mrp_multi_level/demo/mrp_bom_demo.xml create mode 100644 mrp_multi_level/demo/product_category_demo.xml create mode 100644 mrp_multi_level/demo/product_product_demo.xml create mode 100644 mrp_multi_level/demo/product_supplierinfo_demo.xml create mode 100644 mrp_multi_level/demo/res_partner_demo.xml create mode 100644 mrp_multi_level/models/__init__.py create mode 100644 mrp_multi_level/models/mrp_area.py create mode 100644 mrp_multi_level/models/mrp_inventory.py create mode 100644 mrp_multi_level/models/mrp_move.py create mode 100644 mrp_multi_level/models/mrp_product.py create mode 100644 mrp_multi_level/models/product.py create mode 100644 mrp_multi_level/models/stock_location.py create mode 100644 mrp_multi_level/security/ir.model.access.csv create mode 100644 mrp_multi_level/security/mrp_multi_level_security.xml create mode 100644 mrp_multi_level/static/src/img/icon.png create mode 100644 mrp_multi_level/tests/__init__.py create mode 100644 mrp_multi_level/tests/test_mrp_multi_level.py create mode 100644 mrp_multi_level/views/mrp_area_view.xml create mode 100644 mrp_multi_level/views/mrp_inventory_view.xml create mode 100644 mrp_multi_level/views/mrp_menuitem.xml create mode 100644 mrp_multi_level/views/mrp_product_view.xml create mode 100644 mrp_multi_level/views/product_view.xml create mode 100644 mrp_multi_level/views/stock_location_view.xml create mode 100644 mrp_multi_level/wizards/__init__.py create mode 100644 mrp_multi_level/wizards/mrp_inventory_procure.py create mode 100644 mrp_multi_level/wizards/mrp_inventory_procure_view.xml create mode 100644 mrp_multi_level/wizards/mrp_multi_level.py create mode 100644 mrp_multi_level/wizards/mrp_multi_level_view.xml diff --git a/mrp_multi_level/README.rst b/mrp_multi_level/README.rst new file mode 100644 index 000000000..2ff008382 --- /dev/null +++ b/mrp_multi_level/README.rst @@ -0,0 +1,76 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +=============== +Multi Level MRP +=============== + +This module allows you to calculate, based in known inventory, demand, and +supply, and based on parameters set at product variant level, the new +procurements for each product. + +To do this, the calculation starts at top level of the bill of material +and explodes this down to the lowest level. + +Key Features +------------ +* MRP parameters at product variant level +* Basic forecast system +* Cron job to calculate the MRP demand +* Manually calculate the MRP demand +* Confirm the calculated MRP demand and create BID's, PO's, or MO's +* View to see the products for which action is needed + + +Installation +============ + + +Usage +===== + + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/129/11.0 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Original Odoo icons. + + +Contributors +------------ + +* Wim Audenaert +* Jordi Ballester +* Lois Rilo + + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +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. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/mrp_multi_level/__init__.py b/mrp_multi_level/__init__.py new file mode 100644 index 000000000..aee8895e7 --- /dev/null +++ b/mrp_multi_level/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py new file mode 100644 index 000000000..7504f1284 --- /dev/null +++ b/mrp_multi_level/__manifest__.py @@ -0,0 +1,43 @@ +# Copyright 2016 Ucamco - Wim Audenaert +# Copyright 2016-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + 'name': 'MRP Multi Level', + 'version': '11.0.1.0.0', + 'author': 'Ucamco, ' + 'Eficent, ' + 'Odoo Community Association (OCA)', + 'summary': 'Adds an MRP Scheduler', + 'website': 'https://github.com/OCA/manufacture', + 'category': 'Manufacturing', + 'depends': [ + 'mrp', + 'stock', + 'purchase', + 'stock_demand_estimate', + ], + 'data': [ + 'security/mrp_multi_level_security.xml', + 'security/ir.model.access.csv', + 'views/mrp_area_view.xml', + 'views/product_view.xml', + 'views/stock_location_view.xml', + 'views/mrp_product_view.xml', + 'wizards/mrp_inventory_procure_view.xml', + 'views/mrp_inventory_view.xml', + 'wizards/mrp_multi_level_view.xml', + 'views/mrp_menuitem.xml', + 'data/mrp_multi_level_cron.xml', + 'data/mrp_area_data.xml', + ], + 'demo': [ + 'demo/product_category_demo.xml', + 'demo/product_product_demo.xml', + 'demo/res_partner_demo.xml', + 'demo/product_supplierinfo_demo.xml', + 'demo/mrp_bom_demo.xml', + 'demo/initial_on_hand_demo.xml', + ], + 'installable': True, + 'application': True, +} diff --git a/mrp_multi_level/data/mrp_area_data.xml b/mrp_multi_level/data/mrp_area_data.xml new file mode 100644 index 000000000..6ce02c128 --- /dev/null +++ b/mrp_multi_level/data/mrp_area_data.xml @@ -0,0 +1,8 @@ + + + + WH/Stock + + + + diff --git a/mrp_multi_level/data/mrp_multi_level_cron.xml b/mrp_multi_level/data/mrp_multi_level_cron.xml new file mode 100755 index 000000000..83c2417ca --- /dev/null +++ b/mrp_multi_level/data/mrp_multi_level_cron.xml @@ -0,0 +1,17 @@ + + + + + Multi Level MRP + + + 1 + days + -1 + + + + + + + diff --git a/mrp_multi_level/demo/initial_on_hand_demo.xml b/mrp_multi_level/demo/initial_on_hand_demo.xml new file mode 100644 index 000000000..a2cd4991c --- /dev/null +++ b/mrp_multi_level/demo/initial_on_hand_demo.xml @@ -0,0 +1,32 @@ + + + + + Simulating MRP + + + + + + 10 + + + + + + + 20 + + + + + + + 15 + + + + + + + \ No newline at end of file diff --git a/mrp_multi_level/demo/mrp_bom_demo.xml b/mrp_multi_level/demo/mrp_bom_demo.xml new file mode 100644 index 000000000..1b1e9f7b5 --- /dev/null +++ b/mrp_multi_level/demo/mrp_bom_demo.xml @@ -0,0 +1,81 @@ + + + + + + + 5 + + + + 2 + + 5 + + + + + 3 + + 5 + + + + + + + + 5 + + + + 2 + + 5 + + + + + 3 + + 5 + + + + + + + 5 + + + + 3 + + 5 + + + + + 2 + + 5 + + + + + + + 5 + + + + 3 + + 5 + + + diff --git a/mrp_multi_level/demo/product_category_demo.xml b/mrp_multi_level/demo/product_category_demo.xml new file mode 100644 index 000000000..bf989ea45 --- /dev/null +++ b/mrp_multi_level/demo/product_category_demo.xml @@ -0,0 +1,6 @@ + + + + MRP + + diff --git a/mrp_multi_level/demo/product_product_demo.xml b/mrp_multi_level/demo/product_product_demo.xml new file mode 100644 index 000000000..358d70978 --- /dev/null +++ b/mrp_multi_level/demo/product_product_demo.xml @@ -0,0 +1,59 @@ + + + + FP-1 + + product + + + 2 + + + + + FP-2 + + product + + + 1 + + + + + SF-1 + + product + + + 1 + + + + SF-2 + + product + + + 3 + + + + + PP-1 + + product + + + + + + + PP-2 + + product + + + + + diff --git a/mrp_multi_level/demo/product_supplierinfo_demo.xml b/mrp_multi_level/demo/product_supplierinfo_demo.xml new file mode 100644 index 000000000..ab223f04c --- /dev/null +++ b/mrp_multi_level/demo/product_supplierinfo_demo.xml @@ -0,0 +1,18 @@ + + + + + + 4 + 0 + 100 + + + + + + 2 + 0 + 100 + + diff --git a/mrp_multi_level/demo/res_partner_demo.xml b/mrp_multi_level/demo/res_partner_demo.xml new file mode 100644 index 000000000..ecb86d323 --- /dev/null +++ b/mrp_multi_level/demo/res_partner_demo.xml @@ -0,0 +1,10 @@ + + + + Lazer Tech + 1 + + + + + diff --git a/mrp_multi_level/models/__init__.py b/mrp_multi_level/models/__init__.py new file mode 100644 index 000000000..353d6e3ed --- /dev/null +++ b/mrp_multi_level/models/__init__.py @@ -0,0 +1,6 @@ +from . import mrp_area +from . import stock_location +from . import product +from . import mrp_product +from . import mrp_move +from . import mrp_inventory diff --git a/mrp_multi_level/models/mrp_area.py b/mrp_multi_level/models/mrp_area.py new file mode 100644 index 000000000..2111dcd4a --- /dev/null +++ b/mrp_multi_level/models/mrp_area.py @@ -0,0 +1,19 @@ +# © 2016 Ucamco - Wim Audenaert +# © 2016 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class MrpArea(models.Model): + _name = 'mrp.area' + + name = fields.Char('Name') + warehouse_id = fields.Many2one( + comodel_name='stock.warehouse', string='Warehouse', + required=True) + location_id = fields.Many2one( + comodel_name='stock.location', string='Location', + required=True) + active = fields.Boolean(default=True) diff --git a/mrp_multi_level/models/mrp_inventory.py b/mrp_multi_level/models/mrp_inventory.py new file mode 100644 index 000000000..d0bf1be91 --- /dev/null +++ b/mrp_multi_level/models/mrp_inventory.py @@ -0,0 +1,44 @@ +# © 2016 Ucamco - Wim Audenaert +# Copyright 2016-18 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class MrpInventory(models.Model): + _name = 'mrp.inventory' + _order = 'mrp_product_id, date' + _description = 'MRP inventory projections' + _rec_name = 'mrp_product_id' + + # TODO: uom?? + # TODO: name to pass to procurements? + # TODO: compute procurement_date to pass to the wizard? not needed for PO at least. Check for MO and moves + # TODO: substract qty already procured. + # TODO: show a LT based on the procure method? + # TODO: add to_procure_date + + mrp_area_id = fields.Many2one( + comodel_name='mrp.area', string='MRP Area', + related='mrp_product_id.mrp_area_id', + ) + mrp_product_id = fields.Many2one( + comodel_name='mrp.product', string='Product', + index=True, + ) + uom_id = fields.Many2one( + comodel_name='product.uom', string='Product UoM', + compute='_compute_uom_id', + ) + date = fields.Date(string='Date') + demand_qty = fields.Float(string='Demand') + supply_qty = fields.Float(string='Supply') + initial_on_hand_qty = fields.Float(string='Starting Inventory') + final_on_hand_qty = fields.Float(string='Forecasted Inventory') + to_procure = fields.Float(string='To procure') + + @api.multi + def _compute_uom_id(self): + for rec in self: + rec.uom_id = rec.mrp_product_id.product_id.uom_id diff --git a/mrp_multi_level/models/mrp_move.py b/mrp_multi_level/models/mrp_move.py new file mode 100644 index 000000000..126d08741 --- /dev/null +++ b/mrp_multi_level/models/mrp_move.py @@ -0,0 +1,173 @@ +# © 2016 Ucamco - Wim Audenaert +# © 2016-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import models, fields, api, _ +from odoo import exceptions + + +class MrpMove(models.Model): + _name = 'mrp.move' + _order = 'mrp_product_id, mrp_date, mrp_type desc, id' + + # TODO: too many indexes... + + mrp_area_id = fields.Many2one('mrp.area', 'MRP Area') + current_date = fields.Date('Current Date') + current_qty = fields.Float('Current Qty') + # TODO: remove purchase request and move to other module? + # TODO: cancel is not needed I think... + mrp_action = fields.Selection( + selection=[('mo', 'Manufacturing Order'), + ('po', 'Purchase Order'), + ('pr', 'Purchase Request'), + ('so', 'Sale Order'), + ('cancel', 'Cancel'), + ('none', 'None')], + string='Action', + ) + mrp_action_date = fields.Date('MRP Action Date') + mrp_date = fields.Date('MRP Date') + mrp_move_down_ids = fields.Many2many( + comodel_name='mrp.move', + relation='mrp_move_rel', + column1='move_up_id', + column2='move_down_id', + string='MRP Move DOWN', + ) + mrp_move_up_ids = fields.Many2many( + comodel_name='mrp.move', + relation='mrp_move_rel', + column1='move_down_id', + column2='move_up_id', + string='MRP Move UP', + ) + mrp_minimum_stock = fields.Float( + string='Minimum Stock', + related='product_id.mrp_minimum_stock', + ) + mrp_order_number = fields.Char('Order Number') + # TODO: move purchase request to another module + mrp_origin = fields.Selection( + selection=[('mo', 'Manufacturing Order'), + ('po', 'Purchase Order'), + ('pr', 'Purchase Request'), + ('so', 'Sale Order'), + ('mv', 'Move'), + ('fc', 'Forecast'), ('mrp', 'MRP')], + string='Origin') + mrp_processed = fields.Boolean('Processed') + mrp_product_id = fields.Many2one('mrp.product', 'Product', index=True) + mrp_qty = fields.Float('MRP Quantity') + mrp_type = fields.Selection( + selection=[('s', 'Supply'), ('d', 'Demand')], + string='Type', + ) + name = fields.Char('Description') + parent_product_id = fields.Many2one( + comodel_name='product.product', + string='Parent Product', index=True, + ) + product_id = fields.Many2one('product.product', + 'Product', index=True) + production_id = fields.Many2one('mrp.production', + 'Manufacturing Order', index=True) + purchase_line_id = fields.Many2one('purchase.order.line', + 'Purchase Order Line', index=True) + purchase_order_id = fields.Many2one('purchase.order', + 'Purchase Order', index=True) + running_availability = fields.Float('Running Availability') + sale_line_id = fields.Many2one('sale.order.line', + 'Sale Order Line', index=True) + sale_order_id = fields.Many2one('sale.order', 'Sale Order', index=True) + state = fields.Selection( + selection=[('draft', 'Draft'), + ('assigned', 'Assigned'), + ('confirmed', 'Confirmed'), + ('waiting', 'Waiting'), + ('partially_available', 'Partially Available'), + ('ready', 'Ready'), + ('sent', 'Sent'), + ('to approve', 'To Approve'), + ('approved', 'Approved')], + string='State', + ) + stock_move_id = fields.Many2one('stock.move', 'Stock Move', index=True) + + @api.model + def mrp_production_prepare(self, bom_id, routing_id): + return { + 'product_uos_qty': 0.00, + 'product_uom': self.product_id.product_tmpl_id.uom_id.id, + 'product_qty': self.mrp_qty, + 'product_id': self.product_id.id, + 'location_src_id': 12, + 'date_planned': self.mrp_date, + 'cycle_total': 0.00, + 'company_id': 1, + 'state': 'draft', + 'hour_total': 0.00, + 'bom_id': bom_id, + 'routing_id': routing_id, + 'allow_reorder': False + } + + @api.model + def mrp_process_mo(self): + if self.mrp_action != 'mo': + return True + bom_id = False + routing_id = False + mrp_boms = self.env['mrp.bom'].search( + [('product_id', '=', self.product_id.id), + ('type', '=', 'normal')], limit=1) + for mrp_bom in mrp_boms: + bom_id = mrp_bom.id + routing_id = mrp_bom.routing_id.id + + if self.product_id.track_production and self.mrp_qty > 1: + raise exceptions.Warning(_('Not allowed to create ' + 'manufacturing order with ' + 'quantity higher than 1 ' + 'for serialized product')) + else: + production_data = self.mrp_production_prepare(bom_id, routing_id) + pr = self.env['mrp.production'].create(production_data) + self.production_id = pr.id + self.current_qty = self.mrp_qty + self.current_date = self.mrp_date + self.mrp_processed = True + self.name = pr.name + + # TODO: extension to purchase requisition in other module? + @api.model + def mrp_process_pr(self): + if self.mrp_action != 'pr': + return True + seq = self.env['ir.sequence'].search( + [('code', '=', 'purchase.order.requisition')]) + seqnbr = self.env['ir.sequence'].next_by_id(seq.id) + self.env['purchase.requisition'].create({ + 'origin': 'MRP - [' + self.product_id.default_code + '] ' + + self.product_id.name, + 'exclusive': 'exclusive', + 'message_follower_ids': False, + 'date_end': False, + 'date_start': self.mrp_date, + 'company_id': 1, + 'warehouse_id': 1, + 'state': 'draft', + 'line_ids': [[0, False, + {'product_uom_id': + self.product_id.product_tmpl_id.uom_id.id, + 'product_id': self.product_id.id, + 'product_qty': self.mrp_qty, + 'name': self.product_id.name}]], + 'message_ids': False, + 'description': False, + 'name': seqnbr + }) + self.current_qty = self.mrp_qty + self.current_date = self.mrp_date + self.mrp_processed = True + self.name = seqnbr diff --git a/mrp_multi_level/models/mrp_product.py b/mrp_multi_level/models/mrp_product.py new file mode 100644 index 000000000..3572c6608 --- /dev/null +++ b/mrp_multi_level/models/mrp_product.py @@ -0,0 +1,119 @@ +# © 2016 Ucamco - Wim Audenaert +# © 2016-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class MrpProduct(models.Model): + _name = 'mrp.product' + + mrp_area_id = fields.Many2one( + comodel_name='mrp.area', string='MRP Area', + ) + current_qty_available = fields.Float( + string='Current Qty Available', + related='product_id.qty_available', + ) + main_supplier_id = fields.Many2one( + comodel_name='res.partner', string='Main Supplier', + compute='_compute_main_supplier', store=True, + index=True, + ) + mrp_inspection_delay = fields.Integer( + string='Inspection Delay', related='product_id.mrp_inspection_delay') + mrp_lead_time = fields.Float( + string='Lead Time', + related='product_id.produce_delay', + ) + mrp_llc = fields.Integer( + string='Low Level Code', index=True, readonly=True, + ) + # TODO: minimun stock and max/min order qty assigned by area? + mrp_maximum_order_qty = fields.Float( + string='Maximum Order Qty', related='product_id.mrp_maximum_order_qty', + ) + mrp_minimum_order_qty = fields.Float( + string='Minimum Order Qty', related='product_id.mrp_minimum_order_qty', + ) + mrp_minimum_stock = fields.Float( + string='Minimum Stock', + related='product_id.mrp_minimum_stock', + ) + mrp_move_ids = fields.One2many( + comodel_name='mrp.move', inverse_name='mrp_product_id', + string='MRP Moves', + ) + mrp_nbr_days = fields.Integer( + string='Nbr. Days', related='product_id.mrp_nbr_days') + mrp_qty_available = fields.Float('MRP Qty Available') + mrp_qty_multiple = fields.Float(string='Qty Multiple', + related='product_id.mrp_qty_multiple') + # TODO: this was: mrp_transit_delay = fields.Integer(mrp_move_ids) ??¿?¿¿? + mrp_transit_delay = fields.Integer(related='product_id.mrp_transit_delay') + mrp_verified = fields.Boolean(string='MRP Verified', + related='product_id.mrp_verified') + name = fields.Char('Description') + # TODO: rename to mrp_action_count? + nbr_mrp_actions = fields.Integer( + string='Nbr Actions', index=True, + ) + nbr_mrp_actions_4w = fields.Integer( + string='Nbr Actions 4 Weeks', index=True, + ) + product_id = fields.Many2one( + comodel_name='product.product', string='Product', + index=True, + ) + product_tmpl_id = fields.Many2one('product.template', 'Product Template', + related='product_id.product_tmpl_id') + # TODO: extension to purchase requisition in other module? + # purchase_requisition = fields.Boolean(string='Purchase Requisition', + # related='product_id.purchase_requisition') + supply_method = fields.Selection( + selection=[('buy', 'Buy'), + ('none', 'Undefined'), + ('manufacture', 'Produce'), + ('move', 'Transfer')], + string='Supply Method', + compute='_compute_supply_method', store=True, + ) + + @api.multi + @api.depends('mrp_area_id') + def _compute_supply_method(self): + group_obj = self.env['procurement.group'] + for rec in self: + values = { + 'warehouse_id': rec.mrp_area_id.warehouse_id, + 'company_id': self.env.user.company_id.id, # TODO: better way to get company + } + rule = group_obj._get_rule( + rec.product_id, rec.mrp_area_id.location_id, values) + rec.supply_method = rule.action if rule else 'none' + + @api.multi + @api.depends('supply_method') + def _compute_main_supplier(self): + """Simplified and similar to procurement.rule logic.""" + for rec in self.filtered(lambda r: r.supply_method == 'buy'): + suppliers = rec.product_id.seller_ids.filtered( + lambda r: (not r.product_id or r.product_id == rec.product_id)) + if not suppliers: + continue + rec.main_supplier_id = suppliers[0].name + + @api.multi + def _adjust_qty_to_order(self, qty_to_order): + # TODO: consider mrp_qty_multiple? + self.ensure_one() + if not self.mrp_maximum_order_qty and not self.mrp_minimum_order_qty: + return qty_to_order + if qty_to_order < self.mrp_minimum_order_qty: + return self.mrp_minimum_order_qty + if self.mrp_maximum_order_qty and qty_to_order > \ + self.mrp_maximum_order_qty: + qty = self.mrp_maximum_order_qty + else: + qty = qty_to_order + return qty diff --git a/mrp_multi_level/models/product.py b/mrp_multi_level/models/product.py new file mode 100644 index 000000000..21eb147b6 --- /dev/null +++ b/mrp_multi_level/models/product.py @@ -0,0 +1,47 @@ +# © 2016 Ucamco - Wim Audenaert +# © 2016 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class Product(models.Model): + _inherit = 'product.product' + + llc = fields.Integer('Low Level Code', default=0) + manufacturing_order_ids = fields.One2many( + comodel_name='mrp.production', + inverse_name='product_id', + string='Manufacturing Orders', + domain=[('state', '=', 'draft')], + ) + mrp_applicable = fields.Boolean('MRP Applicable') + mrp_exclude = fields.Boolean('Exclude from MRP') + mrp_inspection_delay = fields.Integer('Inspection Delay', default=0) + mrp_maximum_order_qty = fields.Float( + string='Maximum Order Qty', default=0.0, + ) + mrp_minimum_order_qty = fields.Float( + string='Minimum Order Qty', default=0.0, + ) + mrp_minimum_stock = fields.Float('Minimum Stock') + mrp_nbr_days = fields.Integer( + string='Nbr. Days', default=0, + help="Number of days to group demand for this product during the " + "MRP run, in order to determine the quantity to order.", + ) + mrp_product_ids = fields.One2many('mrp.product', + 'product_id', 'MRP Product data') + mrp_qty_multiple = fields.Float('Qty Multiple', default=1.00) + mrp_transit_delay = fields.Integer('Transit Delay', default=0) + mrp_verified = fields.Boolean('Verified for MRP', + help="Identifies that this product has " + "been verified to be valid for the " + "MRP.") + purchase_order_line_ids = fields.One2many('purchase.order.line', + 'product_id', 'Purchase Orders') + # TODO: extension to purchase requisition in other module? + # purchase_requisition_ids = fields.One2many('purchase.requisition.line', + # 'product_id', + # 'Purchase Requisitions') diff --git a/mrp_multi_level/models/stock_location.py b/mrp_multi_level/models/stock_location.py new file mode 100644 index 000000000..3a6957b7f --- /dev/null +++ b/mrp_multi_level/models/stock_location.py @@ -0,0 +1,16 @@ +# © 2016 Ucamco - Wim Audenaert +# © 2016 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class StockLocation(models.Model): + _inherit = 'stock.location' + + mrp_area_id = fields.Many2one( + comodel_name='mrp.area', string='MRP Area', + help="Requirements for a particular MRP area are combined for the " + "purposes of procurement by the MRP.", + ) diff --git a/mrp_multi_level/security/ir.model.access.csv b/mrp_multi_level/security/ir.model.access.csv new file mode 100644 index 000000000..2e2cafd52 --- /dev/null +++ b/mrp_multi_level/security/ir.model.access.csv @@ -0,0 +1,9 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_mrp_inventory_user,mrp.inventory user,model_mrp_inventory,mrp.group_mrp_user,1,0,0,0 +access_mrp_inventory_manager,mrp.inventory manager,model_mrp_inventory,mrp.group_mrp_manager,1,1,1,1 +access_mrp_move_user,mrp.move user,model_mrp_move,mrp.group_mrp_user,1,0,0,0 +access_mrp_move_manager,mrp.move manager,model_mrp_move,mrp.group_mrp_manager,1,1,1,1 +access_mrp_product_user,mrp.product user,model_mrp_product,base.group_user,1,0,0,0 +access_mrp_product_manager,mrp.product manager,model_mrp_product,mrp.group_mrp_manager,1,1,1,1 +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 diff --git a/mrp_multi_level/security/mrp_multi_level_security.xml b/mrp_multi_level/security/mrp_multi_level_security.xml new file mode 100644 index 000000000..13a2bedb7 --- /dev/null +++ b/mrp_multi_level/security/mrp_multi_level_security.xml @@ -0,0 +1,10 @@ + + + + + Change procure quantity in MRP + + + + + diff --git a/mrp_multi_level/static/src/img/icon.png b/mrp_multi_level/static/src/img/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/mrp_multi_level/tests/__init__.py b/mrp_multi_level/tests/__init__.py new file mode 100644 index 000000000..aa6799388 --- /dev/null +++ b/mrp_multi_level/tests/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from . import test_mrp_multi_level diff --git a/mrp_multi_level/tests/test_mrp_multi_level.py b/mrp_multi_level/tests/test_mrp_multi_level.py new file mode 100644 index 000000000..7603218ce --- /dev/null +++ b/mrp_multi_level/tests/test_mrp_multi_level.py @@ -0,0 +1,366 @@ +# Copyright 2018 Eficent Business and IT Consulting Services S.L. +# (http://www.eficent.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from datetime import date, datetime, timedelta + +from odoo.tests.common import SavepointCase +from odoo import fields +from dateutil.rrule import WEEKLY + + +class TestMrpMultiLevel(SavepointCase): + + @classmethod + def setUpClass(cls): + super(TestMrpMultiLevel, cls).setUpClass() + cls.mo_obj = cls.env['mrp.production'] + cls.po_obj = cls.env['purchase.order'] + cls.product_obj = cls.env['product.product'] + cls.partner_obj = cls.env['res.partner'] + cls.stock_picking_obj = cls.env['stock.picking'] + cls.estimate_obj = cls.env['stock.demand.estimate'] + cls.mrp_multi_level_wiz = cls.env['mrp.multi.level'] + cls.mrp_inventory_procure_wiz = cls.env['mrp.inventory.procure'] + cls.mrp_inventory_obj = cls.env['mrp.inventory'] + cls.mrp_product_obj = cls.env['mrp.product'] + cls.mrp_move_obj = cls.env['mrp.move'] + + cls.fp_1 = cls.env.ref('mrp_multi_level.product_product_fp_1') + cls.fp_2 = cls.env.ref('mrp_multi_level.product_product_fp_2') + cls.sf_1 = cls.env.ref('mrp_multi_level.product_product_sf_1') + cls.sf_2 = cls.env.ref('mrp_multi_level.product_product_sf_2') + cls.pp_1 = cls.env.ref('mrp_multi_level.product_product_pp_1') + cls.pp_2 = cls.env.ref('mrp_multi_level.product_product_pp_2') + cls.vendor = cls.env.ref('mrp_multi_level.res_partner_lazer_tech') + cls.wh = cls.env.ref('stock.warehouse0') + cls.stock_location = cls.wh.lot_stock_id + cls.customer_location = cls.env.ref( + 'stock.stock_location_customers') + + # Partner: + vendor1 = cls.partner_obj.create({'name': 'Vendor 1'}) + + # Create products: + route_buy = cls.env.ref('purchase.route_warehouse0_buy').id + cls.prod_test = cls.product_obj.create({ + 'name': 'Test Top Seller', + 'type': 'product', + 'list_price': 150.0, + 'produce_delay': 5.0, + 'route_ids': [(6, 0, [route_buy])], + 'seller_ids': [(0, 0, {'name': vendor1.id, 'price': 20.0})], + }) + + # Create test picking: + date_move = datetime.today() + timedelta(days=7) + cls.picking_1 = cls.stock_picking_obj.create({ + 'picking_type_id': cls.env.ref('stock.picking_type_out').id, + 'location_id': cls.stock_location.id, + 'location_dest_id': cls.customer_location.id, + 'move_lines': [ + (0, 0, { + 'name': 'Test move fp-1', + 'product_id': cls.fp_1.id, + 'date_expected': date_move, + 'date': date_move, + 'product_uom': cls.fp_1.uom_id.id, + 'product_uom_qty': 100, + 'location_id': cls.stock_location.id, + 'location_dest_id': cls.customer_location.id + }), + (0, 0, { + 'name': 'Test move fp-2', + 'product_id': cls.fp_2.id, + 'date_expected': date_move, + 'date': date_move, + 'product_uom': cls.fp_2.uom_id.id, + 'product_uom_qty': 15, + 'location_id': cls.stock_location.id, + 'location_dest_id': cls.customer_location.id + })] + }) + cls.picking_1.action_confirm() + + # Create Test PO: + date_po = datetime.today() + timedelta(days=1) + cls.po = cls.po_obj.create({ + 'name': 'Test PO-001', + 'partner_id': cls.vendor.id, + 'order_line': [ + (0, 0, { + 'name': 'Test PP-2 line', + 'product_id': cls.pp_2.id, + 'date_planned': date_po, + 'product_qty': 5.0, + 'product_uom': cls.pp_2.uom_id.id, + 'price_unit': 25.0, + })], + }) + + # Create test MO: + date_mo = datetime.today() + timedelta(days=9) + bom_fp_2 = cls.env.ref('mrp_multi_level.mrp_bom_fp_2') + cls.mo = cls.mo_obj.create({ + 'product_id': cls.fp_2.id, + 'bom_id': bom_fp_2.id, + 'product_qty': 12.0, + 'product_uom_id': cls.fp_2.uom_id.id, + 'date_planned_start': date_mo, + }) + + # Dates (Strings): + today = datetime.today() + cls.date_3 = fields.Date.to_string(today + timedelta(days=3)) + cls.date_5 = fields.Date.to_string(today + timedelta(days=5)) + cls.date_6 = fields.Date.to_string(today + timedelta(days=6)) + cls.date_7 = fields.Date.to_string(today + timedelta(days=7)) + cls.date_8 = fields.Date.to_string(today + timedelta(days=8)) + cls.date_9 = fields.Date.to_string(today + timedelta(days=9)) + cls.date_10 = fields.Date.to_string(today + timedelta(days=10)) + + # Create Date Ranges: + cls.dr_type = cls.env['date.range.type'].create({ + 'name': 'Weeks', + 'company_id': False, + 'allow_overlap': False, + }) + generator = cls.env['date.range.generator'].create({ + 'date_start': today - timedelta(days=3), + 'name_prefix': 'W-', + 'type_id': cls.dr_type.id, + 'duration_count': 1, + 'unit_of_time': WEEKLY, + 'count': 3}) + generator.action_apply() + + # Create Demand Estimates: + ranges = cls.env['date.range'].search( + [('type_id', '=', cls.dr_type.id)]) + qty = 140.0 + for dr in ranges: + qty += 70.0 + cls._create_demand_estimate( + cls.prod_test, cls.stock_location, dr, qty) + + cls.mrp_multi_level_wiz.create({}).run_mrp_multi_level() + + @classmethod + def _create_demand_estimate(cls, product, location, date_range, qty): + cls.estimate_obj.create({ + 'product_id': product.id, + 'location_id': location.id, + 'product_uom': product.uom_id.id, + 'product_uom_qty': qty, + 'date_range_id': date_range.id, + }) + + def test_01_mrp_levels(self): + """Tests computation of MRP levels.""" + self.assertEqual(self.fp_1.llc, 0) + self.assertEqual(self.fp_2.llc, 0) + self.assertEqual(self.sf_1.llc, 1) + self.assertEqual(self.sf_2.llc, 1) + self.assertEqual(self.pp_1.llc, 2) + self.assertEqual(self.pp_2.llc, 2) + + def test_02_mrp_product(self): + """Tests that mrp products are generated correctly.""" + mrp_product = self.mrp_product_obj.search([ + ('product_id', '=', self.pp_1.id)]) + self.assertEqual(mrp_product.supply_method, 'buy') + self.assertEqual(mrp_product.main_supplier_id, self.vendor) + self.assertEqual(mrp_product.mrp_qty_available, 10.0) + mrp_product = self.mrp_product_obj.search([ + ('product_id', '=', self.sf_1.id)]) + self.assertEqual(mrp_product.supply_method, 'manufacture') + + def test_03_mrp_moves(self): + """Tests for mrp moves generated.""" + moves = self.mrp_move_obj.search([ + ('product_id', '=', self.pp_1.id), + ('mrp_action', '=', 'none'), + ]) + self.assertEqual(len(moves), 3) + self.assertNotIn('s', moves.mapped('mrp_type')) + for move in moves: + self.assertTrue(move.mrp_move_up_ids) + if move.mrp_move_up_ids.mrp_product_id.product_id == self.fp_1: + # Demand coming from FP-1 + self.assertEqual(move.mrp_move_up_ids.mrp_action, 'mo') + self.assertEqual(move.mrp_qty, -200.0) + elif move.mrp_move_up_ids.mrp_product_id.product_id == self.sf_1: + # Demand coming from FP-2 -> SF-1 + self.assertEqual(move.mrp_move_up_ids.mrp_action, 'mo') + if move.mrp_date == self.date_5: + self.assertEqual(move.mrp_qty, -90.0) + elif move.mrp_date == self.date_8: + self.assertEqual(move.mrp_qty, -72.0) + # Check actions: + moves = self.mrp_move_obj.search([ + ('product_id', '=', self.pp_1.id), + ('mrp_action', '!=', 'none'), + ]) + self.assertEqual(len(moves), 3) + for move in moves: + self.assertEqual(move.mrp_action, 'po') + self.assertEqual(move.mrp_type, 's') + # Check PP-2 PO being accounted: + po_move = self.mrp_move_obj.search([ + ('product_id', '=', self.pp_2.id), + ('mrp_action', '=', 'none'), + ('mrp_type', '=', 's'), + ]) + self.assertEqual(len(po_move), 1) + self.assertEqual(po_move.purchase_order_id, self.po) + self.assertEqual(po_move.purchase_line_id, self.po.order_line) + + def test_04_mrp_multi_level(self): + """Tests MRP inventories created.""" + # FP-1 + fp_1_inventory_lines = self.mrp_inventory_obj.search( + [('mrp_product_id.product_id', '=', self.fp_1.id)]) + self.assertEqual(len(fp_1_inventory_lines), 1) + self.assertEqual(fp_1_inventory_lines.date, self.date_7) + self.assertEqual(fp_1_inventory_lines.demand_qty, 100.0) + self.assertEqual(fp_1_inventory_lines.to_procure, 100.0) + # FP-2 + fp_2_line_1 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.fp_2.id), + ('date', '=', self.date_7)]) + self.assertEqual(len(fp_2_line_1), 1) + self.assertEqual(fp_2_line_1.demand_qty, 15.0) + self.assertEqual(fp_2_line_1.to_procure, 15.0) + # TODO: ask odoo to fix it... should be date10 + fp_2_line_2 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.fp_2.id), + ('date', '=', self.date_9)]) + self.assertEqual(len(fp_2_line_2), 1) + self.assertEqual(fp_2_line_2.demand_qty, 0.0) + self.assertEqual(fp_2_line_2.to_procure, 0.0) + self.assertEqual(fp_2_line_2.supply_qty, 12.0) + + # SF-1 + sf_1_line_1 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.sf_1.id), + ('date', '=', self.date_6)]) + self.assertEqual(len(sf_1_line_1), 1) + self.assertEqual(sf_1_line_1.demand_qty, 30.0) + self.assertEqual(sf_1_line_1.to_procure, 30.0) + sf_1_line_2 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.sf_1.id), + ('date', '=', self.date_9)]) + self.assertEqual(len(sf_1_line_2), 1) + self.assertEqual(sf_1_line_2.demand_qty, 24.0) + self.assertEqual(sf_1_line_2.to_procure, 24.0) + # SF-2 + sf_2_line_1 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.sf_2.id), + ('date', '=', self.date_6)]) + self.assertEqual(len(sf_2_line_1), 1) + self.assertEqual(sf_2_line_1.demand_qty, 45.0) + self.assertEqual(sf_2_line_1.to_procure, 30.0) + sf_2_line_2 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.sf_2.id), + ('date', '=', self.date_9)]) + self.assertEqual(len(sf_2_line_2), 1) + self.assertEqual(sf_2_line_2.demand_qty, 36.0) + self.assertEqual(sf_2_line_2.to_procure, 36.0) + + # PP-1 + pp_1_line_1 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.pp_1.id), + ('date', '=', self.date_5)]) + self.assertEqual(len(pp_1_line_1), 1) + self.assertEqual(pp_1_line_1.demand_qty, 290.0) + self.assertEqual(pp_1_line_1.to_procure, 280.0) + pp_1_line_2 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.pp_1.id), + ('date', '=', self.date_8)]) + self.assertEqual(len(pp_1_line_2), 1) + self.assertEqual(pp_1_line_2.demand_qty, 72.0) + self.assertEqual(pp_1_line_2.to_procure, 72.0) + # PP-2 + pp_2_line_1 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.pp_2.id), + ('date', '=', self.date_3)]) + self.assertEqual(len(pp_2_line_1), 1) + self.assertEqual(pp_2_line_1.demand_qty, 90.0) + # 90.0 demand - 20.0 on hand - 5.0 on PO = 65.0 + self.assertEqual(pp_2_line_1.to_procure, 65.0) + pp_2_line_2 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.pp_2.id), + ('date', '=', self.date_5)]) + self.assertEqual(len(pp_2_line_2), 1) + self.assertEqual(pp_2_line_2.demand_qty, 360.0) + self.assertEqual(pp_2_line_2.to_procure, 360.0) + pp_2_line_3 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.pp_2.id), + ('date', '=', self.date_6)]) + self.assertEqual(len(pp_2_line_3), 1) + self.assertEqual(pp_2_line_3.demand_qty, 108.0) + self.assertEqual(pp_2_line_3.to_procure, 108.0) + pp_2_line_4 = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.pp_2.id), + ('date', '=', self.date_8)]) + self.assertEqual(len(pp_2_line_4), 1) + self.assertEqual(pp_2_line_4.demand_qty, 48.0) + self.assertEqual(pp_2_line_4.to_procure, 48.0) + + def test_05_moves_extra_info(self): + """Test running availability and actions counters computation on + mrp moves.""" + # Running availability for PP-1: + moves = self.mrp_move_obj.search([ + ('product_id', '=', self.pp_1.id)], + order='mrp_date, mrp_type desc, id') + self.assertEqual(len(moves), 6) + expected = [200.0, 290.0, 90.0, 0.0, 72.0, 0.0] + self.assertEqual(moves.mapped('running_availability'), expected) + # Actions counters for PP-1: + mrp_product = self.mrp_product_obj.search([ + ('product_id', '=', self.pp_1.id) + ]) + self.assertEqual(mrp_product.nbr_mrp_actions, 3) + self.assertEqual(mrp_product.nbr_mrp_actions_4w, 3) + + def test_06_demand_estimates(self): + """Tests demand estimates integration.""" + estimates = self.estimate_obj.search( + [('product_id', '=', self.prod_test.id)]) + self.assertEqual(len(estimates), 3) + moves = self.mrp_move_obj.search([ + ('product_id', '=', self.prod_test.id), + ]) + # 3 weeks - 3 days in the past = 18 days of valid estimates: + moves_from_estimates = moves.filtered(lambda m: m.mrp_type == 'd') + self.assertEqual(len(moves_from_estimates), 18) + quantities = moves_from_estimates.mapped('mrp_qty') + self.assertIn(-30.0, quantities) # 210 a week => 30.0 dayly: + self.assertIn(-40.0, quantities) # 280 a week => 40.0 dayly: + self.assertIn(-50.0, quantities) # 350 a week => 50.0 dayly: + actions = moves.filtered(lambda m: m.mrp_action == 'po') + self.assertEqual(len(actions), 18) + + def test_07_procure_mo(self): + """Test procurement wizard with MOs.""" + mos = self.mo_obj.search([ + ('product_id', '=', self.fp_1.id)]) + self.assertFalse(mos) + mrp_inv = self.mrp_inventory_obj.search([ + ('mrp_product_id.product_id', '=', self.fp_1.id)]) + self.mrp_inventory_procure_wiz.with_context({ + 'active_model': 'mrp.inventory', + 'active_ids': mrp_inv.ids, + 'active_id': mrp_inv.id, + }).create({}).make_procurement() + mos = self.mo_obj.search([ + ('product_id', '=', self.fp_1.id)]) + self.assertTrue(mos) + self.assertEqual(mos.product_qty, 100.0) + datetime_5 = fields.Datetime.to_string( + date.today() + timedelta(days=5)) + self.assertEqual(mos.date_planned_start, datetime_5) + + # TODO: test procure wizard: pos, multiple... + # TODO: test multiple destination IDS:... \ No newline at end of file diff --git a/mrp_multi_level/views/mrp_area_view.xml b/mrp_multi_level/views/mrp_area_view.xml new file mode 100644 index 000000000..9bc182e0f --- /dev/null +++ b/mrp_multi_level/views/mrp_area_view.xml @@ -0,0 +1,60 @@ + + + + + mrp.area.tree + mrp.area + form + + + + + + + + + + + mrp.area.form + mrp.area + form + +
+ + + + + + + + + + +
+
+
+ + + + MRP Area + mrp.area + ir.actions.act_window + form + tree,form + + + + + + form + + + + + + tree + + + + +
diff --git a/mrp_multi_level/views/mrp_inventory_view.xml b/mrp_multi_level/views/mrp_inventory_view.xml new file mode 100644 index 000000000..b536e831a --- /dev/null +++ b/mrp_multi_level/views/mrp_inventory_view.xml @@ -0,0 +1,97 @@ + + + + + mrp.inventory.form + mrp.inventory + form + +
+ + + + + + + + + + +
+
+
+ + + mrp.inventory.tree + mrp.inventory + form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + product.mrp.area.search + product.mrp.area + search + + + + + + + + + + + + + Product MRP Area Parameters + product.mrp.area + ir.actions.act_window + form + tree,form + + + + +
diff --git a/mrp_multi_level/views/product_product_view.xml b/mrp_multi_level/views/product_product_view.xml deleted file mode 100644 index 8bb1aed12..000000000 --- a/mrp_multi_level/views/product_product_view.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - view.mrp.product.product.form - product.product - - form - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mrp_multi_level/views/product_product_views.xml b/mrp_multi_level/views/product_product_views.xml new file mode 100644 index 000000000..65014f376 --- /dev/null +++ b/mrp_multi_level/views/product_product_views.xml @@ -0,0 +1,22 @@ + + + + + view.product.mrp.area.product.form + product.product + + form + +
+ +
+
+
+
diff --git a/mrp_multi_level/views/product_template_view.xml b/mrp_multi_level/views/product_template_view.xml deleted file mode 100644 index 97a45f396..000000000 --- a/mrp_multi_level/views/product_template_view.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - product.template.product.form.mrp - product.template - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mrp_multi_level/views/product_template_views.xml b/mrp_multi_level/views/product_template_views.xml new file mode 100644 index 000000000..843413d55 --- /dev/null +++ b/mrp_multi_level/views/product_template_views.xml @@ -0,0 +1,22 @@ + + + + + product.template.product.form.mrp + product.template + + +
+ +
+
+
+ +
diff --git a/mrp_multi_level/views/stock_location_view.xml b/mrp_multi_level/views/stock_location_views.xml similarity index 100% rename from mrp_multi_level/views/stock_location_view.xml rename to mrp_multi_level/views/stock_location_views.xml diff --git a/mrp_multi_level/wizards/mrp_inventory_procure.py b/mrp_multi_level/wizards/mrp_inventory_procure.py index 14b3bf6be..57fe8df8c 100644 --- a/mrp_multi_level/wizards/mrp_inventory_procure.py +++ b/mrp_multi_level/wizards/mrp_inventory_procure.py @@ -23,7 +23,7 @@ class MrpInventoryProcure(models.TransientModel): 'uom_id': mrp_inventory.uom_id.id, 'date_planned': mrp_inventory.date, 'mrp_inventory_id': mrp_inventory.id, - 'product_id': mrp_inventory.mrp_product_id.product_id.id, + 'product_id': mrp_inventory.product_mrp_area_id.product_id.id, 'warehouse_id': mrp_inventory.mrp_area_id.warehouse_id.id, 'location_id': mrp_inventory.mrp_area_id.location_id.id, } @@ -57,12 +57,12 @@ class MrpInventoryProcure(models.TransientModel): items = item_obj = self.env['mrp.inventory.procure.item'] for line in mrp_inventory_obj.browse(mrp_inventory_ids): - max_order = line.mrp_product_id.mrp_maximum_order_qty + max_order = line.product_mrp_area_id.mrp_maximum_order_qty qty_to_order = line.to_procure if max_order and max_order < qty_to_order: # split the procurement in batches: while qty_to_order > 0.0: - qty = line.mrp_product_id._adjust_qty_to_order( + qty = line.product_mrp_area_id._adjust_qty_to_order( qty_to_order) items += item_obj.create(self._prepare_item(line, qty)) qty_to_order -= qty diff --git a/mrp_multi_level/wizards/mrp_inventory_procure_view.xml b/mrp_multi_level/wizards/mrp_inventory_procure_views.xml similarity index 100% rename from mrp_multi_level/wizards/mrp_inventory_procure_view.xml rename to mrp_multi_level/wizards/mrp_inventory_procure_views.xml diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 4244977de..16269844f 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -17,38 +17,37 @@ class MultiLevelMrp(models.TransientModel): # TODO: dates are not being correctly computed for supply... @api.model - def _prepare_mrp_product_data(self, product, mrp_area): + def _prepare_product_mrp_area_data(self, product_mrp_area): qty_available = 0.0 product_obj = self.env['product.product'] # TODO: move mrp_qty_available computation, maybe unreserved?? location_ids = self.env['stock.location'].search( - [('id', 'child_of', mrp_area.location_id.id)]) + [('id', 'child_of', product_mrp_area.mrp_area_id.location_id.id)]) for location in location_ids: product_l = product_obj.with_context( - {'location': location.id}).browse(product.id) + {'location': location.id}).browse( + product_mrp_area.product_id.id) qty_available += product_l.qty_available return { - 'mrp_area_id': mrp_area.id, - 'product_id': product.id, - 'mrp_qty_available': product.qty_available, - 'mrp_llc': product.llc, - 'name': '[%s] %s' % (mrp_area.name, product.display_name), + 'product_mrp_area_id': product_mrp_area.id, + 'mrp_qty_available': qty_available, + 'mrp_llc': product_mrp_area.product_id.llc, } @api.model def _prepare_mrp_move_data_from_forecast( - self, estimate, mrp_product, date): + self, estimate, product_mrp_area, date): mrp_type = 'd' origin = 'fc' daily_qty = float_round( estimate.daily_qty, - precision_rounding=mrp_product.product_id.uom_id.rounding, + precision_rounding=product_mrp_area.product_id.uom_id.rounding, rounding_method='HALF-UP') return { - 'mrp_area_id': mrp_product.mrp_area_id.id, - 'product_id': mrp_product.product_id.id, - 'mrp_product_id': mrp_product.id, + 'mrp_area_id': product_mrp_area.mrp_area_id.id, + 'product_id': product_mrp_area.product_id.id, + 'product_mrp_area_id': product_mrp_area.id, 'production_id': None, 'purchase_order_id': None, 'purchase_line_id': None, @@ -70,7 +69,7 @@ class MultiLevelMrp(models.TransientModel): @api.model def _prepare_mrp_move_data_from_stock_move( - self, mrp_product, move, direction='in'): + self, product_mrp_area, move, direction='in'): if not((move.location_id.usage == 'internal' and move.location_dest_id.usage != 'internal') or (move.location_id.usage != 'internal' and @@ -117,9 +116,8 @@ class MultiLevelMrp(models.TransientModel): mrp_date = datetime.date(datetime.strptime( move.date_expected, DEFAULT_SERVER_DATETIME_FORMAT)) return { - 'mrp_area_id': mrp_product.mrp_area_id.id, 'product_id': move.product_id.id, - 'mrp_product_id': mrp_product.id, + 'product_mrp_area_id': product_mrp_area.id, 'production_id': mo, 'purchase_order_id': po, 'purchase_line_id': po_line, @@ -141,12 +139,11 @@ class MultiLevelMrp(models.TransientModel): @api.model def _prepare_mrp_move_data_supply( - self, mrp_product, qty, mrp_date_supply, mrp_action_date, + self, product_mrp_area, qty, mrp_date_supply, mrp_action_date, mrp_action, name): return { - 'mrp_area_id': mrp_product.mrp_area_id.id, - 'product_id': mrp_product.product_id.id, - 'mrp_product_id': mrp_product.id, + 'product_id': product_mrp_area.product_id.id, + 'product_mrp_area_id': product_mrp_area.id, 'production_id': None, 'purchase_order_id': None, 'purchase_line_id': None, @@ -168,16 +165,16 @@ class MultiLevelMrp(models.TransientModel): @api.model def _prepare_mrp_move_data_bom_explosion( self, product, bomline, qty, mrp_date_demand_2, bom, name): - mrp_product = self._get_mrp_product_from_product_and_area( + product_mrp_area = self._get_product_mrp_area_from_product_and_area( bomline.product_id, product.mrp_area_id) - if not mrp_product: + if not product_mrp_area: raise exceptions.Warning( _("No MRP product found")) return { 'mrp_area_id': product.mrp_area_id.id, 'product_id': bomline.product_id.id, - 'mrp_product_id': mrp_product.id, + 'product_mrp_area_id': product_mrp_area.id, 'production_id': None, 'purchase_order_id': None, 'purchase_line_id': None, @@ -200,15 +197,15 @@ class MultiLevelMrp(models.TransientModel): } @api.model - def create_move(self, mrp_product_id, mrp_date, mrp_qty, name): + def create_move(self, product_mrp_area_id, mrp_date, mrp_qty, name): self = self.with_context(auditlog_disabled=True) values = {} if not isinstance(mrp_date, date): mrp_date = fields.Date.from_string(mrp_date) - if mrp_product_id.supply_method == 'buy': - # if mrp_product_id.purchase_requisition: + if product_mrp_area_id.supply_method == 'buy': + # if product_mrp_area_id.purchase_requisition: # mrp_action = 'pr' # else: mrp_action = 'po' @@ -221,24 +218,24 @@ class MultiLevelMrp(models.TransientModel): else: mrp_date_supply = mrp_date - calendar = mrp_product_id.mrp_area_id.calendar_id - if calendar and mrp_product_id.mrp_lead_time: + calendar = product_mrp_area_id.mrp_area_id.calendar_id + if calendar and product_mrp_area_id.mrp_lead_time: date_str = fields.Date.to_string(mrp_date) dt = fields.Datetime.from_string(date_str) res = calendar.plan_days( - -1 * mrp_product_id.mrp_lead_time - 1, dt) + -1 * product_mrp_area_id.mrp_lead_time - 1, dt) mrp_action_date = res.date() else: mrp_action_date = mrp_date - timedelta( - days=mrp_product_id.mrp_lead_time) + days=product_mrp_area_id.mrp_lead_time) qty_ordered = 0.00 qty_to_order = mrp_qty while qty_ordered < mrp_qty: - qty = mrp_product_id._adjust_qty_to_order(qty_to_order) + qty = product_mrp_area_id._adjust_qty_to_order(qty_to_order) qty_to_order -= qty move_data = self._prepare_mrp_move_data_supply( - mrp_product_id, qty, mrp_date_supply, mrp_action_date, + product_mrp_area_id, qty, mrp_date_supply, mrp_action_date, mrp_action, name) mrpmove_id = self.env['mrp.move'].create(move_data) qty_ordered = qty_ordered + qty @@ -247,10 +244,10 @@ class MultiLevelMrp(models.TransientModel): mrp_date_demand = mrp_action_date if mrp_date_demand < date.today(): mrp_date_demand = date.today() - if not mrp_product_id.product_id.bom_ids: + if not product_mrp_area_id.product_id.bom_ids: continue bomcount = 0 - for bom in mrp_product_id.product_id.bom_ids: + for bom in product_mrp_area_id.product_id.bom_ids: if not bom.active or not bom.bom_line_ids: continue bomcount += 1 @@ -261,17 +258,17 @@ class MultiLevelMrp(models.TransientModel): bomline.product_id.type != 'product': continue if self._exclude_from_mrp( - mrp_product_id.mrp_area_id, - bomline.product_id): + bomline.product_id, + product_mrp_area_id.mrp_area_id): # Stop explosion. continue # TODO: review: mrp_transit_delay, mrp_inspection_delay mrp_date_demand_2 = mrp_date_demand - timedelta( - days=(mrp_product_id.mrp_transit_delay + - mrp_product_id.mrp_inspection_delay)) + days=(product_mrp_area_id.mrp_transit_delay + + product_mrp_area_id.mrp_inspection_delay)) move_data = \ self._prepare_mrp_move_data_bom_explosion( - mrp_product_id, bomline, qty, + product_mrp_area_id, bomline, qty, mrp_date_demand_2, bom, name) mrpmove_id2 = self.env['mrp.move'].create(move_data) @@ -288,7 +285,6 @@ class MultiLevelMrp(models.TransientModel): # installed logger.info('START MRP CLEANUP') self.env['mrp.move'].search([]).unlink() - self.env['mrp.product'].search([]).unlink() self.env['mrp.inventory'].search([]).unlink() logger.info('END MRP CLEANUP') return True @@ -335,31 +331,25 @@ class MultiLevelMrp(models.TransientModel): @api.model def _calculate_mrp_applicable(self): logger.info('CALCULATE MRP APPLICABLE') - self.env['product.product'].search([]).write({'mrp_applicable': False}) - self.env['product.product'].search([ - ('type', '=', 'product'), + self.env['product.mrp.area'].search([]).write( + {'mrp_applicable': False}) + self.env['product.mrp.area'].search([ + ('product_id.type', '=', 'product'), ]).write({'mrp_applicable': True}) self._adjust_mrp_applicable() - counter = self.env['product.product'].search([ + counter = self.env['product.mrp.area'].search([ ('mrp_applicable', '=', True)], count=True) log_msg = 'END CALCULATE MRP APPLICABLE: %s' % counter logger.info(log_msg) return True @api.model - def _init_mrp_product(self, product, mrp_area): - - mrp_product_data = self._prepare_mrp_product_data( - product, mrp_area) - return self.env['mrp.product'].create(mrp_product_data) - - @api.model - def _init_mrp_move_from_forecast(self, mrp_product): + def _init_mrp_move_from_forecast(self, product_mrp_area): locations = self.env['stock.location'].search( - [('id', 'child_of', mrp_product.mrp_area_id.location_id.id)]) + [('id', 'child_of', product_mrp_area.mrp_area_id.location_id.id)]) today = fields.Date.today() estimates = self.env['stock.demand.estimate'].search([ - ('product_id', '=', mrp_product.product_id.id), + ('product_id', '=', product_mrp_area.product_id.id), ('location_id', 'in', locations.ids), ('date_range_id.date_end', '>=', today) ]) @@ -373,19 +363,19 @@ class MultiLevelMrp(models.TransientModel): while mrp_date <= date_end: mrp_move_data = \ self._prepare_mrp_move_data_from_forecast( - rec, mrp_product, mrp_date) + rec, product_mrp_area, mrp_date) self.env['mrp.move'].create(mrp_move_data) mrp_date += delta return True - # TODO: move this methods to mrp_product?? to be able to + # TODO: move this methods to product_mrp_area?? to be able to # show moves with an action @api.model - def _in_stock_moves_domain(self, mrp_product): + def _in_stock_moves_domain(self, product_mrp_area): locations = self.env['stock.location'].search( - [('id', 'child_of', mrp_product.mrp_area_id.location_id.id)]) + [('id', 'child_of', product_mrp_area.mrp_area_id.location_id.id)]) return [ - ('product_id', '=', mrp_product.product_id.id), + ('product_id', '=', product_mrp_area.product_id.id), ('state', 'not in', ['done', 'cancel']), ('product_qty', '>', 0.00), ('location_id', 'not in', locations.ids), @@ -393,11 +383,11 @@ class MultiLevelMrp(models.TransientModel): ] @api.model - def _out_stock_moves_domain(self, mrp_product): + def _out_stock_moves_domain(self, product_mrp_area): locations = self.env['stock.location'].search( - [('id', 'child_of', mrp_product.mrp_area_id.location_id.id)]) + [('id', 'child_of', product_mrp_area.mrp_area_id.location_id.id)]) return [ - ('product_id', '=', mrp_product.product_id.id), + ('product_id', '=', product_mrp_area.product_id.id), ('state', 'not in', ['done', 'cancel']), ('product_qty', '>', 0.00), ('location_id', 'in', locations.ids), @@ -405,34 +395,34 @@ class MultiLevelMrp(models.TransientModel): ] @api.model - def _init_mrp_move_from_stock_move(self, mrp_product): + def _init_mrp_move_from_stock_move(self, product_mrp_area): # TODO: Should we exclude the quantity done from the moves? move_obj = self.env['stock.move'] mrp_move_obj = self.env['mrp.move'] - in_domain = self._in_stock_moves_domain(mrp_product) + in_domain = self._in_stock_moves_domain(product_mrp_area) in_moves = move_obj.search(in_domain) - out_domain = self._out_stock_moves_domain(mrp_product) + out_domain = self._out_stock_moves_domain(product_mrp_area) out_moves = move_obj.search(out_domain) if in_moves: for move in in_moves: move_data = self._prepare_mrp_move_data_from_stock_move( - mrp_product, move, direction='in') + product_mrp_area, move, direction='in') mrp_move_obj.create(move_data) if out_moves: for move in out_moves: move_data = self._prepare_mrp_move_data_from_stock_move( - mrp_product, move, direction='out') + product_mrp_area, move, direction='out') mrp_move_obj.create(move_data) return True @api.model - def _prepare_mrp_move_data_from_purchase_order(self, poline, mrp_product): + def _prepare_mrp_move_data_from_purchase_order(self, poline, product_mrp_area): mrp_date = date.today() if fields.Date.from_string(poline.date_planned) > date.today(): mrp_date = fields.Date.from_string(poline.date_planned) return { 'product_id': poline.product_id.id, - 'mrp_product_id': mrp_product.id, + 'product_mrp_area_id': product_mrp_area.id, 'production_id': None, 'purchase_order_id': poline.order_id.id, 'purchase_line_id': poline.id, @@ -453,9 +443,9 @@ class MultiLevelMrp(models.TransientModel): } @api.model - def _init_mrp_move_from_purchase_order(self, mrp_product): + def _init_mrp_move_from_purchase_order(self, product_mrp_area): location_ids = self.env['stock.location'].search( - [('id', 'child_of', mrp_product.mrp_area_id.location_id.id)]) + [('id', 'child_of', product_mrp_area.mrp_area_id.location_id.id)]) picking_types = self.env['stock.picking.type'].search( [('default_location_dest_id', 'in', location_ids.ids)]) @@ -466,58 +456,63 @@ class MultiLevelMrp(models.TransientModel): po_lines = self.env['purchase.order.line'].search( [('order_id', 'in', orders.ids), ('product_qty', '>', 0.0), - ('product_id', '=', mrp_product.product_id.id)]) + ('product_id', '=', product_mrp_area.product_id.id)]) for line in po_lines: mrp_move_data = \ self._prepare_mrp_move_data_from_purchase_order( - line, mrp_product) + line, product_mrp_area) self.env['mrp.move'].create(mrp_move_data) @api.model - def _get_mrp_product_from_product_and_area(self, product, mrp_area): - return self.env['mrp.product'].search([ + def _get_product_mrp_area_from_product_and_area(self, product, mrp_area): + return self.env['product.mrp.area'].search([ ('product_id', '=', product.id), ('mrp_area_id', '=', mrp_area.id), ], limit=1) @api.model - def _init_mrp_move(self, mrp_product): - self._init_mrp_move_from_forecast(mrp_product) - self._init_mrp_move_from_stock_move(mrp_product) - self._init_mrp_move_from_purchase_order(mrp_product) + def _init_mrp_move(self, product_mrp_area): + self._init_mrp_move_from_forecast(product_mrp_area) + self._init_mrp_move_from_stock_move(product_mrp_area) + self._init_mrp_move_from_purchase_order(product_mrp_area) @api.model - def _exclude_from_mrp(self, mrp_area, product): + def _exclude_from_mrp(self, product, mrp_area): """ To extend with various logic where needed. """ - return product.mrp_exclude + product_mrp_area = self.env['product.mrp.area'].search( + [('product_id', '=', product.id), + ('mrp_area_id', '=', mrp_area.id)], limit=1) + if not product_mrp_area: + return True + return product_mrp_area.mrp_exclude @api.model def _mrp_initialisation(self): logger.info('START MRP INITIALISATION') mrp_areas = self.env['mrp.area'].search([]) - products = self.env['product.product'].search([ + product_mrp_areas = self.env['product.mrp.area'].search([ ('mrp_applicable', '=', True)]) init_counter = 0 for mrp_area in mrp_areas: - for product in products: - if self._exclude_from_mrp(mrp_area, product): + for product_mrp_area in product_mrp_areas.filtered( + lambda a: a.mrp_area_id == mrp_area): + if product_mrp_area.mrp_exclude: continue init_counter += 1 log_msg = 'MRP INIT: %s - %s ' % ( - init_counter, product.default_code) + init_counter, product_mrp_area.display_name) logger.info(log_msg) - mrp_product = self._init_mrp_product(product, mrp_area) - self._init_mrp_move(mrp_product) + self._init_mrp_move(product_mrp_area) logger.info('END MRP INITIALISATION') @api.model - def _init_mrp_move_grouped_demand(self, nbr_create, mrp_product): + def _init_mrp_move_grouped_demand(self, nbr_create, product_mrp_area): last_date = None last_qty = 0.00 - onhand = mrp_product.mrp_qty_available + onhand = product_mrp_area.qty_available move_ids = [] - for move in mrp_product.mrp_move_ids: + for move in product_mrp_area.mrp_move_ids: move_ids.append(move.id) for move_id in move_ids: move_rec = self.env['mrp.move'].search( @@ -529,18 +524,18 @@ class MultiLevelMrp(models.TransientModel): datetime.strptime( move.mrp_date, '%Y-%m-%d')) \ > last_date+timedelta( - days=mrp_product.mrp_nbr_days): + days=product_mrp_area.mrp_nbr_days): if (onhand + last_qty + move.mrp_qty) \ - < mrp_product.mrp_minimum_stock \ + < product_mrp_area.mrp_minimum_stock \ or (onhand + last_qty) \ - < mrp_product.mrp_minimum_stock: + < product_mrp_area.mrp_minimum_stock: name = 'Grouped Demand for %d Days' % \ - mrp_product.mrp_nbr_days + product_mrp_area.mrp_nbr_days qtytoorder = \ - mrp_product.mrp_minimum_stock - \ - mrp_product - last_qty + product_mrp_area.mrp_minimum_stock - \ + product_mrp_area - last_qty cm = self.create_move( - mrp_product_id=mrp_product.id, + product_mrp_area_id=product_mrp_area.id, mrp_date=last_date, mrp_qty=qtytoorder, name=name) @@ -550,9 +545,9 @@ class MultiLevelMrp(models.TransientModel): last_qty = 0.00 nbr_create += 1 if (onhand + last_qty + move.mrp_qty) < \ - mrp_product.mrp_minimum_stock or \ + product_mrp_area.mrp_minimum_stock or \ (onhand + last_qty) < \ - mrp_product.mrp_minimum_stock: + product_mrp_area.mrp_minimum_stock: if last_date is None: last_date = datetime.date( datetime.strptime(move.mrp_date, @@ -568,10 +563,10 @@ class MultiLevelMrp(models.TransientModel): if last_date is not None and last_qty != 0.00: name = 'Grouped Demand for %d Days' % \ - (mrp_product.mrp_nbr_days, ) - qtytoorder = mrp_product.mrp_minimum_stock - onhand - last_qty + (product_mrp_area.mrp_nbr_days, ) + qtytoorder = product_mrp_area.mrp_minimum_stock - onhand - last_qty cm = self.create_move( - mrp_product_id=mrp_product.id, mrp_date=last_date, + product_mrp_area_id=product_mrp_area.id, mrp_date=last_date, mrp_qty=qtytoorder, name=name) qty_ordered = cm['qty_ordered'] onhand += qty_ordered @@ -581,30 +576,31 @@ class MultiLevelMrp(models.TransientModel): @api.model def _mrp_calculation(self, mrp_lowest_llc): logger.info('START MRP CALCULATION') - mrp_product_obj = self.env['mrp.product'] + product_mrp_area_obj = self.env['product.mrp.area'] counter = 0 for mrp_area in self.env['mrp.area'].search([]): llc = 0 while mrp_lowest_llc > llc: - mrp_products = mrp_product_obj.search( - [('mrp_llc', '=', llc), + product_mrp_areas = product_mrp_area_obj.search( + [('product_id.llc', '=', llc), ('mrp_area_id', '=', mrp_area.id)]) llc += 1 - for mrp_product in mrp_products: + for product_mrp_area in product_mrp_areas: nbr_create = 0 - onhand = mrp_product.mrp_qty_available # TODO: unreserved? - if mrp_product.mrp_nbr_days == 0: + onhand = product_mrp_area.qty_available + # TODO: unreserved? + if product_mrp_area.mrp_nbr_days == 0: # todo: review ordering by date - for move in mrp_product.mrp_move_ids: + for move in product_mrp_area.mrp_move_ids: if move.mrp_action == 'none': if (onhand + move.mrp_qty) < \ - mrp_product.mrp_minimum_stock: + product_mrp_area.mrp_minimum_stock: qtytoorder = \ - mrp_product.mrp_minimum_stock - \ + product_mrp_area.mrp_minimum_stock - \ onhand - move.mrp_qty cm = self.create_move( - mrp_product_id=mrp_product, + product_mrp_area_id=product_mrp_area, mrp_date=move.mrp_date, mrp_qty=qtytoorder, name=move.name) qty_ordered = cm['qty_ordered'] @@ -615,13 +611,13 @@ class MultiLevelMrp(models.TransientModel): else: # TODO: review this nbr_create = self._init_mrp_move_grouped_demand( - nbr_create, mrp_product) + nbr_create, product_mrp_area) - if onhand < mrp_product.mrp_minimum_stock and \ + if onhand < product_mrp_area.mrp_minimum_stock and \ nbr_create == 0: - qtytoorder = mrp_product.mrp_minimum_stock - onhand + qtytoorder = product_mrp_area.mrp_minimum_stock - onhand cm = self.create_move( - mrp_product_id=mrp_product, + product_mrp_area_id=product_mrp_area, mrp_date=date.today(), mrp_qty=qtytoorder, name='Minimum Stock') @@ -636,64 +632,64 @@ class MultiLevelMrp(models.TransientModel): logger.info('END MRP CALCULATION') @api.model - def _get_demand_groups(self, mrp_product): + def _get_demand_groups(self, product_mrp_area): query = """ SELECT mrp_date, sum(mrp_qty) FROM mrp_move - WHERE mrp_product_id = %(mrp_product)s + WHERE product_mrp_area_id = %(mrp_product)s AND mrp_type = 'd' GROUP BY mrp_date """ params = { - 'mrp_product': mrp_product.id + 'mrp_product': product_mrp_area.id } return query, params @api.model - def _get_supply_groups(self, mrp_product): + def _get_supply_groups(self, product_mrp_area): query = """ SELECT mrp_date, sum(mrp_qty) FROM mrp_move - WHERE mrp_product_id = %(mrp_product)s + WHERE product_mrp_area_id = %(mrp_product)s AND mrp_type = 's' AND mrp_action = 'none' GROUP BY mrp_date """ params = { - 'mrp_product': mrp_product.id + 'mrp_product': product_mrp_area.id } return query, params @api.model - def _get_supply_action_groups(self, mrp_product): + def _get_supply_action_groups(self, product_mrp_area): exclude_mrp_actions = ['none', 'cancel'] query = """ SELECT mrp_date, sum(mrp_qty) FROM mrp_move - WHERE mrp_product_id = %(mrp_product)s + WHERE product_mrp_area_id = %(mrp_product)s AND mrp_qty <> 0.0 AND mrp_type = 's' AND mrp_action not in %(excluded_mrp_actions)s GROUP BY mrp_date """ params = { - 'mrp_product': mrp_product.id, + 'mrp_product': product_mrp_area.id, 'excluded_mrp_actions': tuple(exclude_mrp_actions,) } return query, params @api.model - def _init_mrp_inventory(self, mrp_product): + def _init_mrp_inventory(self, product_mrp_area): mrp_move_obj = self.env['mrp.move'] # Read Demand demand_qty_by_date = {} - query, params = self._get_demand_groups(mrp_product) + query, params = self._get_demand_groups(product_mrp_area) self.env.cr.execute(query, params) for mrp_date, qty in self.env.cr.fetchall(): demand_qty_by_date[mrp_date] = qty # Read Supply supply_qty_by_date = {} - query, params = self._get_supply_groups(mrp_product) + query, params = self._get_supply_groups(product_mrp_area) self.env.cr.execute(query, params) for mrp_date, qty in self.env.cr.fetchall(): supply_qty_by_date[mrp_date] = qty @@ -701,19 +697,22 @@ class MultiLevelMrp(models.TransientModel): # TODO: if we remove cancel take it into account here, # TODO: as well as mrp_type ('r'). supply_actions_qty_by_date = {} - query, params = self._get_supply_action_groups(mrp_product) + query, params = self._get_supply_action_groups(product_mrp_area) self.env.cr.execute(query, params) for mrp_date, qty in self.env.cr.fetchall(): supply_actions_qty_by_date[mrp_date] = qty # Dates mrp_dates = set(mrp_move_obj.search([ - ('mrp_product_id', '=', mrp_product.id)], + ('product_mrp_area_id', '=', product_mrp_area.id)], order='mrp_date').mapped('mrp_date')) - - on_hand_qty = mrp_product.current_qty_available # TODO: unreserved? + on_hand_qty = product_mrp_area.product_id.with_context( + location=product_mrp_area.mrp_area_id.location_id.id + )._product_available()[ + product_mrp_area.product_id.id]['qty_available'] + # TODO: unreserved? for mdt in sorted(mrp_dates): mrp_inventory_data = { - 'mrp_product_id': mrp_product.id, + 'product_mrp_area_id': product_mrp_area.id, 'date': mdt, } demand_qty = 0.0 @@ -736,32 +735,31 @@ class MultiLevelMrp(models.TransientModel): @api.model def _mrp_final_process(self): logger.info('START MRP FINAL PROCESS') - mrp_product_ids = self.env['mrp.product'].search([ - ('mrp_llc', '<', 9999), - ('mrp_area_id', '!=', False)]) + product_mrp_area_ids = self.env['product.mrp.area'].search([ + ('product_id.llc', '<', 9999)]) - for mrp_product in mrp_product_ids: + for product_mrp_area in product_mrp_area_ids: # Build the time-phased inventory - self._init_mrp_inventory(mrp_product) + self._init_mrp_inventory(product_mrp_area) # Complete info on mrp_move (running availability and nbr actions) - qoh = mrp_product.mrp_qty_available + qoh = product_mrp_area.qty_available moves = self.env['mrp.move'].search([ - ('mrp_product_id', '=', mrp_product.id)], + ('product_mrp_area_id', '=', product_mrp_area.id)], order='mrp_date, mrp_type desc, id') for move in moves: qoh = qoh + move.mrp_qty move.running_availability = qoh - nbr_actions = mrp_product.mrp_move_ids.filtered( + nbr_actions = product_mrp_area.mrp_move_ids.filtered( lambda m: m.mrp_action != 'none') horizon_4w = fields.Date.to_string( date.today() + timedelta(weeks=4)) nbr_actions_4w = nbr_actions.filtered( lambda m: m.mrp_action_date < horizon_4w) if nbr_actions: - mrp_product.write({ + product_mrp_area.write({ 'nbr_mrp_actions': len(nbr_actions), 'nbr_mrp_actions_4w': len(nbr_actions_4w), }) diff --git a/mrp_multi_level/wizards/mrp_multi_level_view.xml b/mrp_multi_level/wizards/mrp_multi_level_views.xml similarity index 100% rename from mrp_multi_level/wizards/mrp_multi_level_view.xml rename to mrp_multi_level/wizards/mrp_multi_level_views.xml From e6e1af8da9ff009147a2bfbfb2c28e645fe650a3 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Tue, 20 Nov 2018 10:10:32 +0100 Subject: [PATCH 032/188] [11.0] mrp_multi_level: * fix api.depends fields fro main supplier. * fix ordering and missing demo file in manifest. * Update README. * fix action_view* methods. * readd hook to exclude in mrp initialization * fix computation of qty available (it was considering several times sub-locations). * Remove contraint for outoing and incoming moves to be moved in/outside the company, they can be internal transfers. * mrp.moves visible with technical settings. * Show product and allow to search by it in mrp.inventory. --- mrp_multi_level/README.rst | 28 +++++- mrp_multi_level/__manifest__.py | 4 +- mrp_multi_level/models/mrp_inventory.py | 8 +- mrp_multi_level/models/product_mrp_area.py | 52 +++++------ mrp_multi_level/models/product_product.py | 12 +-- mrp_multi_level/models/product_template.py | 7 +- mrp_multi_level/readme/CONFIGURE.rst | 13 ++- mrp_multi_level/readme/HISTORY.rst | 11 +++ mrp_multi_level/readme/USAGE.rst | 4 +- mrp_multi_level/static/description/index.html | 88 ++++++++++++------- mrp_multi_level/tests/test_mrp_multi_level.py | 8 +- mrp_multi_level/views/mrp_inventory_views.xml | 5 +- .../views/product_mrp_area_views.xml | 28 +++++- mrp_multi_level/wizards/mrp_multi_level.py | 15 ++-- 14 files changed, 184 insertions(+), 99 deletions(-) diff --git a/mrp_multi_level/README.rst b/mrp_multi_level/README.rst index bbbf73e0c..1b79418f4 100644 --- a/mrp_multi_level/README.rst +++ b/mrp_multi_level/README.rst @@ -50,20 +50,29 @@ Key Features Configuration ============= -* Go to *Manufacturing > MRP > MRP Area* and define or edit any existing area. - You can specify the working hours for every area. +MRP Areas +~~~~~~~~~ + +* Go to *Manufacturing > Configuration > MRP Areas* and define or edit + any existing area. You can specify the working hours for every area. + +Product MRP Area Parameters +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Go to *Manufacturing > Master Data > Product MRP Area Parameters* and set + the MRP parameters for a given product and area. Usage ===== To manually run the MRP scheduler: -#. Go to *Manufacturing > MRP > Run MRP Multi Level*. +#. Go to *Manufacturing > Operations > Run MRP Multi Level*. #. On the wizard click *Run MRP*. To launch replenishment orders (moves, purchases, production orders...): -#. Go to *Manufacturing > MRP > MRP Inventory*. +#. Go to *Manufacturing > Operations > MRP Inventory*. #. Filter with *To procure*. #. Select multiple records and click on *Action > Procure* or click the right hand side gears in any record. @@ -78,6 +87,17 @@ Known issues / Roadmap Changelog ========= +11.0.2.0.0 (2018-11-20) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [REW] Refactor MRP Area. + (`#322 `_): + + * MRP product concept dropped in favor of *Product MRP Area Parameters*. + This allow to set different MRP parameters for the same product in + different areas. + * Menu items reordering. + 11.0.1.1.0 (2018-08-30) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index 9c7b597e0..f32d72a20 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -38,9 +38,9 @@ 'demo': [ 'demo/product_category_demo.xml', 'demo/product_product_demo.xml', - 'demo/product_product_demo.xml', - 'demo/product_mrp_area_demo.xml', + 'demo/res_partner_demo.xml', 'demo/product_supplierinfo_demo.xml', + 'demo/product_mrp_area_demo.xml', 'demo/mrp_bom_demo.xml', 'demo/initial_on_hand_demo.xml', ], diff --git a/mrp_multi_level/models/mrp_inventory.py b/mrp_multi_level/models/mrp_inventory.py index e8a36adfb..64f472888 100644 --- a/mrp_multi_level/models/mrp_inventory.py +++ b/mrp_multi_level/models/mrp_inventory.py @@ -17,7 +17,6 @@ class MrpInventory(models.Model): # TODO: name to pass to procurements? # TODO: compute procurement_date to pass to the wizard? not needed for # PO at least. Check for MO and moves - # TODO: substract qty already procured. # TODO: show a LT based on the procure method? mrp_area_id = fields.Many2one( @@ -25,9 +24,14 @@ class MrpInventory(models.Model): related='product_mrp_area_id.mrp_area_id', store=True, ) product_mrp_area_id = fields.Many2one( - comodel_name='product.mrp.area', string='Product', + comodel_name='product.mrp.area', string='Product Parameters', index=True, ) + product_id = fields.Many2one( + comodel_name='product.product', + related='product_mrp_area_id.product_id', + store=True, + ) uom_id = fields.Many2one( comodel_name='product.uom', string='Product UoM', compute='_compute_uom_id', diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index 780edd4ab..682b4bd2e 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -11,19 +11,21 @@ class ProductMRPArea(models.Model): _description = 'Product MRP Area' active = fields.Boolean(default=True) - mrp_area_id = fields.Many2one('mrp.area', - required=True, - ) - product_id = fields.Many2one('product.product', - required=True, - string='Product', - ) - product_tmpl_id = fields.Many2one('product.template', - readonly=True, - related='product_id.product_tmpl_id', - store=True, - ) - + mrp_area_id = fields.Many2one( + comodel_name='mrp.area', + required=True, + ) + product_id = fields.Many2one( + comodel_name='product.product', + required=True, + string='Product', + ) + product_tmpl_id = fields.Many2one( + comodel_name='product.template', + readonly=True, + related='product_id.product_tmpl_id', + store=True, + ) # TODO: applicable and exclude... redundant?? mrp_applicable = fields.Boolean(string='MRP Applicable') mrp_exclude = fields.Boolean(string='Exclude from MRP') @@ -71,10 +73,11 @@ class ProductMRPArea(models.Model): qty_available = fields.Float('Quantity Available', compute='_compute_qty_available') - mrp_move_ids = fields.One2many(comodel_name='mrp.move', - inverse_name='product_mrp_area_id', - readonly=True, - ) + mrp_move_ids = fields.One2many( + comodel_name='mrp.move', + inverse_name='product_mrp_area_id', + readonly=True, + ) _sql_constraints = [ ('product_mrp_area_uniq', 'unique(product_id, mrp_area_id)', 'The product/MRP Area parameters combination must be unique.'), @@ -89,17 +92,9 @@ class ProductMRPArea(models.Model): @api.multi def _compute_qty_available(self): for rec in self: - qty_available = 0.0 - product_obj = self.env['product.product'] # TODO: move mrp_qty_available computation, maybe unreserved?? - location_ids = self.env['stock.location'].search( - [('id', 'child_of', - rec.mrp_area_id.location_id.id)]) - for location in location_ids: - product_l = product_obj.with_context( - {'location': location.id}).browse(rec.product_id.id) - qty_available += product_l.qty_available - rec.qty_available = qty_available + rec.qty_available = rec.product_id.with_context( + {'location': rec.mrp_area_id.location_id.id}).qty_available @api.multi def _compute_supply_method(self): @@ -115,7 +110,8 @@ class ProductMRPArea(models.Model): rec.supply_method = rule.action if rule else 'none' @api.multi - @api.depends('supply_method') + @api.depends('supply_method', 'product_id.route_ids', + 'product_id.seller_ids') def _compute_main_supplier(self): """Simplified and similar to procurement.rule logic.""" for rec in self.filtered(lambda r: r.supply_method == 'buy'): diff --git a/mrp_multi_level/models/product_product.py b/mrp_multi_level/models/product_product.py index f0ed768c8..e20078512 100644 --- a/mrp_multi_level/models/product_product.py +++ b/mrp_multi_level/models/product_product.py @@ -28,7 +28,8 @@ class Product(models.Model): mrp_area_count = fields.Integer( string='MRP Area Parameter Count', readonly=True, - compute='_compute_mrp_area_count') + compute='_compute_mrp_area_count', + ) @api.multi def _compute_mrp_area_count(self): @@ -40,12 +41,11 @@ class Product(models.Model): self.ensure_one() action = self.env.ref('mrp_multi_level.product_mrp_area_action') result = action.read()[0] - product_ids = self.ids - if len(product_ids) > 1: - result['domain'] = [('product_id', 'in', product_ids)] + area_ids = self.mrp_area_ids.ids + if self.mrp_area_count != 1: + result['domain'] = [('id', 'in', area_ids)] else: res = self.env.ref('mrp_multi_level.product_mrp_area_form', False) result['views'] = [(res and res.id or False, 'form')] - result['res_id'] = product_ids[0] - result['context'] = {'default_product_id': product_ids[0]} + result['res_id'] = area_ids[0] return result diff --git a/mrp_multi_level/models/product_template.py b/mrp_multi_level/models/product_template.py index 67b8e76be..48e43ba97 100644 --- a/mrp_multi_level/models/product_template.py +++ b/mrp_multi_level/models/product_template.py @@ -15,7 +15,8 @@ class ProductTemplate(models.Model): mrp_area_count = fields.Integer( string='MRP Area Parameter Count', readonly=True, - compute='_compute_mrp_area_count') + compute='_compute_mrp_area_count', + ) @api.multi def _compute_mrp_area_count(self): @@ -29,12 +30,10 @@ class ProductTemplate(models.Model): result = action.read()[0] mrp_area_ids = self.with_context( active_test=False).mrp_area_ids.ids - if len(mrp_area_ids) > 1: + if len(mrp_area_ids) != 1: result['domain'] = [('id', 'in', mrp_area_ids)] else: res = self.env.ref('mrp_multi_level.product_mrp_area_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = mrp_area_ids[0] - result['context'] = { - 'default_product_id': self.product_variant_ids[0].id} return result diff --git a/mrp_multi_level/readme/CONFIGURE.rst b/mrp_multi_level/readme/CONFIGURE.rst index 7237643b8..3825da541 100644 --- a/mrp_multi_level/readme/CONFIGURE.rst +++ b/mrp_multi_level/readme/CONFIGURE.rst @@ -1,2 +1,11 @@ -* Go to *Manufacturing > MRP > MRP Area* and define or edit any existing area. - You can specify the working hours for every area. +MRP Areas +~~~~~~~~~ + +* Go to *Manufacturing > Configuration > MRP Areas* and define or edit + any existing area. You can specify the working hours for every area. + +Product MRP Area Parameters +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* Go to *Manufacturing > Master Data > Product MRP Area Parameters* and set + the MRP parameters for a given product and area. diff --git a/mrp_multi_level/readme/HISTORY.rst b/mrp_multi_level/readme/HISTORY.rst index 01bd8c4d1..03ff5468e 100644 --- a/mrp_multi_level/readme/HISTORY.rst +++ b/mrp_multi_level/readme/HISTORY.rst @@ -1,3 +1,14 @@ +11.0.2.0.0 (2018-11-20) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [REW] Refactor MRP Area. + (`#322 `_): + + * MRP product concept dropped in favor of *Product MRP Area Parameters*. + This allow to set different MRP parameters for the same product in + different areas. + * Menu items reordering. + 11.0.1.1.0 (2018-08-30) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/readme/USAGE.rst b/mrp_multi_level/readme/USAGE.rst index fc56ab031..6e28dce46 100644 --- a/mrp_multi_level/readme/USAGE.rst +++ b/mrp_multi_level/readme/USAGE.rst @@ -1,11 +1,11 @@ To manually run the MRP scheduler: -#. Go to *Manufacturing > MRP > Run MRP Multi Level*. +#. Go to *Manufacturing > Operations > Run MRP Multi Level*. #. On the wizard click *Run MRP*. To launch replenishment orders (moves, purchases, production orders...): -#. Go to *Manufacturing > MRP > MRP Inventory*. +#. Go to *Manufacturing > Operations > MRP Inventory*. #. Filter with *To procure*. #. Select multiple records and click on *Action > Procure* or click the right hand side gears in any record. diff --git a/mrp_multi_level/static/description/index.html b/mrp_multi_level/static/description/index.html index 284ec77a8..8fc23d952 100644 --- a/mrp_multi_level/static/description/index.html +++ b/mrp_multi_level/static/description/index.html @@ -386,41 +386,56 @@ and explodes this down to the lowest level.

Table of contents

-

Configuration

+

Configuration

+
+

MRP Areas

    -
  • Go to Manufacturing > MRP > MRP Area and define or edit any existing area. -You can specify the working hours for every area.
  • +
  • Go to Manufacturing > Configuration > MRP Areas and define or edit +any existing area. You can specify the working hours for every area.
+
+

Product MRP Area Parameters

+
    +
  • Go to Manufacturing > Master Data > Product MRP Area Parameters and set +the MRP parameters for a given product and area.
  • +
+
+
-

Usage

+

Usage

To manually run the MRP scheduler:

    -
  1. Go to Manufacturing > MRP > Run MRP Multi Level.
  2. +
  3. Go to Manufacturing > Operations > Run MRP Multi Level.
  4. On the wizard click Run MRP.

To launch replenishment orders (moves, purchases, production orders…):

    -
  1. Go to Manufacturing > MRP > MRP Inventory.
  2. +
  3. Go to Manufacturing > Operations > MRP Inventory.
  4. Filter with To procure.
  5. Select multiple records and click on Action > Procure or click the right hand side gears in any record.
  6. @@ -428,23 +443,36 @@ hand side gears in any record.
-

Known issues / Roadmap

+

Known issues / Roadmap

  • The functionality related to field Nbr. Days in products is not functional for the time being. Please, stay tuned to future updates.
-

Changelog

+

Changelog

-

11.0.1.1.0 (2018-08-30)

+

11.0.2.0.0 (2018-11-20)

+
    +
  • [REW] Refactor MRP Area. +(#322):
      +
    • MRP product concept dropped in favor of Product MRP Area Parameters. +This allow to set different MRP parameters for the same product in +different areas.
    • +
    • Menu items reordering.
    • +
    +
  • +
+
+
+

11.0.1.1.0 (2018-08-30)

  • [FIX] Consider Qty Multiple on product to propose the quantity to procure. (#297)
-
-

11.0.1.0.1 (2018-08-03)

+
+

11.0.1.0.1 (2018-08-03)

  • [FIX] User and system locales doesn’t break MRP calculation. (#290)
  • @@ -453,15 +481,15 @@ as a related on MRP Areas. (#290)
-
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -469,16 +497,16 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Ucamco
  • Eficent
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose diff --git a/mrp_multi_level/tests/test_mrp_multi_level.py b/mrp_multi_level/tests/test_mrp_multi_level.py index 1d638fd65..c417a1fe1 100644 --- a/mrp_multi_level/tests/test_mrp_multi_level.py +++ b/mrp_multi_level/tests/test_mrp_multi_level.py @@ -23,7 +23,7 @@ class TestMrpMultiLevel(SavepointCase): cls.estimate_obj = cls.env['stock.demand.estimate'] cls.mrp_multi_level_wiz = cls.env['mrp.multi.level'] cls.mrp_inventory_procure_wiz = cls.env['mrp.inventory.procure'] - cls.mrp_inventory_obj = cls.env['mrp.inventory'] + cls.mrp_inventory_obj = cls.env['mrp.inventory'] cls.mrp_move_obj = cls.env['mrp.move'] cls.fp_1 = cls.env.ref('mrp_multi_level.product_product_fp_1') @@ -417,9 +417,9 @@ class TestMrpMultiLevel(SavepointCase): expected = [200.0, 290.0, 90.0, 0.0, 72.0, 0.0] self.assertEqual(moves.mapped('running_availability'), expected) # Actions counters for PP-1: - product_mrp_area = self.product_mrp_area_obj.search([ - ('product_id', '=', self.pp_1.id) - ]) + # product_mrp_area = self.product_mrp_area_obj.search([ + # ('product_id', '=', self.pp_1.id) + # ]) # TODO # self.assertEqual(product_mrp_area.nbr_mrp_actions, 3) # TODO # self.assertEqual(product_mrp_area.nbr_mrp_actions_4w, 3) # TODO diff --git a/mrp_multi_level/views/mrp_inventory_views.xml b/mrp_multi_level/views/mrp_inventory_views.xml index 484df5d7b..0e804683e 100644 --- a/mrp_multi_level/views/mrp_inventory_views.xml +++ b/mrp_multi_level/views/mrp_inventory_views.xml @@ -11,6 +11,7 @@ + @@ -35,7 +36,7 @@ - + @@ -84,7 +85,7 @@ - + diff --git a/mrp_multi_level/views/product_mrp_area_views.xml b/mrp_multi_level/views/product_mrp_area_views.xml index 8ab78a361..aeb2eed4d 100644 --- a/mrp_multi_level/views/product_mrp_area_views.xml +++ b/mrp_multi_level/views/product_mrp_area_views.xml @@ -59,6 +59,28 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -70,10 +92,8 @@ search - - - - + + diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 16269844f..5ace1b235 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -70,12 +70,6 @@ class MultiLevelMrp(models.TransientModel): @api.model def _prepare_mrp_move_data_from_stock_move( self, product_mrp_area, move, direction='in'): - if not((move.location_id.usage == 'internal' and - move.location_dest_id.usage != 'internal') - or (move.location_id.usage != 'internal' and - move.location_dest_id.usage == 'internal')): - # TODO: not sure about this 'if'... - return {} if direction == 'out': mrp_type = 'd' product_qty = -move.product_qty @@ -416,7 +410,8 @@ class MultiLevelMrp(models.TransientModel): return True @api.model - def _prepare_mrp_move_data_from_purchase_order(self, poline, product_mrp_area): + def _prepare_mrp_move_data_from_purchase_order( + self, poline, product_mrp_area): mrp_date = date.today() if fields.Date.from_string(poline.date_planned) > date.today(): mrp_date = fields.Date.from_string(poline.date_planned) @@ -497,7 +492,8 @@ class MultiLevelMrp(models.TransientModel): for mrp_area in mrp_areas: for product_mrp_area in product_mrp_areas.filtered( lambda a: a.mrp_area_id == mrp_area): - if product_mrp_area.mrp_exclude: + if self._exclude_from_mrp( + product_mrp_area.product_id, mrp_area): continue init_counter += 1 log_msg = 'MRP INIT: %s - %s ' % ( @@ -615,7 +611,8 @@ class MultiLevelMrp(models.TransientModel): if onhand < product_mrp_area.mrp_minimum_stock and \ nbr_create == 0: - qtytoorder = product_mrp_area.mrp_minimum_stock - onhand + qtytoorder = \ + product_mrp_area.mrp_minimum_stock - onhand cm = self.create_move( product_mrp_area_id=product_mrp_area, mrp_date=date.today(), From e459baedc0e45e08a92c463ea7727d59300664b7 Mon Sep 17 00:00:00 2001 From: Jordi Ballester Alomar Date: Wed, 28 Nov 2018 12:56:38 +0100 Subject: [PATCH 033/188] Fixes, and add migration script --- .../migrations/11.0.2.0.0/post-migration.py | 50 +++++++++++++++++++ mrp_multi_level/models/product_product.py | 10 +++- mrp_multi_level/models/product_template.py | 12 ++++- .../views/product_mrp_area_views.xml | 46 +++++++++-------- .../views/product_product_views.xml | 2 +- .../views/product_template_views.xml | 8 +-- mrp_multi_level/wizards/mrp_multi_level.py | 28 +++++------ 7 files changed, 113 insertions(+), 43 deletions(-) create mode 100644 mrp_multi_level/migrations/11.0.2.0.0/post-migration.py 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 new file mode 100644 index 000000000..6bf508127 --- /dev/null +++ b/mrp_multi_level/migrations/11.0.2.0.0/post-migration.py @@ -0,0 +1,50 @@ +# Copyright 2019 Eficent Business and IT Consulting Services, S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import logging +from odoo import api, SUPERUSER_ID + +_logger = logging.getLogger(__name__) + +__name__ = "Upgrade to 11.0.2.0.0" + + +def _migrate_product_to_product_mrp_area(env): + _logger.info("Migrating product parameters to Product MRP Areas") + env.cr.execute(""" + SELECT DISTINCT mrp_area.id, pr.id, pr.mrp_applicable, pr.mrp_exclude, + pr.mrp_inspection_delay, pr.mrp_maximum_order_qty, + pr.mrp_minimum_order_qty, pr.mrp_minimum_stock, pr.mrp_nbr_days, + pr.mrp_qty_multiple, pr.mrp_transit_delay, pr.mrp_verified, pr.active + FROM product_product AS pr + CROSS JOIN mrp_area + LEFT JOIN product_template AS pt + ON pt.id = pr.product_tmpl_id + WHERE pr.mrp_exclude = False + AND pt.type = 'product' + """) + product_mrp_area_model = env['product.mrp.area'] + for mrp_area_id, product_id, mrp_applicable, mrp_exclude,\ + mrp_inspection_delay, mrp_maximum_order_qty, mrp_minimum_order_qty, \ + mrp_minimum_stock, mrp_nbr_days, mrp_qty_multiple, mrp_transit_delay,\ + mrp_verified, active in env.cr.fetchall(): + product_mrp_area_model.create({ + 'mrp_area_id': mrp_area_id, + 'product_id': product_id, + 'mrp_applicable': mrp_applicable, + 'mrp_exclude': mrp_exclude, + 'mrp_inspection_delay': mrp_inspection_delay, + 'mrp_maximum_order_qty': mrp_maximum_order_qty, + 'mrp_minimum_order_qty': mrp_minimum_order_qty, + 'mrp_minimum_stock': mrp_minimum_stock, + 'mrp_nbr_days': mrp_nbr_days, + 'mrp_qty_multiple': mrp_qty_multiple, + 'mrp_transit_delay': mrp_transit_delay, + 'mrp_verified': mrp_verified, + 'active': active, + }) + + +def migrate(cr, version): + with api.Environment.manage(): + env = api.Environment(cr, SUPERUSER_ID, {}) + _migrate_product_to_product_mrp_area(env) diff --git a/mrp_multi_level/models/product_product.py b/mrp_multi_level/models/product_product.py index e20078512..1f003bf11 100644 --- a/mrp_multi_level/models/product_product.py +++ b/mrp_multi_level/models/product_product.py @@ -1,7 +1,7 @@ # Copyright 2016 Ucamco - Wim Audenaert # Copyright 2016-18 Eficent Business and IT Consulting Services S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - +import ast from odoo import api, fields, models @@ -41,11 +41,19 @@ class Product(models.Model): self.ensure_one() action = self.env.ref('mrp_multi_level.product_mrp_area_action') result = action.read()[0] + ctx = ast.literal_eval(result.get('context')) + if not ctx: + ctx = {} + mrp_areas = self.env['mrp.area'].search([]) + if len(mrp_areas) == 1: + ctx.update({'default_mrp_area_id': mrp_areas[0].id}) area_ids = self.mrp_area_ids.ids + ctx.update({'default_product_id': self.id}) if self.mrp_area_count != 1: result['domain'] = [('id', 'in', area_ids)] else: res = self.env.ref('mrp_multi_level.product_mrp_area_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = area_ids[0] + result['context'] = ctx return result diff --git a/mrp_multi_level/models/product_template.py b/mrp_multi_level/models/product_template.py index 48e43ba97..ed4ccaead 100644 --- a/mrp_multi_level/models/product_template.py +++ b/mrp_multi_level/models/product_template.py @@ -1,6 +1,6 @@ # Copyright 2018 Eficent Business and IT Consulting Services S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - +import ast from odoo import api, fields, models @@ -28,12 +28,22 @@ class ProductTemplate(models.Model): self.ensure_one() action = self.env.ref('mrp_multi_level.product_mrp_area_action') result = action.read()[0] + ctx = ast.literal_eval(result.get('context')) + mrp_areas = self.env['mrp.area'].search([]) + if 'context' not in result: + result['context'] = {} + if len(mrp_areas) == 1: + ctx.update({'default_mrp_area_id': mrp_areas[0].id}) mrp_area_ids = self.with_context( active_test=False).mrp_area_ids.ids + if len(self.product_variant_ids) == 1: + variant = self.product_variant_ids[0] + ctx.update({'default_product_id': variant.id}) if len(mrp_area_ids) != 1: result['domain'] = [('id', 'in', mrp_area_ids)] else: res = self.env.ref('mrp_multi_level.product_mrp_area_form', False) result['views'] = [(res and res.id or False, 'form')] result['res_id'] = mrp_area_ids[0] + result['context'] = ctx return result diff --git a/mrp_multi_level/views/product_mrp_area_views.xml b/mrp_multi_level/views/product_mrp_area_views.xml index aeb2eed4d..11c8d02a0 100644 --- a/mrp_multi_level/views/product_mrp_area_views.xml +++ b/mrp_multi_level/views/product_mrp_area_views.xml @@ -59,28 +59,30 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mrp_multi_level/views/product_product_views.xml b/mrp_multi_level/views/product_product_views.xml index 65014f376..ad24d4863 100644 --- a/mrp_multi_level/views/product_product_views.xml +++ b/mrp_multi_level/views/product_product_views.xml @@ -1,7 +1,7 @@ - + view.product.mrp.area.product.form product.product diff --git a/mrp_multi_level/views/product_template_views.xml b/mrp_multi_level/views/product_template_views.xml index 843413d55..1a5e9ddd5 100644 --- a/mrp_multi_level/views/product_template_views.xml +++ b/mrp_multi_level/views/product_template_views.xml @@ -8,10 +8,10 @@

diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 5ace1b235..2143d0ca5 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -531,7 +531,7 @@ class MultiLevelMrp(models.TransientModel): product_mrp_area.mrp_minimum_stock - \ product_mrp_area - last_qty cm = self.create_move( - product_mrp_area_id=product_mrp_area.id, + product_mrp_area_id=product_mrp_area, mrp_date=last_date, mrp_qty=qtytoorder, name=name) @@ -562,7 +562,7 @@ class MultiLevelMrp(models.TransientModel): (product_mrp_area.mrp_nbr_days, ) qtytoorder = product_mrp_area.mrp_minimum_stock - onhand - last_qty cm = self.create_move( - product_mrp_area_id=product_mrp_area.id, mrp_date=last_date, + product_mrp_area_id=product_mrp_area, mrp_date=last_date, mrp_qty=qtytoorder, name=name) qty_ordered = cm['qty_ordered'] onhand += qty_ordered @@ -748,18 +748,18 @@ class MultiLevelMrp(models.TransientModel): for move in moves: qoh = qoh + move.mrp_qty move.running_availability = qoh - - nbr_actions = product_mrp_area.mrp_move_ids.filtered( - lambda m: m.mrp_action != 'none') - horizon_4w = fields.Date.to_string( - date.today() + timedelta(weeks=4)) - nbr_actions_4w = nbr_actions.filtered( - lambda m: m.mrp_action_date < horizon_4w) - if nbr_actions: - product_mrp_area.write({ - 'nbr_mrp_actions': len(nbr_actions), - 'nbr_mrp_actions_4w': len(nbr_actions_4w), - }) + # TODO: Possible clean up needed here + # nbr_actions = product_mrp_area.mrp_move_ids.filtered( + # lambda m: m.mrp_action != 'none') + # horizon_4w = fields.Date.to_string( + # date.today() + timedelta(weeks=4)) + # nbr_actions_4w = nbr_actions.filtered( + # lambda m: m.mrp_action_date < horizon_4w) + # if nbr_actions: + # product_mrp_area.write({ + # 'nbr_mrp_actions': len(nbr_actions), + # 'nbr_mrp_actions_4w': len(nbr_actions_4w), + # }) logger.info('END MRP FINAL PROCESS') @api.multi From 030528bf73769272992802cdc5f57aae60406c80 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Sun, 3 Feb 2019 20:33:47 +0000 Subject: [PATCH 034/188] [UPD] Update mrp_multi_level.pot --- mrp_multi_level/i18n/de.po | 325 +++++++++++------------ mrp_multi_level/i18n/es.po | 292 ++++++++++---------- mrp_multi_level/i18n/mrp_multi_level.pot | 242 +++++++---------- 3 files changed, 382 insertions(+), 477 deletions(-) diff --git a/mrp_multi_level/i18n/de.po b/mrp_multi_level/i18n/de.po index 399f3d813..656eb19f4 100644 --- a/mrp_multi_level/i18n/de.po +++ b/mrp_multi_level/i18n/de.po @@ -23,6 +23,7 @@ msgstr "Aktion" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_active +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_active msgid "Active" msgstr "Aktiv" @@ -37,7 +38,7 @@ msgid "Assigned" msgstr "Zugewiesen" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_lead_time +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_lead_time msgid "" "Average delay in days to produce this product. In the case of multi-level " "BOM, the manufacturing lead times of the components will be added." @@ -47,7 +48,7 @@ msgstr "" "addiert." #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Buy" msgstr "Einkaufen" @@ -80,7 +81,7 @@ msgstr "Beschaffung erzeugen" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_uid -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_create_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_uid msgid "Created by" msgstr "Erstellt von" @@ -91,7 +92,7 @@ msgstr "Erstellt von" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_date -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_create_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_date msgid "Created on" msgstr "Erstellt am" @@ -105,31 +106,6 @@ msgstr "Aktuelles Datum" msgid "Current Qty" msgstr "Aktuelle Menge" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_current_qty_available -msgid "Current Qty Available" -msgstr "Aktuell verfügbare Menge" - -#. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_current_qty_available -msgid "" -"Current quantity of products.\n" -"In a context with a single Stock Location, this includes goods stored at " -"this Location, or any of its children.\n" -"In a context with a single Warehouse, this includes goods stored in the " -"Stock Location of this Warehouse, or any of its children.\n" -"stored in the Stock Location of the Warehouse of this Shop, or any of its " -"children.\n" -"Otherwise, this includes goods stored in any Stock Location with 'internal' " -"type." -msgstr "" -"Aktuelle Menge der Produkte\n" -"Im Kontext eines einzelnen Lagerortes enthält der Wert die Waren, die auf " -"diesem Lagerort und all seiner Unterlagerorte liegen.\n" -"Im Kontext eines einzelnen Lagers enthält der Wert die Waren, die auf dem " -"Lagerort dieses Lagers und all seiner Unterlagerorte liegen.\n" -"Ansonsten enthält der Wert alle Waren von alĺen 'internen' Lagerorten." - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_date msgid "Date" @@ -158,7 +134,6 @@ msgstr "Nachfrage" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_name -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_name msgid "Description" msgstr "Beschreibung" @@ -169,7 +144,7 @@ msgstr "Beschreibung" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_display_name -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_display_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_display_name msgid "Display Name" msgstr "Anzeigename" @@ -179,8 +154,7 @@ msgid "Draft" msgstr "Entwurf" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_exclude -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_exclude +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude msgid "Exclude from MRP" msgstr "von der Ressourcenplanung ausschließen" @@ -213,7 +187,6 @@ msgstr "Vorhergesagter Bestand" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Group By..." msgstr "Gruppiere nach..." @@ -224,23 +197,19 @@ msgstr "Gruppiere nach..." #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_id msgid "ID" msgstr "ID" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_verified -#: model:ir.model.fields,help:mrp_multi_level.field_product_product_mrp_verified -#: model:ir.model.fields,help:mrp_multi_level.field_product_template_mrp_verified +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_verified msgid "Identifies that this product has been verified to be valid for the MRP." msgstr "" "Dieses Produkt wurde als für die Fertigungsressourcenplanung gültig " "verifiziert." #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_inspection_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_inspection_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_inspection_delay +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_inspection_delay msgid "Inspection Delay" msgstr "Inspektionsverzögerung" @@ -262,7 +231,7 @@ msgstr "Positionen" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level___last_update -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product___last_update +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area___last_update msgid "Last Modified on" msgstr "Zuletzt geändert am" @@ -273,7 +242,7 @@ msgstr "Zuletzt geändert am" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_uid -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_write_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_uid msgid "Last Updated by" msgstr "Zuletzt aktualisiert von" @@ -284,12 +253,12 @@ msgstr "Zuletzt aktualisiert von" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_date -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_write_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_date msgid "Last Updated on" msgstr "Zuletzt aktualisiert am" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_lead_time +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_lead_time msgid "Lead Time" msgstr "Durchlaufzeit" @@ -300,16 +269,12 @@ msgid "Location" msgstr "Lagerort" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_llc #: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_llc -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Low Level Code" msgstr "Dispositionsstufe" #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_mrp -#: model:ir.ui.view,arch_db:mrp_multi_level.product_template_only_form_view_mrp -#: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_product_product_form #: selection:mrp.move,mrp_origin:0 #: model:product.category,name:mrp_multi_level.product_category_mrp msgid "MRP" @@ -321,8 +286,7 @@ msgid "MRP Action Date" msgstr "Aktionsdatum" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_applicable -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_applicable +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_applicable msgid "MRP Applicable" msgstr "Ressourcenplanung anwendbar" @@ -330,7 +294,6 @@ msgstr "Ressourcenplanung anwendbar" #: model:ir.actions.act_window,name:mrp_multi_level.mrp_area_action #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_area_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_stock_location_mrp_area_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_tree @@ -338,8 +301,23 @@ msgstr "Ressourcenplanung anwendbar" msgid "MRP Area" msgstr "Bereich" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_count +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_count +msgid "MRP Area Parameter Count" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_ids +#, fuzzy +msgid "MRP Area parameters" +msgstr "Bereiche" + #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_areas +#: model:ir.ui.view,arch_db:mrp_multi_level.product_template_only_form_view_mrp +#: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_product_product_form msgid "MRP Areas" msgstr "Bereiche" @@ -370,50 +348,22 @@ msgid "MRP Move UP" msgstr "nach oben verschieben" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_move_ids +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form msgid "MRP Moves" msgstr "Lagerbewegungen" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_form -msgid "MRP Product" -msgstr "Produkt" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_product_ids -msgid "MRP Product data" -msgstr "Produktdaten" - -#. module: mrp_multi_level -#: model:ir.actions.act_window,name:mrp_multi_level.mrp_product_action -#: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_products -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_tree -msgid "MRP Products" -msgstr "Produkte" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_qty_available -msgid "MRP Qty Available" -msgstr "Verfügbare Menge (MRP)" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_qty msgid "MRP Quantity" msgstr "Menge (MRP)" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_verified -msgid "MRP Verified" -msgstr "für MRP verifiziert" - #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_inventory msgid "MRP inventory projections" msgstr "Bestandsvorhersagen" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_main_supplier_id -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_main_supplier_id msgid "Main Supplier" msgstr "Hauptlieferant" @@ -422,11 +372,6 @@ msgstr "Hauptlieferant" msgid "Make Procurements from MRP inventory projections" msgstr "Beschaffungen aus den Bestandsvorhersagen (MRP) erstellen" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Manufacture Actions" -msgstr "Fertigungsaktionen" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_production_id #: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 @@ -439,24 +384,18 @@ msgid "Manufacturing Orders" msgstr "Fertigungsaufträge" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_maximum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_maximum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_maximum_order_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_maximum_order_qty msgid "Maximum Order Qty" msgstr "Maximale Auftragsmenge" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_minimum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_minimum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_minimum_order_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_order_qty msgid "Minimum Order Qty" msgstr "Minimale Auftragsmenge" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_minimum_stock +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock msgid "Minimum Stock" msgstr "Mindestbestand" @@ -466,15 +405,22 @@ msgid "Move" msgstr "Lagerbewegung" #. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_form -msgid "Moves" -msgstr "Lagerbewegungen" +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_area_id +#, fuzzy +msgid "Mrp Area" +msgstr "Bereich" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_mrp_inventory_id msgid "Mrp Inventory" msgstr "Bestand (MRP)" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_move_ids +#, fuzzy +msgid "Mrp Move" +msgstr "Lagerbewegungen" + #. module: mrp_multi_level #: model:ir.actions.server,name:mrp_multi_level.mrp_multi_level_cron_ir_actions_server #: model:ir.cron,cron_name:mrp_multi_level.mrp_multi_level_cron @@ -488,24 +434,12 @@ msgid "Name" msgstr "Bezeichnung" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_nbr_mrp_actions -msgid "Nbr Actions" -msgstr "# Aktionen" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_nbr_mrp_actions_4w -msgid "Nbr Actions 4 Weeks" -msgstr "# Aktionen (4 Wochen)" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_nbr_days -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_nbr_days -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_nbr_days +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_nbr_days msgid "Nbr. Days" msgstr "# Tage" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:175 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:166 #, python-format msgid "No MRP product found" msgstr "Kein Produkt für MRP gefunden" @@ -516,9 +450,7 @@ msgid "None" msgstr "Keines" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_nbr_days -#: model:ir.model.fields,help:mrp_multi_level.field_product_product_mrp_nbr_days -#: model:ir.model.fields,help:mrp_multi_level.field_product_template_mrp_nbr_days +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_nbr_days msgid "" "Number of days to group demand for this product during the MRP run, in order " "to determine the quantity to order." @@ -586,24 +518,50 @@ msgid "Procurement Request" msgstr "Beschaffungsanfrage" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Produce" msgstr "Produzieren" #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_product -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_product_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Product" msgstr "Produkt" +#. module: mrp_multi_level +#: model:ir.model,name:mrp_multi_level.model_product_mrp_area +#, fuzzy +msgid "Product MRP Area" +msgstr "Bereich" + +#. module: mrp_multi_level +#: model:ir.actions.act_window,name:mrp_multi_level.product_mrp_area_action +#: model:ir.ui.menu,name:mrp_multi_level.menu_product_mrp_area_parameters +msgid "Product MRP Area Parameters" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_tree +#, fuzzy +msgid "Product MRP Area parameters" +msgstr "Produktvorlage" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_mrp_area_id +#, fuzzy +msgid "Product Parameters" +msgstr "Produktvorlage" + #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_template -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_product_tmpl_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_tmpl_id msgid "Product Template" msgstr "Produktvorlage" @@ -612,11 +570,6 @@ msgstr "Produktvorlage" msgid "Product UoM" msgstr "Produkt ME" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Purchase Actions" -msgstr "Einkaufsaktionen" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_purchase_order_id #: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 @@ -634,9 +587,7 @@ msgid "Purchase Orders" msgstr "Einkaufsbestellungen" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_qty_multiple -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_qty_multiple -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_qty_multiple +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_qty_multiple msgid "Qty Multiple" msgstr "Mengenfaktor" @@ -645,6 +596,12 @@ msgstr "Mengenfaktor" msgid "Quantity" msgstr "Menge" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_qty_available +#, fuzzy +msgid "Quantity Available" +msgstr "Aktuell verfügbare Menge" + #. module: mrp_multi_level #: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 #, python-format @@ -695,14 +652,8 @@ msgstr "SF-1" msgid "SF-2" msgstr "SF-2" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Search Product" -msgstr "Produkt suchen" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Selection..." msgstr "Auswahl..." @@ -727,7 +678,7 @@ msgid "Stock Move" msgstr "Lagerbewegung" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_main_supplierinfo_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_main_supplierinfo_id msgid "Supplier Info" msgstr "Lieferanten-Information" @@ -738,11 +689,15 @@ msgid "Supply" msgstr "Liefermenge" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_supply_method -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_supply_method msgid "Supply Method" msgstr "Liefermethode" +#. module: mrp_multi_level +#: sql_constraint:product.mrp.area:0 +msgid "The product/MRP Area parameters combination must be unique." +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "To Approve" @@ -759,14 +714,12 @@ msgid "To procure" msgstr "Beschaffen" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Transfer" msgstr "Umbuchen" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_transit_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_transit_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_transit_delay +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_transit_delay msgid "Transit Delay" msgstr "Umbuchungsverzögerung" @@ -776,7 +729,7 @@ msgid "Type" msgstr "Typ" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Undefined" msgstr "Nicht definiert" @@ -800,8 +753,7 @@ msgstr "" "ein Fertigungsauftrag oder ein Lieferschein im Entwurf erstellt." #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_verified -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_verified +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_verified msgid "Verified for MRP" msgstr "für MRP verifiziert" @@ -816,21 +768,6 @@ msgstr "Wartend" msgid "Warehouse" msgstr "Lager" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Actions" -msgstr "Mit Aktionen" - -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Actions in Coming 4 Weeks" -msgstr "Mit Aktionen in den kommenden 4 Wochen" - -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Moves" -msgstr "Mit Lagerbewegungen" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_wiz_id msgid "Wizard" @@ -861,12 +798,70 @@ msgstr "mrp.move" msgid "mrp.multi.level" msgstr "mrp.multi.level" -#. module: mrp_multi_level -#: model:ir.model,name:mrp_multi_level.model_mrp_product -msgid "mrp.product" -msgstr "mrp.product" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_run_mrp_multi_level_wizard msgid "or" msgstr "oder" + +#~ msgid "" +#~ "Current quantity of products.\n" +#~ "In a context with a single Stock Location, this includes goods stored at " +#~ "this Location, or any of its children.\n" +#~ "In a context with a single Warehouse, this includes goods stored in the " +#~ "Stock Location of this Warehouse, or any of its children.\n" +#~ "stored in the Stock Location of the Warehouse of this Shop, or any of its " +#~ "children.\n" +#~ "Otherwise, this includes goods stored in any Stock Location with " +#~ "'internal' type." +#~ msgstr "" +#~ "Aktuelle Menge der Produkte\n" +#~ "Im Kontext eines einzelnen Lagerortes enthält der Wert die Waren, die auf " +#~ "diesem Lagerort und all seiner Unterlagerorte liegen.\n" +#~ "Im Kontext eines einzelnen Lagers enthält der Wert die Waren, die auf dem " +#~ "Lagerort dieses Lagers und all seiner Unterlagerorte liegen.\n" +#~ "Ansonsten enthält der Wert alle Waren von alĺen 'internen' Lagerorten." + +#~ msgid "MRP Product" +#~ msgstr "Produkt" + +#~ msgid "MRP Product data" +#~ msgstr "Produktdaten" + +#~ msgid "MRP Products" +#~ msgstr "Produkte" + +#~ msgid "MRP Qty Available" +#~ msgstr "Verfügbare Menge (MRP)" + +#~ msgid "MRP Verified" +#~ msgstr "für MRP verifiziert" + +#~ msgid "Manufacture Actions" +#~ msgstr "Fertigungsaktionen" + +#~ msgid "Moves" +#~ msgstr "Lagerbewegungen" + +#~ msgid "Nbr Actions" +#~ msgstr "# Aktionen" + +#~ msgid "Nbr Actions 4 Weeks" +#~ msgstr "# Aktionen (4 Wochen)" + +#~ msgid "Purchase Actions" +#~ msgstr "Einkaufsaktionen" + +#~ msgid "Search Product" +#~ msgstr "Produkt suchen" + +#~ msgid "With Actions" +#~ msgstr "Mit Aktionen" + +#~ msgid "With Actions in Coming 4 Weeks" +#~ msgstr "Mit Aktionen in den kommenden 4 Wochen" + +#~ msgid "With Moves" +#~ msgstr "Mit Lagerbewegungen" + +#~ msgid "mrp.product" +#~ msgstr "mrp.product" diff --git a/mrp_multi_level/i18n/es.po b/mrp_multi_level/i18n/es.po index 5b9c9a392..bc4176f91 100644 --- a/mrp_multi_level/i18n/es.po +++ b/mrp_multi_level/i18n/es.po @@ -23,6 +23,7 @@ msgstr "Acción" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_active +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_active msgid "Active" msgstr "Activo" @@ -37,14 +38,14 @@ msgid "Assigned" msgstr "Asignado" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_lead_time +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_lead_time msgid "" "Average delay in days to produce this product. In the case of multi-level " "BOM, the manufacturing lead times of the components will be added." msgstr "" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Buy" msgstr "Comprar" @@ -77,7 +78,7 @@ msgstr "Crear Aprovisionamiento" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_uid -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_create_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_uid msgid "Created by" msgstr "Creado por" @@ -88,7 +89,7 @@ msgstr "Creado por" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_date -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_create_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_date msgid "Created on" msgstr "Creado en" @@ -102,25 +103,6 @@ msgstr "Fecha actual" msgid "Current Qty" msgstr "Ctd. actual" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_current_qty_available -msgid "Current Qty Available" -msgstr "Ctd. actual disponible" - -#. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_current_qty_available -msgid "" -"Current quantity of products.\n" -"In a context with a single Stock Location, this includes goods stored at " -"this Location, or any of its children.\n" -"In a context with a single Warehouse, this includes goods stored in the " -"Stock Location of this Warehouse, or any of its children.\n" -"stored in the Stock Location of the Warehouse of this Shop, or any of its " -"children.\n" -"Otherwise, this includes goods stored in any Stock Location with 'internal' " -"type." -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_date msgid "Date" @@ -149,7 +131,6 @@ msgstr "Demanda" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_name -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_name msgid "Description" msgstr "Descripción" @@ -160,7 +141,7 @@ msgstr "Descripción" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_display_name -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_display_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_display_name msgid "Display Name" msgstr "Nombre de Visualización" @@ -170,8 +151,7 @@ msgid "Draft" msgstr "Borrador" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_exclude -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_exclude +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude msgid "Exclude from MRP" msgstr "Excluir del MRP" @@ -204,7 +184,6 @@ msgstr "Previsión de stock" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Group By..." msgstr "Agrupar por..." @@ -215,21 +194,17 @@ msgstr "Agrupar por..." #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_id msgid "ID" msgstr "ID" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_verified -#: model:ir.model.fields,help:mrp_multi_level.field_product_product_mrp_verified -#: model:ir.model.fields,help:mrp_multi_level.field_product_template_mrp_verified +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_verified msgid "Identifies that this product has been verified to be valid for the MRP." msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_inspection_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_inspection_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_inspection_delay +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_inspection_delay msgid "Inspection Delay" msgstr "" @@ -251,7 +226,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level___last_update -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product___last_update +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area___last_update msgid "Last Modified on" msgstr "Última Modificación en" @@ -262,7 +237,7 @@ msgstr "Última Modificación en" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_uid -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_write_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_uid msgid "Last Updated by" msgstr "Última Modificación por" @@ -273,12 +248,12 @@ msgstr "Última Modificación por" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_date -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_write_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_date msgid "Last Updated on" msgstr "Última Actualización en" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_lead_time +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_lead_time msgid "Lead Time" msgstr "Plazo de Entrega" @@ -289,16 +264,12 @@ msgid "Location" msgstr "Ubicación" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_llc #: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_llc -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Low Level Code" msgstr "" #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_mrp -#: model:ir.ui.view,arch_db:mrp_multi_level.product_template_only_form_view_mrp -#: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_product_product_form #: selection:mrp.move,mrp_origin:0 #: model:product.category,name:mrp_multi_level.product_category_mrp msgid "MRP" @@ -310,8 +281,7 @@ msgid "MRP Action Date" msgstr "Fecha de acción MRP" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_applicable -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_applicable +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_applicable msgid "MRP Applicable" msgstr "Aplicable a MRP" @@ -319,7 +289,6 @@ msgstr "Aplicable a MRP" #: model:ir.actions.act_window,name:mrp_multi_level.mrp_area_action #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_area_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_stock_location_mrp_area_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_tree @@ -327,8 +296,23 @@ msgstr "Aplicable a MRP" msgid "MRP Area" msgstr "Area MRP" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_count +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_count +msgid "MRP Area Parameter Count" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_ids +#, fuzzy +msgid "MRP Area parameters" +msgstr "Areas MRP" + #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_areas +#: model:ir.ui.view,arch_db:mrp_multi_level.product_template_only_form_view_mrp +#: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_product_product_form msgid "MRP Areas" msgstr "Areas MRP" @@ -359,50 +343,22 @@ msgid "MRP Move UP" msgstr "Movimiento Arriba MRP" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_move_ids +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form msgid "MRP Moves" msgstr "Movimientos MRP" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_form -msgid "MRP Product" -msgstr "Producto MRP" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_product_ids -msgid "MRP Product data" -msgstr "Datos Producto MRP" - -#. module: mrp_multi_level -#: model:ir.actions.act_window,name:mrp_multi_level.mrp_product_action -#: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_products -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_tree -msgid "MRP Products" -msgstr "Productos MRP" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_qty_available -msgid "MRP Qty Available" -msgstr "Ctd. Disponible MRP" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_qty msgid "MRP Quantity" msgstr "Ctd. MRP" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_verified -msgid "MRP Verified" -msgstr "Verificado para MRP" - #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_inventory msgid "MRP inventory projections" msgstr "Proyección de Stock MRP" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_main_supplier_id -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_main_supplier_id msgid "Main Supplier" msgstr "Proveedor Principal" @@ -411,11 +367,6 @@ msgstr "Proveedor Principal" msgid "Make Procurements from MRP inventory projections" msgstr "Crear Aprovisionamiento desde Proyecciones de Stock MRP" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Manufacture Actions" -msgstr "Acciones de Fabricación" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_production_id #: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 @@ -428,24 +379,18 @@ msgid "Manufacturing Orders" msgstr "Órdenes de Fabricación" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_maximum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_maximum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_maximum_order_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_maximum_order_qty msgid "Maximum Order Qty" msgstr "Ctd. Máxima de Pedido" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_minimum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_minimum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_minimum_order_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_order_qty msgid "Minimum Order Qty" msgstr "Ctd. Mínima de Pedido" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_minimum_stock +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock msgid "Minimum Stock" msgstr "Stock Mínimo" @@ -455,15 +400,22 @@ msgid "Move" msgstr "Movimiento" #. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_form -msgid "Moves" -msgstr "Movimientos" +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_area_id +#, fuzzy +msgid "Mrp Area" +msgstr "Area MRP" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_mrp_inventory_id msgid "Mrp Inventory" msgstr "Stock MRP" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_move_ids +#, fuzzy +msgid "Mrp Move" +msgstr "Movimientos MRP" + #. module: mrp_multi_level #: model:ir.actions.server,name:mrp_multi_level.mrp_multi_level_cron_ir_actions_server #: model:ir.cron,cron_name:mrp_multi_level.mrp_multi_level_cron @@ -477,24 +429,12 @@ msgid "Name" msgstr "Nombre" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_nbr_mrp_actions -msgid "Nbr Actions" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_nbr_mrp_actions_4w -msgid "Nbr Actions 4 Weeks" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_nbr_days -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_nbr_days -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_nbr_days +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_nbr_days msgid "Nbr. Days" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:175 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:166 #, python-format msgid "No MRP product found" msgstr "No se encontró producto MRP" @@ -505,9 +445,7 @@ msgid "None" msgstr "Ninguno/a" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_nbr_days -#: model:ir.model.fields,help:mrp_multi_level.field_product_product_mrp_nbr_days -#: model:ir.model.fields,help:mrp_multi_level.field_product_template_mrp_nbr_days +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_nbr_days msgid "" "Number of days to group demand for this product during the MRP run, in order " "to determine the quantity to order." @@ -573,24 +511,50 @@ msgid "Procurement Request" msgstr "Solicitud de Abastecimiento" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Produce" msgstr "Producir" #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_product -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_product_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Product" msgstr "Producto" +#. module: mrp_multi_level +#: model:ir.model,name:mrp_multi_level.model_product_mrp_area +#, fuzzy +msgid "Product MRP Area" +msgstr "Area MRP" + +#. module: mrp_multi_level +#: model:ir.actions.act_window,name:mrp_multi_level.product_mrp_area_action +#: model:ir.ui.menu,name:mrp_multi_level.menu_product_mrp_area_parameters +msgid "Product MRP Area Parameters" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_tree +#, fuzzy +msgid "Product MRP Area parameters" +msgstr "Producto Modelo" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_mrp_area_id +#, fuzzy +msgid "Product Parameters" +msgstr "Producto Modelo" + #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_template -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_product_tmpl_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_tmpl_id msgid "Product Template" msgstr "Producto Modelo" @@ -599,11 +563,6 @@ msgstr "Producto Modelo" msgid "Product UoM" msgstr "UdM del Producto" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Purchase Actions" -msgstr "Acciones de Compra" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_purchase_order_id #: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 @@ -621,9 +580,7 @@ msgid "Purchase Orders" msgstr "Órdenes de Compra" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_qty_multiple -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_qty_multiple -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_qty_multiple +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_qty_multiple msgid "Qty Multiple" msgstr "Múltiplo de Cantidad" @@ -632,6 +589,12 @@ msgstr "Múltiplo de Cantidad" msgid "Quantity" msgstr "Cantidad" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_qty_available +#, fuzzy +msgid "Quantity Available" +msgstr "Ctd. actual disponible" + #. module: mrp_multi_level #: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 #, python-format @@ -680,14 +643,8 @@ msgstr "SF-1" msgid "SF-2" msgstr "SF-2" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Search Product" -msgstr "Buscar Producto" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Selection..." msgstr "Selección..." @@ -712,7 +669,7 @@ msgid "Stock Move" msgstr "Movimiento de Stock" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_main_supplierinfo_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_main_supplierinfo_id msgid "Supplier Info" msgstr "Información de Proveedor" @@ -723,11 +680,15 @@ msgid "Supply" msgstr "Suministro" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_supply_method -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_supply_method msgid "Supply Method" msgstr "Método de Suministro" +#. module: mrp_multi_level +#: sql_constraint:product.mrp.area:0 +msgid "The product/MRP Area parameters combination must be unique." +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "To Approve" @@ -744,14 +705,12 @@ msgid "To procure" msgstr "" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Transfer" msgstr "Transfer" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_transit_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_transit_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_transit_delay +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_transit_delay msgid "Transit Delay" msgstr "Retraso de Tránsito" @@ -761,7 +720,7 @@ msgid "Type" msgstr "Tipo" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Undefined" msgstr "Indefinido" @@ -781,8 +740,7 @@ msgid "" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_verified -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_verified +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_verified msgid "Verified for MRP" msgstr "Verificado para MRP" @@ -797,21 +755,6 @@ msgstr "Esperando" msgid "Warehouse" msgstr "Almacén" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Actions" -msgstr "Con Acciones" - -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Actions in Coming 4 Weeks" -msgstr "Con Acciones en las Próximas 4 Semanas" - -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Moves" -msgstr "Con Movimientos" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_wiz_id msgid "Wizard" @@ -842,12 +785,43 @@ msgstr "" msgid "mrp.multi.level" msgstr "" -#. module: mrp_multi_level -#: model:ir.model,name:mrp_multi_level.model_mrp_product -msgid "mrp.product" -msgstr "" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_run_mrp_multi_level_wizard msgid "or" msgstr "o" + +#~ msgid "MRP Product" +#~ msgstr "Producto MRP" + +#~ msgid "MRP Product data" +#~ msgstr "Datos Producto MRP" + +#~ msgid "MRP Products" +#~ msgstr "Productos MRP" + +#~ msgid "MRP Qty Available" +#~ msgstr "Ctd. Disponible MRP" + +#~ msgid "MRP Verified" +#~ msgstr "Verificado para MRP" + +#~ msgid "Manufacture Actions" +#~ msgstr "Acciones de Fabricación" + +#~ msgid "Moves" +#~ msgstr "Movimientos" + +#~ msgid "Purchase Actions" +#~ msgstr "Acciones de Compra" + +#~ msgid "Search Product" +#~ msgstr "Buscar Producto" + +#~ msgid "With Actions" +#~ msgstr "Con Acciones" + +#~ msgid "With Actions in Coming 4 Weeks" +#~ msgstr "Con Acciones en las Próximas 4 Semanas" + +#~ msgid "With Moves" +#~ msgstr "Con Movimientos" diff --git a/mrp_multi_level/i18n/mrp_multi_level.pot b/mrp_multi_level/i18n/mrp_multi_level.pot index 6686b465d..424c1282c 100644 --- a/mrp_multi_level/i18n/mrp_multi_level.pot +++ b/mrp_multi_level/i18n/mrp_multi_level.pot @@ -20,6 +20,7 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_active +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_active msgid "Active" msgstr "" @@ -34,12 +35,12 @@ msgid "Assigned" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_lead_time +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_lead_time msgid "Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added." msgstr "" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Buy" msgstr "" @@ -72,7 +73,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_uid -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_create_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_uid msgid "Created by" msgstr "" @@ -83,7 +84,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_date -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_create_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_date msgid "Created on" msgstr "" @@ -97,20 +98,6 @@ msgstr "" msgid "Current Qty" msgstr "" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_current_qty_available -msgid "Current Qty Available" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_current_qty_available -msgid "Current quantity of products.\n" -"In a context with a single Stock Location, this includes goods stored at this Location, or any of its children.\n" -"In a context with a single Warehouse, this includes goods stored in the Stock Location of this Warehouse, or any of its children.\n" -"stored in the Stock Location of the Warehouse of this Shop, or any of its children.\n" -"Otherwise, this includes goods stored in any Stock Location with 'internal' type." -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_date msgid "Date" @@ -139,7 +126,6 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_name -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_name msgid "Description" msgstr "" @@ -150,7 +136,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_display_name -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_display_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_display_name msgid "Display Name" msgstr "" @@ -160,8 +146,7 @@ msgid "Draft" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_exclude -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_exclude +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude msgid "Exclude from MRP" msgstr "" @@ -194,7 +179,6 @@ msgstr "" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Group By..." msgstr "" @@ -205,21 +189,17 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_id msgid "ID" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_verified -#: model:ir.model.fields,help:mrp_multi_level.field_product_product_mrp_verified -#: model:ir.model.fields,help:mrp_multi_level.field_product_template_mrp_verified +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_verified msgid "Identifies that this product has been verified to be valid for the MRP." msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_inspection_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_inspection_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_inspection_delay +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_inspection_delay msgid "Inspection Delay" msgstr "" @@ -241,7 +221,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level___last_update -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product___last_update +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area___last_update msgid "Last Modified on" msgstr "" @@ -252,7 +232,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_uid -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_write_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_uid msgid "Last Updated by" msgstr "" @@ -263,12 +243,12 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_date -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_write_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_date msgid "Last Updated on" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_lead_time +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_lead_time msgid "Lead Time" msgstr "" @@ -279,16 +259,12 @@ msgid "Location" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_llc #: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_llc -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Low Level Code" msgstr "" #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_mrp -#: model:ir.ui.view,arch_db:mrp_multi_level.product_template_only_form_view_mrp -#: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_product_product_form #: selection:mrp.move,mrp_origin:0 #: model:product.category,name:mrp_multi_level.product_category_mrp msgid "MRP" @@ -300,8 +276,7 @@ msgid "MRP Action Date" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_applicable -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_applicable +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_applicable msgid "MRP Applicable" msgstr "" @@ -309,7 +284,6 @@ msgstr "" #: model:ir.actions.act_window,name:mrp_multi_level.mrp_area_action #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_area_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_stock_location_mrp_area_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_tree @@ -317,8 +291,22 @@ msgstr "" msgid "MRP Area" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_count +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_count +msgid "MRP Area Parameter Count" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_ids +msgid "MRP Area parameters" +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_areas +#: model:ir.ui.view,arch_db:mrp_multi_level.product_template_only_form_view_mrp +#: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_product_product_form msgid "MRP Areas" msgstr "" @@ -349,50 +337,22 @@ msgid "MRP Move UP" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_move_ids +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form msgid "MRP Moves" msgstr "" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_form -msgid "MRP Product" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_product_ids -msgid "MRP Product data" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.actions.act_window,name:mrp_multi_level.mrp_product_action -#: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_products -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_tree -msgid "MRP Products" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_qty_available -msgid "MRP Qty Available" -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_qty msgid "MRP Quantity" msgstr "" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_verified -msgid "MRP Verified" -msgstr "" - #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_inventory msgid "MRP inventory projections" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_main_supplier_id -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_main_supplier_id msgid "Main Supplier" msgstr "" @@ -401,11 +361,6 @@ msgstr "" msgid "Make Procurements from MRP inventory projections" msgstr "" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Manufacture Actions" -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_production_id #: selection:mrp.move,mrp_action:0 @@ -419,24 +374,18 @@ msgid "Manufacturing Orders" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_maximum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_maximum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_maximum_order_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_maximum_order_qty msgid "Maximum Order Qty" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_minimum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_minimum_order_qty -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_minimum_order_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_order_qty msgid "Minimum Order Qty" msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_minimum_stock +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock msgid "Minimum Stock" msgstr "" @@ -446,8 +395,8 @@ msgid "Move" msgstr "" #. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_product_form -msgid "Moves" +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_area_id +msgid "Mrp Area" msgstr "" #. module: mrp_multi_level @@ -455,6 +404,11 @@ msgstr "" msgid "Mrp Inventory" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_move_ids +msgid "Mrp Move" +msgstr "" + #. module: mrp_multi_level #: model:ir.actions.server,name:mrp_multi_level.mrp_multi_level_cron_ir_actions_server #: model:ir.cron,cron_name:mrp_multi_level.mrp_multi_level_cron @@ -468,24 +422,12 @@ msgid "Name" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_nbr_mrp_actions -msgid "Nbr Actions" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_nbr_mrp_actions_4w -msgid "Nbr Actions 4 Weeks" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_nbr_days -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_nbr_days -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_nbr_days +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_nbr_days msgid "Nbr. Days" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:175 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:166 #, python-format msgid "No MRP product found" msgstr "" @@ -496,9 +438,7 @@ msgid "None" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_mrp_product_mrp_nbr_days -#: model:ir.model.fields,help:mrp_multi_level.field_product_product_mrp_nbr_days -#: model:ir.model.fields,help:mrp_multi_level.field_product_template_mrp_nbr_days +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_nbr_days msgid "Number of days to group demand for this product during the MRP run, in order to determine the quantity to order." msgstr "" @@ -562,24 +502,47 @@ msgid "Procurement Request" msgstr "" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Produce" msgstr "" #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_product -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_product_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_id -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Product" msgstr "" +#. module: mrp_multi_level +#: model:ir.model,name:mrp_multi_level.model_product_mrp_area +msgid "Product MRP Area" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.actions.act_window,name:mrp_multi_level.product_mrp_area_action +#: model:ir.ui.menu,name:mrp_multi_level.menu_product_mrp_area_parameters +msgid "Product MRP Area Parameters" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_tree +msgid "Product MRP Area parameters" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_mrp_area_id +msgid "Product Parameters" +msgstr "" + #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_template -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_product_tmpl_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_tmpl_id msgid "Product Template" msgstr "" @@ -588,11 +551,6 @@ msgstr "" msgid "Product UoM" msgstr "" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Purchase Actions" -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_purchase_order_id #: selection:mrp.move,mrp_action:0 @@ -611,9 +569,7 @@ msgid "Purchase Orders" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_qty_multiple -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_qty_multiple -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_qty_multiple +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_qty_multiple msgid "Qty Multiple" msgstr "" @@ -622,6 +578,11 @@ msgstr "" msgid "Quantity" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_qty_available +msgid "Quantity Available" +msgstr "" + #. module: mrp_multi_level #: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 #, python-format @@ -668,14 +629,8 @@ msgstr "" msgid "SF-2" msgstr "" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "Search Product" -msgstr "" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form msgid "Selection..." msgstr "" @@ -700,7 +655,7 @@ msgid "Stock Move" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_main_supplierinfo_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_main_supplierinfo_id msgid "Supplier Info" msgstr "" @@ -711,11 +666,15 @@ msgid "Supply" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_supply_method -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_supply_method msgid "Supply Method" msgstr "" +#. module: mrp_multi_level +#: sql_constraint:product.mrp.area:0 +msgid "The product/MRP Area parameters combination must be unique." +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "To Approve" @@ -732,14 +691,12 @@ msgid "To procure" msgstr "" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Transfer" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_product_mrp_transit_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_transit_delay -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_transit_delay +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_transit_delay msgid "Transit Delay" msgstr "" @@ -749,7 +706,7 @@ msgid "Type" msgstr "" #. module: mrp_multi_level -#: selection:mrp.product,supply_method:0 +#: selection:product.mrp.area,supply_method:0 msgid "Undefined" msgstr "" @@ -767,8 +724,7 @@ msgid "Use this assistant to procure for this product and date.\n" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_verified -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_verified +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_verified msgid "Verified for MRP" msgstr "" @@ -783,21 +739,6 @@ msgstr "" msgid "Warehouse" msgstr "" -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Actions" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Actions in Coming 4 Weeks" -msgstr "" - -#. module: mrp_multi_level -#: model:ir.ui.view,arch_db:mrp_multi_level.mrp_search_form -msgid "With Moves" -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_wiz_id msgid "Wizard" @@ -828,11 +769,6 @@ msgstr "" msgid "mrp.multi.level" msgstr "" -#. module: mrp_multi_level -#: model:ir.model,name:mrp_multi_level.model_mrp_product -msgid "mrp.product" -msgstr "" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_run_mrp_multi_level_wizard msgid "or" From dab40c61da4f4f2fe88b5298fcbb0d29b311fafb Mon Sep 17 00:00:00 2001 From: Maria Sparenberg Date: Wed, 13 Feb 2019 13:24:31 +0000 Subject: [PATCH 035/188] Translated using Weblate (German) Currently translated at 100.0% (132 of 132 strings) Translation: manufacture-11.0/manufacture-11.0-mrp_multi_level Translate-URL: https://translation.odoo-community.org/projects/manufacture-11-0/manufacture-11-0-mrp_multi_level/de/ --- mrp_multi_level/i18n/de.po | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/mrp_multi_level/i18n/de.po b/mrp_multi_level/i18n/de.po index 656eb19f4..d36b1992c 100644 --- a/mrp_multi_level/i18n/de.po +++ b/mrp_multi_level/i18n/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2018-12-13 11:58+0000\n" +"PO-Revision-Date: 2019-02-13 15:50+0000\n" "Last-Translator: Maria Sparenberg \n" "Language-Team: none\n" "Language: de\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.3\n" +"X-Generator: Weblate 3.4\n" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action @@ -305,14 +305,13 @@ msgstr "Bereich" #: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_count #: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_count msgid "MRP Area Parameter Count" -msgstr "" +msgstr "Anzahl der Bereich-Parameter" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_product_mrp_area_ids #: model:ir.model.fields,field_description:mrp_multi_level.field_product_template_mrp_area_ids -#, fuzzy msgid "MRP Area parameters" -msgstr "Bereiche" +msgstr "Bereich-Parameter" #. module: mrp_multi_level #: model:ir.ui.menu,name:mrp_multi_level.menu_mrp_areas @@ -406,7 +405,6 @@ msgstr "Lagerbewegung" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_area_id -#, fuzzy msgid "Mrp Area" msgstr "Bereich" @@ -417,7 +415,6 @@ msgstr "Bestand (MRP)" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_move_ids -#, fuzzy msgid "Mrp Move" msgstr "Lagerbewegungen" @@ -535,29 +532,26 @@ msgstr "Produkt" #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_mrp_area -#, fuzzy msgid "Product MRP Area" -msgstr "Bereich" +msgstr "Produkt - Bereich" #. module: mrp_multi_level #: model:ir.actions.act_window,name:mrp_multi_level.product_mrp_area_action #: model:ir.ui.menu,name:mrp_multi_level.menu_product_mrp_area_parameters msgid "Product MRP Area Parameters" -msgstr "" +msgstr "Produkt-Bereich-Parameter" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_tree -#, fuzzy msgid "Product MRP Area parameters" -msgstr "Produktvorlage" +msgstr "Produkt-Bereich-Parameter" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_mrp_area_id -#, fuzzy msgid "Product Parameters" -msgstr "Produktvorlage" +msgstr "Produkt-Parameter" #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_product_template @@ -598,9 +592,8 @@ msgstr "Menge" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_qty_available -#, fuzzy msgid "Quantity Available" -msgstr "Aktuell verfügbare Menge" +msgstr "Verfügbare Menge" #. module: mrp_multi_level #: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 @@ -696,7 +689,7 @@ msgstr "Liefermethode" #. module: mrp_multi_level #: sql_constraint:product.mrp.area:0 msgid "The product/MRP Area parameters combination must be unique." -msgstr "" +msgstr "Die Kombination der Produkt-/Bereich-Parameter muss einzigartig sein." #. module: mrp_multi_level #: selection:mrp.move,state:0 From e77899b8e786937411b739ddf3021e7944634c5a Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Tue, 2 Apr 2019 11:09:19 +0200 Subject: [PATCH 036/188] [11.0][IMP] mrp_multi_level: be able to group demand when generating supply proposals --- mrp_multi_level/README.rst | 13 +-- mrp_multi_level/__manifest__.py | 4 +- mrp_multi_level/readme/HISTORY.rst | 7 ++ mrp_multi_level/readme/ROADMAP.rst | 2 - mrp_multi_level/static/description/index.html | 77 +++++++-------- mrp_multi_level/tests/test_mrp_multi_level.py | 57 ++++++++++- mrp_multi_level/wizards/mrp_multi_level.py | 96 ++++++++----------- 7 files changed, 149 insertions(+), 107 deletions(-) delete mode 100644 mrp_multi_level/readme/ROADMAP.rst diff --git a/mrp_multi_level/README.rst b/mrp_multi_level/README.rst index 1b79418f4..f98997dc3 100644 --- a/mrp_multi_level/README.rst +++ b/mrp_multi_level/README.rst @@ -78,15 +78,16 @@ To launch replenishment orders (moves, purchases, production orders...): hand side gears in any record. #. On the wizard, check everything is ok and click *Execute*. -Known issues / Roadmap -====================== - -* The functionality related to field *Nbr. Days* in products is not - functional for the time being. Please, stay tuned to future updates. - Changelog ========= +11.0.2.1.0 (2019-04-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [IMP] Implement *Nbr. Days* functionality to be able to group demand when + generating supply proposals. + (`#345 `_): + 11.0.2.0.0 (2018-11-20) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index f32d72a20..be4db8065 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -1,9 +1,9 @@ # Copyright 2016 Ucamco - Wim Audenaert -# Copyright 2016-18 Eficent Business and IT Consulting Services S.L. +# Copyright 2016-19 Eficent Business and IT Consulting Services S.L. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'MRP Multi Level', - 'version': '11.0.2.0.0', + 'version': '11.0.2.1.0', 'development_status': 'Beta', 'license': 'AGPL-3', 'author': 'Ucamco, ' diff --git a/mrp_multi_level/readme/HISTORY.rst b/mrp_multi_level/readme/HISTORY.rst index 03ff5468e..5bfd1ed95 100644 --- a/mrp_multi_level/readme/HISTORY.rst +++ b/mrp_multi_level/readme/HISTORY.rst @@ -1,3 +1,10 @@ +11.0.2.1.0 (2019-04-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [IMP] Implement *Nbr. Days* functionality to be able to group demand when + generating supply proposals. + (`#345 `_): + 11.0.2.0.0 (2018-11-20) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/readme/ROADMAP.rst b/mrp_multi_level/readme/ROADMAP.rst deleted file mode 100644 index b3ae9a0e8..000000000 --- a/mrp_multi_level/readme/ROADMAP.rst +++ /dev/null @@ -1,2 +0,0 @@ -* The functionality related to field *Nbr. Days* in products is not - functional for the time being. Please, stay tuned to future updates. diff --git a/mrp_multi_level/static/description/index.html b/mrp_multi_level/static/description/index.html index 8fc23d952..a584a53aa 100644 --- a/mrp_multi_level/static/description/index.html +++ b/mrp_multi_level/static/description/index.html @@ -386,40 +386,40 @@ and explodes this down to the lowest level.

Table of contents

-

Configuration

+

Configuration

-

MRP Areas

+

MRP Areas

  • Go to Manufacturing > Configuration > MRP Areas and define or edit any existing area. You can specify the working hours for every area.
-

Product MRP Area Parameters

+

Product MRP Area Parameters

  • Go to Manufacturing > Master Data > Product MRP Area Parameters and set the MRP parameters for a given product and area.
  • @@ -427,7 +427,7 @@ the MRP parameters for a given product and area.
-

Usage

+

Usage

To manually run the MRP scheduler:

  1. Go to Manufacturing > Operations > Run MRP Multi Level.
  2. @@ -442,17 +442,18 @@ hand side gears in any record.
  3. On the wizard, check everything is ok and click Execute.
-
-

Known issues / Roadmap

+
+

Changelog

+
+

11.0.2.1.0 (2019-04-02)

    -
  • The functionality related to field Nbr. Days in products is not -functional for the time being. Please, stay tuned to future updates.
  • +
  • [IMP] Implement Nbr. Days functionality to be able to group demand when +generating supply proposals. +(#345):
-
-

Changelog

-
-

11.0.2.0.0 (2018-11-20)

+
+

11.0.2.0.0 (2018-11-20)

  • [REW] Refactor MRP Area. (#322):
      @@ -464,15 +465,15 @@ different areas.
-
-

11.0.1.1.0 (2018-08-30)

+
+

11.0.1.1.0 (2018-08-30)

  • [FIX] Consider Qty Multiple on product to propose the quantity to procure. (#297)
-
-

11.0.1.0.1 (2018-08-03)

+
+

11.0.1.0.1 (2018-08-03)

  • [FIX] User and system locales doesn’t break MRP calculation. (#290)
  • @@ -481,15 +482,15 @@ as a related on MRP Areas. (#290)
-
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -497,16 +498,16 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Ucamco
  • Eficent
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose diff --git a/mrp_multi_level/tests/test_mrp_multi_level.py b/mrp_multi_level/tests/test_mrp_multi_level.py index c417a1fe1..0dc2cf1b0 100644 --- a/mrp_multi_level/tests/test_mrp_multi_level.py +++ b/mrp_multi_level/tests/test_mrp_multi_level.py @@ -1,4 +1,4 @@ -# Copyright 2018 Eficent Business and IT Consulting Services S.L. +# Copyright 2018-19 Eficent Business and IT Consulting Services S.L. # (http://www.eficent.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). @@ -17,6 +17,8 @@ class TestMrpMultiLevel(SavepointCase): cls.mo_obj = cls.env['mrp.production'] cls.po_obj = cls.env['purchase.order'] cls.product_obj = cls.env['product.product'] + cls.loc_obj = cls.env['stock.location'] + cls.mrp_area_obj = cls.env['mrp.area'] cls.product_mrp_area_obj = cls.env['product.mrp.area'] cls.partner_obj = cls.env['res.partner'] cls.stock_picking_obj = cls.env['stock.picking'] @@ -45,6 +47,18 @@ class TestMrpMultiLevel(SavepointCase): # Partner: vendor1 = cls.partner_obj.create({'name': 'Vendor 1'}) + # Create secondary location and MRP Area: + cls.sec_loc = cls.loc_obj.create({ + 'name': 'Test location', + 'usage': 'internal', + 'location_id': cls.wh.view_location_id.id, + }) + cls.secondary_area = cls.mrp_area_obj.create({ + 'name': 'Test', + 'warehouse_id': cls.wh.id, + 'location_id': cls.sec_loc.id, + }) + # Create products: route_buy = cls.env.ref('purchase.route_warehouse0_buy').id cls.prod_test = cls.product_obj.create({ @@ -59,6 +73,12 @@ class TestMrpMultiLevel(SavepointCase): 'product_id': cls.prod_test.id, 'mrp_area_id': cls.mrp_area.id, }) + # Parameters in secondary area with nbr_days set. + cls.product_mrp_area_obj.create({ + 'product_id': cls.prod_test.id, + 'mrp_area_id': cls.secondary_area.id, + 'mrp_nbr_days': 7, + }) cls.prod_min = cls.product_obj.create({ 'name': 'Product with minimum order qty', 'type': 'product', @@ -239,6 +259,8 @@ class TestMrpMultiLevel(SavepointCase): qty += 70.0 cls._create_demand_estimate( cls.prod_test, cls.stock_location, dr, qty) + cls._create_demand_estimate( + cls.prod_test, cls.sec_loc, dr, qty) cls.mrp_multi_level_wiz.create({}).run_mrp_multi_level() @@ -425,11 +447,13 @@ class TestMrpMultiLevel(SavepointCase): def test_06_demand_estimates(self): """Tests demand estimates integration.""" - estimates = self.estimate_obj.search( - [('product_id', '=', self.prod_test.id)]) + estimates = self.estimate_obj.search([ + ('product_id', '=', self.prod_test.id), + ('location_id', '=', self.stock_location.id)]) self.assertEqual(len(estimates), 3) moves = self.mrp_move_obj.search([ ('product_id', '=', self.prod_test.id), + ('mrp_area_id', '=', self.mrp_area.id), ]) # 3 weeks - 3 days in the past = 18 days of valid estimates: moves_from_estimates = moves.filtered(lambda m: m.mrp_type == 'd') @@ -440,6 +464,9 @@ class TestMrpMultiLevel(SavepointCase): self.assertIn(-50.0, quantities) # 350 a week => 50.0 dayly: actions = moves.filtered(lambda m: m.mrp_action == 'po') self.assertEqual(len(actions), 18) + inventories = self.mrp_inventory_obj.search([ + ('mrp_area_id', '=', self.secondary_area.id)]) + self.assertEqual(len(inventories), 18) def test_07_procure_mo(self): """Test procurement wizard with MOs.""" @@ -483,5 +510,29 @@ class TestMrpMultiLevel(SavepointCase): ('product_mrp_area_id.product_id', '=', self.prod_multiple.id)]) self.assertEqual(mrp_inv_multiple.to_procure, 125) + def test_09_group_demand(self): + """Test demand grouping functionality, `nbr_days`.""" + estimates = self.estimate_obj.search([ + ('product_id', '=', self.prod_test.id), + ('location_id', '=', self.sec_loc.id)]) + self.assertEqual(len(estimates), 3) + moves = self.mrp_move_obj.search([ + ('product_id', '=', self.prod_test.id), + ('mrp_area_id', '=', self.secondary_area.id), + ]) + # 3 weeks - 3 days in the past = 18 days of valid estimates: + moves_from_estimates = moves.filtered(lambda m: m.mrp_type == 'd') + self.assertEqual(len(moves_from_estimates), 18) + # 18 days of demand / 7 nbr_days = 2.57 => 3 supply moves expected. + supply_moves = moves.filtered(lambda m: m.mrp_type == 's') + self.assertEqual(len(supply_moves), 3) + quantities = supply_moves.mapped('mrp_qty') + week_1_expected = sum(moves_from_estimates[0:7].mapped('mrp_qty')) + self.assertIn(abs(week_1_expected), quantities) + week_2_expected = sum(moves_from_estimates[7:14].mapped('mrp_qty')) + self.assertIn(abs(week_2_expected), quantities) + week_3_expected = sum(moves_from_estimates[14:].mapped('mrp_qty')) + self.assertIn(abs(week_3_expected), quantities) + # TODO: test procure wizard: pos, multiple... # TODO: test multiple destination IDS:... diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 2143d0ca5..67b3b1f8b 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -1,6 +1,7 @@ -# © 2016 Ucamco - Wim Audenaert -# Copyright 2016-18 Eficent Business and IT Consulting Services S.L. +# Copyright 2016 Ucamco - Wim Audenaert +# Copyright 2016-19 Eficent Business and IT Consulting Services S.L. # - Jordi Ballester Alomar +# - Lois Rilo # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import api, fields, models, exceptions, _ @@ -507,64 +508,48 @@ class MultiLevelMrp(models.TransientModel): last_date = None last_qty = 0.00 onhand = product_mrp_area.qty_available - move_ids = [] - for move in product_mrp_area.mrp_move_ids: - move_ids.append(move.id) - for move_id in move_ids: - move_rec = self.env['mrp.move'].search( - [('id', '=', move_id)]) - for move in move_rec: - if move.mrp_action == 'none': - if last_date is not None: - if datetime.date( - datetime.strptime( - move.mrp_date, '%Y-%m-%d')) \ - > last_date+timedelta( - days=product_mrp_area.mrp_nbr_days): - if (onhand + last_qty + move.mrp_qty) \ - < product_mrp_area.mrp_minimum_stock \ - or (onhand + last_qty) \ - < product_mrp_area.mrp_minimum_stock: - name = 'Grouped Demand for %d Days' % \ - product_mrp_area.mrp_nbr_days - qtytoorder = \ - product_mrp_area.mrp_minimum_stock - \ - product_mrp_area - last_qty - cm = self.create_move( - product_mrp_area_id=product_mrp_area, - mrp_date=last_date, - mrp_qty=qtytoorder, - name=name) - qty_ordered = cm['qty_ordered'] - onhand = onhand + last_qty + qty_ordered - last_date = None - last_qty = 0.00 - nbr_create += 1 - if (onhand + last_qty + move.mrp_qty) < \ - product_mrp_area.mrp_minimum_stock or \ - (onhand + last_qty) < \ - product_mrp_area.mrp_minimum_stock: - if last_date is None: - last_date = datetime.date( - datetime.strptime(move.mrp_date, - '%Y-%m-%d')) - last_qty = move.mrp_qty - else: - last_qty = last_qty + move.mrp_qty - else: - last_date = datetime.date( - datetime.strptime(move.mrp_date, - '%Y-%m-%d')) - onhand = onhand + move.mrp_qty + grouping_delta = product_mrp_area.mrp_nbr_days + for move in product_mrp_area.mrp_move_ids.filtered( + lambda m: m.mrp_action == 'none'): + if last_date and ( + fields.Date.from_string(move.mrp_date) + >= last_date + timedelta(days=grouping_delta)) and ( + (onhand + last_qty + move.mrp_qty) + < product_mrp_area.mrp_minimum_stock + or (onhand + last_qty) + < product_mrp_area.mrp_minimum_stock): + name = 'Grouped Demand for %d Days' % grouping_delta + qtytoorder = product_mrp_area.mrp_minimum_stock - last_qty + cm = self.create_move( + product_mrp_area_id=product_mrp_area, + mrp_date=last_date, + mrp_qty=qtytoorder, + name=name) + qty_ordered = cm.get('qty_ordered', 0.0) + onhand = onhand + last_qty + qty_ordered + last_date = None + last_qty = 0.00 + nbr_create += 1 + if (onhand + last_qty + move.mrp_qty) < \ + product_mrp_area.mrp_minimum_stock or \ + (onhand + last_qty) < \ + product_mrp_area.mrp_minimum_stock: + if not last_date: + last_date = fields.Date.from_string(move.mrp_date) + last_qty = move.mrp_qty + else: + last_qty += move.mrp_qty + else: + last_date = fields.Date.from_string(move.mrp_date) + onhand += move.mrp_qty - if last_date is not None and last_qty != 0.00: - name = 'Grouped Demand for %d Days' % \ - (product_mrp_area.mrp_nbr_days, ) + if last_date and last_qty != 0.00: + name = 'Grouped Demand for %d Days' % grouping_delta qtytoorder = product_mrp_area.mrp_minimum_stock - onhand - last_qty cm = self.create_move( product_mrp_area_id=product_mrp_area, mrp_date=last_date, mrp_qty=qtytoorder, name=name) - qty_ordered = cm['qty_ordered'] + qty_ordered = cm.get('qty_ordered', 0.0) onhand += qty_ordered nbr_create += 1 return nbr_create @@ -605,7 +590,6 @@ class MultiLevelMrp(models.TransientModel): else: onhand += move.mrp_qty else: - # TODO: review this nbr_create = self._init_mrp_move_grouped_demand( nbr_create, product_mrp_area) From 2ce7f26ba63b2a236e3a7feac50b18177419631e Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 25 Apr 2019 08:04:51 +0000 Subject: [PATCH 037/188] [UPD] Update mrp_multi_level.pot --- mrp_multi_level/i18n/de.po | 2 +- mrp_multi_level/i18n/es.po | 2 +- mrp_multi_level/i18n/mrp_multi_level.pot | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mrp_multi_level/i18n/de.po b/mrp_multi_level/i18n/de.po index d36b1992c..6229feac5 100644 --- a/mrp_multi_level/i18n/de.po +++ b/mrp_multi_level/i18n/de.po @@ -436,7 +436,7 @@ msgid "Nbr. Days" msgstr "# Tage" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:166 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:167 #, python-format msgid "No MRP product found" msgstr "Kein Produkt für MRP gefunden" diff --git a/mrp_multi_level/i18n/es.po b/mrp_multi_level/i18n/es.po index bc4176f91..c676cc13f 100644 --- a/mrp_multi_level/i18n/es.po +++ b/mrp_multi_level/i18n/es.po @@ -434,7 +434,7 @@ msgid "Nbr. Days" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:166 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:167 #, python-format msgid "No MRP product found" msgstr "No se encontró producto MRP" diff --git a/mrp_multi_level/i18n/mrp_multi_level.pot b/mrp_multi_level/i18n/mrp_multi_level.pot index 424c1282c..3c56693b5 100644 --- a/mrp_multi_level/i18n/mrp_multi_level.pot +++ b/mrp_multi_level/i18n/mrp_multi_level.pot @@ -427,7 +427,7 @@ msgid "Nbr. Days" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:166 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:167 #, python-format msgid "No MRP product found" msgstr "" From 503ffb1e92fdf99b49915bf5a54219b29a2dc185 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Thu, 2 May 2019 13:00:48 +0200 Subject: [PATCH 038/188] [11.0][IMP] mrp_multi_level: * Able to run MRP only for selected areas. * Clean logging messages. --- mrp_multi_level/README.rst | 6 + mrp_multi_level/__manifest__.py | 2 +- mrp_multi_level/readme/HISTORY.rst | 6 + mrp_multi_level/static/description/index.html | 76 ++++++----- mrp_multi_level/tests/test_mrp_multi_level.py | 44 +++++- mrp_multi_level/wizards/mrp_multi_level.py | 127 ++++++++++-------- .../wizards/mrp_multi_level_views.xml | 3 + 7 files changed, 165 insertions(+), 99 deletions(-) diff --git a/mrp_multi_level/README.rst b/mrp_multi_level/README.rst index f98997dc3..1886afb25 100644 --- a/mrp_multi_level/README.rst +++ b/mrp_multi_level/README.rst @@ -81,6 +81,12 @@ To launch replenishment orders (moves, purchases, production orders...): Changelog ========= +11.0.2.2.0 (2019-05-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [IMP] Able to run MRP only for selected areas. + (`#360 `_): + 11.0.2.1.0 (2019-04-02) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index be4db8065..5d9252026 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'MRP Multi Level', - 'version': '11.0.2.1.0', + 'version': '11.0.2.2.0', 'development_status': 'Beta', 'license': 'AGPL-3', 'author': 'Ucamco, ' diff --git a/mrp_multi_level/readme/HISTORY.rst b/mrp_multi_level/readme/HISTORY.rst index 5bfd1ed95..0b86704df 100644 --- a/mrp_multi_level/readme/HISTORY.rst +++ b/mrp_multi_level/readme/HISTORY.rst @@ -1,3 +1,9 @@ +11.0.2.2.0 (2019-05-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [IMP] Able to run MRP only for selected areas. + (`#360 `_): + 11.0.2.1.0 (2019-04-02) ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/mrp_multi_level/static/description/index.html b/mrp_multi_level/static/description/index.html index a584a53aa..aa8f60935 100644 --- a/mrp_multi_level/static/description/index.html +++ b/mrp_multi_level/static/description/index.html @@ -386,40 +386,41 @@ and explodes this down to the lowest level.

Table of contents

-

Configuration

+

Configuration

-

MRP Areas

+

MRP Areas

  • Go to Manufacturing > Configuration > MRP Areas and define or edit any existing area. You can specify the working hours for every area.
-

Product MRP Area Parameters

+

Product MRP Area Parameters

  • Go to Manufacturing > Master Data > Product MRP Area Parameters and set the MRP parameters for a given product and area.
  • @@ -427,7 +428,7 @@ the MRP parameters for a given product and area.
-

Usage

+

Usage

To manually run the MRP scheduler:

  1. Go to Manufacturing > Operations > Run MRP Multi Level.
  2. @@ -443,17 +444,24 @@ hand side gears in any record.
-

Changelog

+

Changelog

-

11.0.2.1.0 (2019-04-02)

+

11.0.2.2.0 (2019-05-02)

+
    +
  • [IMP] Able to run MRP only for selected areas. +(#360):
  • +
+
+
+

11.0.2.1.0 (2019-04-02)

  • [IMP] Implement Nbr. Days functionality to be able to group demand when generating supply proposals. (#345):
-
-

11.0.2.0.0 (2018-11-20)

+
+

11.0.2.0.0 (2018-11-20)

  • [REW] Refactor MRP Area. (#322):
      @@ -465,15 +473,15 @@ different areas.
-
-

11.0.1.1.0 (2018-08-30)

+
+

11.0.1.1.0 (2018-08-30)

  • [FIX] Consider Qty Multiple on product to propose the quantity to procure. (#297)
-
-

11.0.1.0.1 (2018-08-03)

+
+

11.0.1.0.1 (2018-08-03)

  • [FIX] User and system locales doesn’t break MRP calculation. (#290)
  • @@ -482,15 +490,15 @@ as a related on MRP Areas. (#290)
-
-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed @@ -498,16 +506,16 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Ucamco
  • Eficent
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose diff --git a/mrp_multi_level/tests/test_mrp_multi_level.py b/mrp_multi_level/tests/test_mrp_multi_level.py index 0dc2cf1b0..09e00db97 100644 --- a/mrp_multi_level/tests/test_mrp_multi_level.py +++ b/mrp_multi_level/tests/test_mrp_multi_level.py @@ -21,6 +21,7 @@ class TestMrpMultiLevel(SavepointCase): cls.mrp_area_obj = cls.env['mrp.area'] cls.product_mrp_area_obj = cls.env['product.mrp.area'] cls.partner_obj = cls.env['res.partner'] + cls.res_users = cls.env['res.users'] cls.stock_picking_obj = cls.env['stock.picking'] cls.estimate_obj = cls.env['stock.demand.estimate'] cls.mrp_multi_level_wiz = cls.env['mrp.multi.level'] @@ -34,6 +35,7 @@ class TestMrpMultiLevel(SavepointCase): cls.sf_2 = cls.env.ref('mrp_multi_level.product_product_sf_2') cls.pp_1 = cls.env.ref('mrp_multi_level.product_product_pp_1') cls.pp_2 = cls.env.ref('mrp_multi_level.product_product_pp_2') + cls.company = cls.env.ref('base.main_company') cls.mrp_area = cls.env.ref('mrp_multi_level.mrp_area_stock_wh0') cls.vendor = cls.env.ref('mrp_multi_level.res_partner_lazer_tech') cls.wh = cls.env.ref('stock.warehouse0') @@ -47,6 +49,16 @@ class TestMrpMultiLevel(SavepointCase): # Partner: vendor1 = cls.partner_obj.create({'name': 'Vendor 1'}) + # Create user: + group_mrp_manager = cls.env.ref('mrp.group_mrp_manager') + group_user = cls.env.ref('base.group_user') + group_stock_manager = cls.env.ref('stock.group_stock_manager') + cls.mrp_manager = cls._create_user( + 'Test User', + [group_mrp_manager, group_user, group_stock_manager], + cls.company, + ) + # Create secondary location and MRP Area: cls.sec_loc = cls.loc_obj.create({ 'name': 'Test location', @@ -274,6 +286,18 @@ class TestMrpMultiLevel(SavepointCase): 'date_range_id': date_range.id, }) + @classmethod + def _create_user(cls, login, groups, company): + user = cls.res_users.create({ + 'name': login, + 'login': login, + 'password': 'demo', + 'email': 'example@yourcompany.com', + 'company_id': company.id, + 'groups_id': [(6, 0, [group.id for group in groups])] + }) + return user + def test_01_mrp_levels(self): """Tests computation of MRP levels.""" self.assertEqual(self.fp_1.llc, 0) @@ -438,12 +462,6 @@ class TestMrpMultiLevel(SavepointCase): self.assertEqual(len(moves), 6) expected = [200.0, 290.0, 90.0, 0.0, 72.0, 0.0] self.assertEqual(moves.mapped('running_availability'), expected) - # Actions counters for PP-1: - # product_mrp_area = self.product_mrp_area_obj.search([ - # ('product_id', '=', self.pp_1.id) - # ]) # TODO - # self.assertEqual(product_mrp_area.nbr_mrp_actions, 3) # TODO - # self.assertEqual(product_mrp_area.nbr_mrp_actions_4w, 3) # TODO def test_06_demand_estimates(self): """Tests demand estimates integration.""" @@ -534,5 +552,19 @@ class TestMrpMultiLevel(SavepointCase): week_3_expected = sum(moves_from_estimates[14:].mapped('mrp_qty')) self.assertIn(abs(week_3_expected), quantities) + def test_10_isolated_mrp_area_run(self): + """Test running MRP for just one area.""" + self.mrp_multi_level_wiz.sudo(self.mrp_manager).create({ + 'mrp_area_ids': [(6, 0, self.secondary_area.ids)], + }).run_mrp_multi_level() + this = self.mrp_inventory_obj.search([ + ('mrp_area_id', '=', self.secondary_area.id)], limit=1) + self.assertTrue(this) + # Only recently exectued areas should have been created by test user: + self.assertEqual(this.create_uid, self.mrp_manager) + prev = self.mrp_inventory_obj.search([ + ('mrp_area_id', '!=', self.secondary_area.id)], limit=1) + self.assertNotEqual(this.create_uid, prev.create_uid) + # TODO: test procure wizard: pos, multiple... # TODO: test multiple destination IDS:... diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 67b3b1f8b..eccd80b8c 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -15,6 +15,12 @@ logger = logging.getLogger(__name__) class MultiLevelMrp(models.TransientModel): _name = 'mrp.multi.level' + mrp_area_ids = fields.Many2many( + comodel_name="mrp.area", + string="MRP Areas to run", + help="If empty, all areas will be computed.", + ) + # TODO: dates are not being correctly computed for supply... @api.model @@ -269,31 +275,36 @@ class MultiLevelMrp(models.TransientModel): mrpmove_id2 = self.env['mrp.move'].create(move_data) mrpmove_id.mrp_move_down_ids = [(4, mrpmove_id2.id)] values['qty_ordered'] = qty_ordered - log_msg = '%s' % qty_ordered - logger.info(log_msg) + log_msg = '[%s] %s: qty_ordered = %s' % ( + product_mrp_area_id.mrp_area_id.name, + product_mrp_area_id.product_id.default_code or + product_mrp_area_id.product_id.name, + qty_ordered, + ) + logger.debug(log_msg) return values @api.model - def _mrp_cleanup(self): - # Some part of the code with the new API is replaced by - # sql statements due to performance issues when the auditlog is - # installed - logger.info('START MRP CLEANUP') - self.env['mrp.move'].search([]).unlink() - self.env['mrp.inventory'].search([]).unlink() - logger.info('END MRP CLEANUP') + def _mrp_cleanup(self, mrp_areas): + logger.info('Start MRP Cleanup') + domain = [] + if mrp_areas: + domain += [('mrp_area_id', 'in', mrp_areas.ids)] + self.env['mrp.move'].search(domain).unlink() + self.env['mrp.inventory'].search(domain).unlink() + logger.info('End MRP Cleanup') return True @api.model def _low_level_code_calculation(self): - logger.info('START LOW LEVEL CODE CALCULATION') + logger.info('Start low level code calculation') counter = 999999 llc = 0 self.env['product.product'].search([]).write({'llc': llc}) products = self.env['product.product'].search([('llc', '=', llc)]) if products: counter = len(products) - log_msg = 'LOW LEVEL CODE 0 FINISHED - NBR PRODUCTS: %s' % counter + log_msg = 'Low level code 0 finished - Nbr. products: %s' % counter logger.info(log_msg) while counter: @@ -308,33 +319,38 @@ class MultiLevelMrp(models.TransientModel): products.write({'llc': llc}) products = self.env['product.product'].search([('llc', '=', llc)]) counter = len(products) - log_msg = 'LOW LEVEL CODE %s FINISHED - NBR PRODUCTS: %s' % ( + log_msg = 'Low level code %s finished - Nbr. products: %s' % ( llc, counter) logger.info(log_msg) mrp_lowest_llc = llc - logger.info('END LOW LEVEL CODE CALCULATION') + logger.info('End low level code calculation') return mrp_lowest_llc @api.model - def _adjust_mrp_applicable(self): + def _adjust_mrp_applicable(self, mrp_areas): """This method is meant to modify the products that are applicable to MRP Multi level calculation """ return True @api.model - def _calculate_mrp_applicable(self): - logger.info('CALCULATE MRP APPLICABLE') - self.env['product.mrp.area'].search([]).write( + def _calculate_mrp_applicable(self, mrp_areas): + logger.info('Start Calculate MRP Applicable') + domain = [] + if mrp_areas: + domain += [('mrp_area_id', 'in', mrp_areas.ids)] + self.env['product.mrp.area'].search(domain).write( {'mrp_applicable': False}) - self.env['product.mrp.area'].search([ - ('product_id.type', '=', 'product'), - ]).write({'mrp_applicable': True}) - self._adjust_mrp_applicable() - counter = self.env['product.mrp.area'].search([ - ('mrp_applicable', '=', True)], count=True) - log_msg = 'END CALCULATE MRP APPLICABLE: %s' % counter + domain += [('product_id.type', '=', 'product')] + self.env['product.mrp.area'].search(domain).write( + {'mrp_applicable': True}) + self._adjust_mrp_applicable(mrp_areas) + count_domain = [('mrp_applicable', '=', True)] + if mrp_areas: + count_domain += [('mrp_area_id', 'in', mrp_areas.ids)] + counter = self.env['product.mrp.area'].search(count_domain, count=True) + log_msg = 'End Calculate MRP Applicable: %s' % counter logger.info(log_msg) return True @@ -484,11 +500,14 @@ class MultiLevelMrp(models.TransientModel): return product_mrp_area.mrp_exclude @api.model - def _mrp_initialisation(self): - logger.info('START MRP INITIALISATION') - mrp_areas = self.env['mrp.area'].search([]) + def _mrp_initialisation(self, mrp_areas): + logger.info('Start MRP initialisation') + if not mrp_areas: + mrp_areas = self.env['mrp.area'].search([]) product_mrp_areas = self.env['product.mrp.area'].search([ - ('mrp_applicable', '=', True)]) + ('mrp_area_id', 'in', mrp_areas.ids), + ('mrp_applicable', '=', True), + ]) init_counter = 0 for mrp_area in mrp_areas: for product_mrp_area in product_mrp_areas.filtered( @@ -497,11 +516,11 @@ class MultiLevelMrp(models.TransientModel): product_mrp_area.product_id, mrp_area): continue init_counter += 1 - log_msg = 'MRP INIT: %s - %s ' % ( + log_msg = 'MRP Init: %s - %s ' % ( init_counter, product_mrp_area.display_name) logger.info(log_msg) self._init_mrp_move(product_mrp_area) - logger.info('END MRP INITIALISATION') + logger.info('End MRP initialisation') @api.model def _init_mrp_move_grouped_demand(self, nbr_create, product_mrp_area): @@ -555,11 +574,13 @@ class MultiLevelMrp(models.TransientModel): return nbr_create @api.model - def _mrp_calculation(self, mrp_lowest_llc): - logger.info('START MRP CALCULATION') + def _mrp_calculation(self, mrp_lowest_llc, mrp_areas): + logger.info('Start MRP calculation') product_mrp_area_obj = self.env['product.mrp.area'] counter = 0 - for mrp_area in self.env['mrp.area'].search([]): + if not mrp_areas: + mrp_areas = self.env['mrp.area'].search([]) + for mrp_area in mrp_areas: llc = 0 while mrp_lowest_llc > llc: product_mrp_areas = product_mrp_area_obj.search( @@ -606,11 +627,11 @@ class MultiLevelMrp(models.TransientModel): onhand += qty_ordered counter += 1 - log_msg = 'MRP CALCULATION LLC %s FINISHED - NBR PRODUCTS: %s' % ( + log_msg = 'MRP Calculation LLC %s Finished - Nbr. products: %s' % ( llc - 1, counter) logger.info(log_msg) - logger.info('END MRP CALCULATION') + logger.info('Enb MRP calculation') @api.model def _get_demand_groups(self, product_mrp_area): @@ -714,10 +735,12 @@ class MultiLevelMrp(models.TransientModel): self.env['mrp.inventory'].create(mrp_inventory_data) @api.model - def _mrp_final_process(self): - logger.info('START MRP FINAL PROCESS') - product_mrp_area_ids = self.env['product.mrp.area'].search([ - ('product_id.llc', '<', 9999)]) + def _mrp_final_process(self, mrp_areas): + logger.info('Start MRP final process') + domain = [('product_id.llc', '<', 9999)] + if mrp_areas: + domain += [('mrp_area_id', 'in', mrp_areas.ids)] + product_mrp_area_ids = self.env['product.mrp.area'].search(domain) for product_mrp_area in product_mrp_area_ids: # Build the time-phased inventory @@ -732,25 +755,13 @@ class MultiLevelMrp(models.TransientModel): for move in moves: qoh = qoh + move.mrp_qty move.running_availability = qoh - # TODO: Possible clean up needed here - # nbr_actions = product_mrp_area.mrp_move_ids.filtered( - # lambda m: m.mrp_action != 'none') - # horizon_4w = fields.Date.to_string( - # date.today() + timedelta(weeks=4)) - # nbr_actions_4w = nbr_actions.filtered( - # lambda m: m.mrp_action_date < horizon_4w) - # if nbr_actions: - # product_mrp_area.write({ - # 'nbr_mrp_actions': len(nbr_actions), - # 'nbr_mrp_actions_4w': len(nbr_actions_4w), - # }) - logger.info('END MRP FINAL PROCESS') + logger.info('End MRP final process') @api.multi def run_mrp_multi_level(self): - self._mrp_cleanup() + self._mrp_cleanup(self.mrp_area_ids) mrp_lowest_llc = self._low_level_code_calculation() - self._calculate_mrp_applicable() - self._mrp_initialisation() - self._mrp_calculation(mrp_lowest_llc) - self._mrp_final_process() + self._calculate_mrp_applicable(self.mrp_area_ids) + self._mrp_initialisation(self.mrp_area_ids) + self._mrp_calculation(mrp_lowest_llc, self.mrp_area_ids) + self._mrp_final_process(self.mrp_area_ids) diff --git a/mrp_multi_level/wizards/mrp_multi_level_views.xml b/mrp_multi_level/wizards/mrp_multi_level_views.xml index f7272199e..3685ab597 100644 --- a/mrp_multi_level/wizards/mrp_multi_level_views.xml +++ b/mrp_multi_level/wizards/mrp_multi_level_views.xml @@ -6,6 +6,9 @@ mrp.multi.level

+ + +
+
+

11.0.2.2.0 (2019-05-02)

  • [IMP] Able to run MRP only for selected areas. -(#360):
  • +(#360).
@@ -465,7 +466,7 @@ hand side gears in any record.
  • [IMP] Implement Nbr. Days functionality to be able to group demand when generating supply proposals. -(#345):
  • +(#345).
diff --git a/mrp_multi_level/views/product_mrp_area_views.xml b/mrp_multi_level/views/product_mrp_area_views.xml index 5580953a4..0bd3b7e61 100644 --- a/mrp_multi_level/views/product_mrp_area_views.xml +++ b/mrp_multi_level/views/product_mrp_area_views.xml @@ -44,6 +44,8 @@ + + @@ -107,6 +109,7 @@ + diff --git a/mrp_multi_level/wizards/mrp_inventory_procure.py b/mrp_multi_level/wizards/mrp_inventory_procure.py index 0bf65ca2c..11875d87c 100644 --- a/mrp_multi_level/wizards/mrp_inventory_procure.py +++ b/mrp_multi_level/wizards/mrp_inventory_procure.py @@ -26,7 +26,9 @@ class MrpInventoryProcure(models.TransientModel): 'mrp_inventory_id': planned_order.mrp_inventory_id.id, 'product_id': planned_order.product_id.id, 'warehouse_id': planned_order.mrp_area_id.warehouse_id.id, - 'location_id': planned_order.mrp_area_id.location_id.id, + 'location_id': + planned_order.product_mrp_area_id.location_proc_id.id or + planned_order.mrp_area_id.location_id.id, } @api.model From a011e5f740213bb411ded6aaf06e9ddcc3a2122b Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Mon, 3 Jun 2019 13:42:06 +0200 Subject: [PATCH 042/188] [11.0][FIX] mrp_multi_level: pass a context to exclude hook when exploding. --- mrp_multi_level/wizards/mrp_multi_level.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index ec5204276..cb3f19a71 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -221,7 +221,7 @@ class MultiLevelMrp(models.TransientModel): if bomline.product_qty <= 0.00 or \ bomline.product_id.type != 'product': continue - if self._exclude_from_mrp( + if self.with_context(mrp_explosion=True)._exclude_from_mrp( bomline.product_id, product_mrp_area_id.mrp_area_id): # Stop explosion. @@ -745,6 +745,10 @@ class MultiLevelMrp(models.TransientModel): for product_mrp_area in product_mrp_area_ids: # Build the time-phased inventory + if self._exclude_from_mrp( + product_mrp_area.product_id, + product_mrp_area.mrp_area_id): + continue self._init_mrp_inventory(product_mrp_area) logger.info('End MRP final process') From b6708a60f19f7fef390a05ef63228ecb2c9b306f Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Mon, 3 Jun 2019 14:51:54 +0200 Subject: [PATCH 043/188] [11.0][FIX] mrp_multi_level: fix supply method computation and add required fields. --- mrp_multi_level/models/mrp_inventory.py | 1 + mrp_multi_level/models/mrp_move.py | 1 + mrp_multi_level/models/mrp_planned_order.py | 3 +++ mrp_multi_level/models/product_mrp_area.py | 4 ++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mrp_multi_level/models/mrp_inventory.py b/mrp_multi_level/models/mrp_inventory.py index 9457161d7..be68f3a5f 100644 --- a/mrp_multi_level/models/mrp_inventory.py +++ b/mrp_multi_level/models/mrp_inventory.py @@ -26,6 +26,7 @@ class MrpInventory(models.Model): product_mrp_area_id = fields.Many2one( comodel_name='product.mrp.area', string='Product Parameters', index=True, + required=True, ) product_id = fields.Many2one( comodel_name='product.product', diff --git a/mrp_multi_level/models/mrp_move.py b/mrp_multi_level/models/mrp_move.py index a92733954..0813b6462 100644 --- a/mrp_multi_level/models/mrp_move.py +++ b/mrp_multi_level/models/mrp_move.py @@ -14,6 +14,7 @@ class MrpMove(models.Model): product_mrp_area_id = fields.Many2one( comodel_name="product.mrp.area", string="Product", index=True, + required=True, ) mrp_area_id = fields.Many2one( comodel_name="mrp.area", diff --git a/mrp_multi_level/models/mrp_planned_order.py b/mrp_multi_level/models/mrp_planned_order.py index 70162980f..9c303e3fc 100644 --- a/mrp_multi_level/models/mrp_planned_order.py +++ b/mrp_multi_level/models/mrp_planned_order.py @@ -15,6 +15,7 @@ class MrpPlannedOrder(models.Model): comodel_name="product.mrp.area", string="Product", index=True, + required=True, ) mrp_area_id = fields.Many2one( comodel_name="mrp.area", @@ -22,11 +23,13 @@ class MrpPlannedOrder(models.Model): string="MRP Area", store=True, index=True, + readonly=True, ) product_id = fields.Many2one( comodel_name="product.product", related="product_mrp_area_id.product_id", store=True, + readonly=True, ) order_release_date = fields.Date( string="Release Date", diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index 18d12df42..635a9699c 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -131,13 +131,13 @@ class ProductMRPArea(models.Model): def _compute_supply_method(self): group_obj = self.env['procurement.group'] for rec in self: + proc_loc = rec.location_proc_id or rec.mrp_area_id.location_id values = { 'warehouse_id': rec.mrp_area_id.warehouse_id, 'company_id': self.env.user.company_id.id, # TODO: better way to get company } - rule = group_obj._get_rule( - rec.product_id, rec.mrp_area_id.location_id, values) + rule = group_obj._get_rule(rec.product_id, proc_loc, values) rec.supply_method = rule.action if rule else 'none' @api.multi From 9fd02aaa765bdd86824aaf4c9b9813facd9657a1 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 5 Jun 2019 13:13:19 +0200 Subject: [PATCH 044/188] [11.0][IMP] mrp_multi_level: able to group demand estimates or to ignore them. --- mrp_multi_level/models/product_mrp_area.py | 22 ++++++++++++++++++- .../views/product_mrp_area_views.xml | 1 + mrp_multi_level/wizards/mrp_multi_level.py | 21 ++++++++++++------ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index 635a9699c..ff6d153e0 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -6,7 +6,8 @@ from math import ceil -from odoo import api, fields, models +from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class ProductMRPArea(models.Model): @@ -98,11 +99,30 @@ class ProductMRPArea(models.Model): inverse_name="product_mrp_area_id", readonly=True, ) + group_estimate_days = fields.Integer( + string="Group Days of Estimates", + default=1, + ) _sql_constraints = [ ('product_mrp_area_uniq', 'unique(product_id, mrp_area_id)', 'The product/MRP Area parameters combination must be unique.'), ] + @api.multi + @api.constrains( + "mrp_minimum_order_qty", "mrp_maximum_order_qty", "mrp_qty_multiple", + "mrp_minimum_stock", "mrp_nbr_days", "group_estimate_days", + ) + def _check_negatives(self): + values = self.read([ + "mrp_minimum_order_qty", "mrp_maximum_order_qty", + "mrp_qty_multiple", + "mrp_minimum_stock", "mrp_nbr_days", "group_estimate_days", + ]) + for rec in values: + if any(v < 0 for v in rec.values()): + raise ValidationError(_("You cannot use a negative number.")) + @api.multi def name_get(self): return [(area.id, '[%s] %s' % ( diff --git a/mrp_multi_level/views/product_mrp_area_views.xml b/mrp_multi_level/views/product_mrp_area_views.xml index 0bd3b7e61..db4df6315 100644 --- a/mrp_multi_level/views/product_mrp_area_views.xml +++ b/mrp_multi_level/views/product_mrp_area_views.xml @@ -51,6 +51,7 @@ + diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index cb3f19a71..69241b853 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -58,7 +58,7 @@ class MultiLevelMrp(models.TransientModel): 'purchase_order_id': None, 'purchase_line_id': None, 'stock_move_id': None, - 'mrp_qty': -daily_qty, + 'mrp_qty': -daily_qty * product_mrp_area.group_estimate_days, 'current_qty': -daily_qty, 'mrp_date': date, 'current_date': date, @@ -360,21 +360,28 @@ class MultiLevelMrp(models.TransientModel): return True @api.model - def _init_mrp_move_from_forecast(self, product_mrp_area): + def _estimates_domain(self, product_mrp_area): locations = product_mrp_area.mrp_area_id._get_locations() - today = fields.Date.today() - estimates = self.env['stock.demand.estimate'].search([ + return [ ('product_id', '=', product_mrp_area.product_id.id), ('location_id', 'in', locations.ids), - ('date_range_id.date_end', '>=', today) - ]) + ('date_range_id.date_end', '>=', fields.Date.today()), + ] + + @api.model + def _init_mrp_move_from_forecast(self, product_mrp_area): + if not product_mrp_area.group_estimate_days: + return False + today = fields.Date.today() + domain = self._estimates_domain(product_mrp_area) + estimates = self.env['stock.demand.estimate'].search(domain) for rec in estimates: start = rec.date_range_id.date_start if start < today: start = today mrp_date = fields.Date.from_string(start) date_end = fields.Date.from_string(rec.date_range_id.date_end) - delta = timedelta(days=1) + delta = timedelta(days=product_mrp_area.group_estimate_days) while mrp_date <= date_end: mrp_move_data = \ self._prepare_mrp_move_data_from_forecast( From ba30b2ac56285c84ffec07987120317979c970d3 Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Thu, 6 Jun 2019 13:12:05 +0200 Subject: [PATCH 045/188] [11.0][FIX] mrp_multi_level: remove unralated security group in views. --- mrp_multi_level/views/product_product_views.xml | 2 +- mrp_multi_level/views/product_template_views.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mrp_multi_level/views/product_product_views.xml b/mrp_multi_level/views/product_product_views.xml index ad24d4863..c296c5434 100644 --- a/mrp_multi_level/views/product_product_views.xml +++ b/mrp_multi_level/views/product_product_views.xml @@ -12,7 +12,7 @@ name="action_view_mrp_area_parameters" class="oe_stat_button" icon="fa-eject" - groups="mrp.group_mrp_user,rma.group_mrp_manager"> + groups="mrp.group_mrp_user"> diff --git a/mrp_multi_level/views/product_template_views.xml b/mrp_multi_level/views/product_template_views.xml index 1a5e9ddd5..8527a11c6 100644 --- a/mrp_multi_level/views/product_template_views.xml +++ b/mrp_multi_level/views/product_template_views.xml @@ -11,7 +11,7 @@ name="action_view_mrp_area_parameters" class="oe_stat_button" icon="fa-eject" - groups="mrp.group_mrp_user,rma.group_mrp_manager"> + groups="mrp.group_mrp_user"> From 66320d0aaec4c6c06e2358f24b43d1ad53e3b14d Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 6 Jun 2019 12:38:09 +0000 Subject: [PATCH 046/188] [UPD] Update mrp_multi_level.pot --- mrp_multi_level/i18n/de.po | 191 ++++++++++++++++++----- mrp_multi_level/i18n/es.po | 180 ++++++++++++++++----- mrp_multi_level/i18n/mrp_multi_level.pot | 142 +++++++++++++---- 3 files changed, 403 insertions(+), 110 deletions(-) diff --git a/mrp_multi_level/i18n/de.po b/mrp_multi_level/i18n/de.po index 081dc74dc..11f3a4040 100644 --- a/mrp_multi_level/i18n/de.po +++ b/mrp_multi_level/i18n/de.po @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Weblate 3.4\n" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_action msgid "Action" msgstr "Aktion" @@ -32,20 +32,22 @@ msgstr "Aktiv" msgid "Approved" msgstr "Genehmigt" +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search +msgid "Archived" +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "Assigned" msgstr "Zugewiesen" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_lead_time -msgid "" -"Average delay in days to produce this product. In the case of multi-level " -"BOM, the manufacturing lead times of the components will be added." -msgstr "" -"Durchschnittliche Dauer für die Produktion des Produktes. Im Fall einer " -"mehrstufigen Stückliste wird die Fertigungsdurchlaufzeit der Komponenten " -"addiert." +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_inventory_id +#, fuzzy +#| msgid "Forecasted Inventory" +msgid "Associated MRP Inventory" +msgstr "Vorhergesagter Bestand" #. module: mrp_multi_level #: selection:product.mrp.area,supply_method:0 @@ -55,7 +57,6 @@ msgstr "Einkaufen" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard #: model:ir.ui.view,arch_db:mrp_multi_level.view_run_mrp_multi_level_wizard -#: selection:mrp.move,mrp_action:0 msgid "Cancel" msgstr "Abbrechen" @@ -81,6 +82,7 @@ msgstr "Beschaffung erzeugen" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_uid msgid "Created by" msgstr "Erstellt von" @@ -92,6 +94,7 @@ msgstr "Erstellt von" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_date msgid "Created on" msgstr "Erstellt am" @@ -111,6 +114,11 @@ msgstr "Aktuelle Menge" msgid "Date" msgstr "Datum" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_due_date +msgid "Date in which the supply must have been completed." +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Date to Procure (By Day)" @@ -134,6 +142,7 @@ msgstr "Nachfrage" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_name msgid "Description" msgstr "Beschreibung" @@ -144,6 +153,7 @@ msgstr "Beschreibung" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_display_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_display_name msgid "Display Name" msgstr "Anzeigename" @@ -153,6 +163,13 @@ msgstr "Anzeigename" msgid "Draft" msgstr "Entwurf" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_due_date +#, fuzzy +#| msgid "Current Date" +msgid "Due Date" +msgstr "Aktuelles Datum" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude msgid "Exclude from MRP" @@ -175,6 +192,11 @@ msgstr "FP-1" msgid "FP-2" msgstr "FP-2" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_fixed +msgid "Fixed" +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 msgid "Forecast" @@ -190,6 +212,11 @@ msgstr "Vorhergesagter Bestand" msgid "Group By..." msgstr "Gruppiere nach..." +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_group_estimate_days +msgid "Group Days of Estimates" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_id @@ -197,6 +224,7 @@ msgstr "Gruppiere nach..." #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_id msgid "ID" msgstr "ID" @@ -236,6 +264,7 @@ msgstr "Positionen" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level___last_update +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area___last_update msgid "Last Modified on" msgstr "Zuletzt geändert am" @@ -247,6 +276,7 @@ msgstr "Zuletzt geändert am" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_uid msgid "Last Updated by" msgstr "Zuletzt aktualisiert von" @@ -258,6 +288,7 @@ msgstr "Zuletzt aktualisiert von" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_date msgid "Last Updated on" msgstr "Zuletzt aktualisiert am" @@ -270,6 +301,7 @@ msgstr "Durchlaufzeit" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_location_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_location_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_id msgid "Location" msgstr "Lagerort" @@ -285,11 +317,6 @@ msgstr "Dispositionsstufe" msgid "MRP" msgstr "Ressourcenplanung" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action_date -msgid "MRP Action Date" -msgstr "Aktionsdatum" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_applicable msgid "MRP Applicable" @@ -299,6 +326,7 @@ msgstr "Ressourcenplanung anwendbar" #: model:ir.actions.act_window,name:mrp_multi_level.mrp_area_action #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_stock_location_mrp_area_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_tree @@ -349,15 +377,10 @@ msgid "MRP Inventory" msgstr "Bestand" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_move_down_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_move_down_ids msgid "MRP Move DOWN" msgstr "nach unten verschieben" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_move_up_ids -msgid "MRP Move UP" -msgstr "nach oben verschieben" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form msgid "MRP Moves" @@ -385,7 +408,7 @@ msgstr "Beschaffungen aus den Bestandsvorhersagen (MRP) erstellen" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_production_id -#: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 +#: selection:mrp.move,mrp_origin:0 selection:mrp.planned.order,mrp_action:0 msgid "Manufacturing Order" msgstr "Fertigungsauftrag" @@ -404,12 +427,6 @@ msgstr "Maximale Auftragsmenge" msgid "Minimum Order Qty" msgstr "Minimale Auftragsmenge" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock -msgid "Minimum Stock" -msgstr "Mindestbestand" - #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 msgid "Move" @@ -448,13 +465,13 @@ msgid "Nbr. Days" msgstr "# Tage" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:173 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:156 #, python-format msgid "No MRP product found" msgstr "Kein Produkt für MRP gefunden" #. module: mrp_multi_level -#: selection:mrp.move,mrp_action:0 +#: selection:mrp.planned.order,mrp_action:0 msgid "None" msgstr "Keines" @@ -477,6 +494,13 @@ msgstr "Auftragsnummer" msgid "Order Release Date" msgstr "Auftragsfreigabe-Datum" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_order_release_date +#, fuzzy +#| msgid "Order Release Date" +msgid "Order release date planned by MRP." +msgstr "Auftragsfreigabe-Datum" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_origin msgid "Origin" @@ -506,21 +530,54 @@ msgstr "Übergeordnetes Produkt" msgid "Partially Available" msgstr "Teilweise verfügbar" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_running_availability +#, fuzzy +#| msgid "Running Availability" +msgid "Planned Availability" +msgstr "Laufende Verfügbarkeit" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_date_planned msgid "Planned Date" msgstr "Geplantes Datum" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_processed -msgid "Processed" -msgstr "Bearbeitet" +#: model:ir.model,name:mrp_multi_level.model_mrp_planned_order +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_planned_order_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_planned_order_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_planned_order_ids +#, fuzzy +#| msgid "Planned Date" +msgid "Planned Order" +msgstr "Geplantes Datum" + +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form +#, fuzzy +#| msgid "Planned Date" +msgid "Planned Orders" +msgstr "Geplantes Datum" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_planned_order_up_ids +#, fuzzy +#| msgid "Purchase Orders" +msgid "Planned Orders UP" +msgstr "Einkaufsbestellungen" #. module: mrp_multi_level #: model:ir.actions.act_window,name:mrp_multi_level.act_mrp_inventory_procure msgid "Procure" msgstr "Beschaffen" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_proc_id +#, fuzzy +#| msgid "Location" +msgid "Procure Location" +msgstr "Lagerort" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard msgid "Procurement Request" @@ -537,6 +594,8 @@ msgstr "Produzieren" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_product_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Product" @@ -578,7 +637,7 @@ msgstr "Produkt ME" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_purchase_order_id -#: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 +#: selection:mrp.move,mrp_origin:0 selection:mrp.planned.order,mrp_action:0 msgid "Purchase Order" msgstr "Einkaufsbestellung" @@ -597,8 +656,14 @@ msgstr "Einkaufsbestellungen" msgid "Qty Multiple" msgstr "Mengenfaktor" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_qty_released +msgid "Qty Released" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_qty msgid "Quantity" msgstr "Menge" @@ -608,7 +673,7 @@ msgid "Quantity Available" msgstr "Verfügbare Menge" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 +#: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:75 #, python-format msgid "Quantity must be positive." msgstr "Die Menge muss größer als 0 sein." @@ -618,6 +683,13 @@ msgstr "Die Menge muss größer als 0 sein." msgid "Ready" msgstr "Bereit" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_order_release_date +#, fuzzy +#| msgid "Order Release Date" +msgid "Release Date" +msgstr "Auftragsfreigabe-Datum" + #. module: mrp_multi_level #: model:ir.model.fields,help:mrp_multi_level.field_stock_location_mrp_area_id msgid "" @@ -639,11 +711,6 @@ msgstr "Ressourcenplanung (MRP) ausführen" msgid "Run MRP Multi Level" msgstr "Mehrstufige Ressourcenplanung (MRP) ausführen" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_running_availability -msgid "Running Availability" -msgstr "Laufende Verfügbarkeit" - #. module: mrp_multi_level #: model:product.product,name:mrp_multi_level.product_product_sf_1 #: model:product.template,name:mrp_multi_level.product_product_sf_1_product_template @@ -657,6 +724,11 @@ msgstr "SF-1" msgid "SF-2" msgstr "SF-2" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock +msgid "Safety Stock" +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Selection..." @@ -667,6 +739,13 @@ msgstr "Auswahl..." msgid "Sent" msgstr "Gesendet" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_location_proc_id +msgid "" +"Set this if you need to procure from a different locationthan area's " +"location." +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_initial_on_hand_qty msgid "Starting Inventory" @@ -703,6 +782,11 @@ msgstr "Liefermethode" msgid "The product/MRP Area parameters combination must be unique." msgstr "Die Kombination der Produkt-/Bereich-Parameter muss einzigartig sein." +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_inventory_running_availability +msgid "Theoretical inventory level if all planned orderswere released." +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "To Approve" @@ -719,6 +803,7 @@ msgid "To procure" msgstr "Beschaffen" #. module: mrp_multi_level +#: selection:mrp.planned.order,mrp_action:0 #: selection:product.mrp.area,supply_method:0 msgid "Transfer" msgstr "Umbuchen" @@ -783,6 +868,12 @@ msgstr "Assistent" msgid "Working Hours" msgstr "Arbeitsstunden" +#. module: mrp_multi_level +#: code:addons/mrp_multi_level/models/product_mrp_area.py:124 +#, python-format +msgid "You cannot use a negative number." +msgstr "" + #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_area msgid "mrp.area" @@ -808,6 +899,26 @@ msgstr "mrp.multi.level" msgid "or" msgstr "oder" +#~ msgid "" +#~ "Average delay in days to produce this product. In the case of multi-level " +#~ "BOM, the manufacturing lead times of the components will be added." +#~ msgstr "" +#~ "Durchschnittliche Dauer für die Produktion des Produktes. Im Fall einer " +#~ "mehrstufigen Stückliste wird die Fertigungsdurchlaufzeit der Komponenten " +#~ "addiert." + +#~ msgid "MRP Action Date" +#~ msgstr "Aktionsdatum" + +#~ msgid "MRP Move UP" +#~ msgstr "nach oben verschieben" + +#~ msgid "Minimum Stock" +#~ msgstr "Mindestbestand" + +#~ msgid "Processed" +#~ msgstr "Bearbeitet" + #~ msgid "" #~ "Current quantity of products.\n" #~ "In a context with a single Stock Location, this includes goods stored at " diff --git a/mrp_multi_level/i18n/es.po b/mrp_multi_level/i18n/es.po index c24f117c8..03c155aec 100644 --- a/mrp_multi_level/i18n/es.po +++ b/mrp_multi_level/i18n/es.po @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Weblate 3.1.1\n" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_action msgid "Action" msgstr "Acción" @@ -32,17 +32,22 @@ msgstr "Activo" msgid "Approved" msgstr "Aprobado" +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search +msgid "Archived" +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "Assigned" msgstr "Asignado" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_lead_time -msgid "" -"Average delay in days to produce this product. In the case of multi-level " -"BOM, the manufacturing lead times of the components will be added." -msgstr "" +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_inventory_id +#, fuzzy +#| msgid "Forecasted Inventory" +msgid "Associated MRP Inventory" +msgstr "Previsión de stock" #. module: mrp_multi_level #: selection:product.mrp.area,supply_method:0 @@ -52,7 +57,6 @@ msgstr "Comprar" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard #: model:ir.ui.view,arch_db:mrp_multi_level.view_run_mrp_multi_level_wizard -#: selection:mrp.move,mrp_action:0 msgid "Cancel" msgstr "Cancelar" @@ -78,6 +82,7 @@ msgstr "Crear Aprovisionamiento" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_uid msgid "Created by" msgstr "Creado por" @@ -89,6 +94,7 @@ msgstr "Creado por" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_date msgid "Created on" msgstr "Creado en" @@ -108,6 +114,11 @@ msgstr "Ctd. actual" msgid "Date" msgstr "Fecha" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_due_date +msgid "Date in which the supply must have been completed." +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Date to Procure (By Day)" @@ -131,6 +142,7 @@ msgstr "Demanda" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_name msgid "Description" msgstr "Descripción" @@ -141,6 +153,7 @@ msgstr "Descripción" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_display_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_display_name msgid "Display Name" msgstr "Nombre de Visualización" @@ -150,6 +163,13 @@ msgstr "Nombre de Visualización" msgid "Draft" msgstr "Borrador" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_due_date +#, fuzzy +#| msgid "Current Date" +msgid "Due Date" +msgstr "Fecha actual" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude msgid "Exclude from MRP" @@ -172,6 +192,11 @@ msgstr "FP-1" msgid "FP-2" msgstr "FP-2" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_fixed +msgid "Fixed" +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 msgid "Forecast" @@ -187,6 +212,11 @@ msgstr "Previsión de stock" msgid "Group By..." msgstr "Agrupar por..." +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_group_estimate_days +msgid "Group Days of Estimates" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_id @@ -194,6 +224,7 @@ msgstr "Agrupar por..." #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_id msgid "ID" msgstr "ID" @@ -231,6 +262,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level___last_update +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area___last_update msgid "Last Modified on" msgstr "Última Modificación en" @@ -242,6 +274,7 @@ msgstr "Última Modificación en" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_uid msgid "Last Updated by" msgstr "Última Modificación por" @@ -253,6 +286,7 @@ msgstr "Última Modificación por" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_date msgid "Last Updated on" msgstr "Última Actualización en" @@ -265,6 +299,7 @@ msgstr "Plazo de Entrega" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_location_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_location_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_id msgid "Location" msgstr "Ubicación" @@ -280,11 +315,6 @@ msgstr "" msgid "MRP" msgstr "MRP" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action_date -msgid "MRP Action Date" -msgstr "Fecha de acción MRP" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_applicable msgid "MRP Applicable" @@ -294,6 +324,7 @@ msgstr "Aplicable a MRP" #: model:ir.actions.act_window,name:mrp_multi_level.mrp_area_action #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_stock_location_mrp_area_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_tree @@ -345,15 +376,10 @@ msgid "MRP Inventory" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_move_down_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_move_down_ids msgid "MRP Move DOWN" msgstr "Movimiento Abajo MRP" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_move_up_ids -msgid "MRP Move UP" -msgstr "Movimiento Arriba MRP" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form msgid "MRP Moves" @@ -381,7 +407,7 @@ msgstr "Crear Aprovisionamiento desde Proyecciones de Stock MRP" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_production_id -#: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 +#: selection:mrp.move,mrp_origin:0 selection:mrp.planned.order,mrp_action:0 msgid "Manufacturing Order" msgstr "Order de Fabricación" @@ -400,12 +426,6 @@ msgstr "Ctd. Máxima de Pedido" msgid "Minimum Order Qty" msgstr "Ctd. Mínima de Pedido" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock -msgid "Minimum Stock" -msgstr "Stock Mínimo" - #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 msgid "Move" @@ -446,13 +466,13 @@ msgid "Nbr. Days" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:173 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:156 #, python-format msgid "No MRP product found" msgstr "No se encontró producto MRP" #. module: mrp_multi_level -#: selection:mrp.move,mrp_action:0 +#: selection:mrp.planned.order,mrp_action:0 msgid "None" msgstr "Ninguno/a" @@ -473,6 +493,13 @@ msgstr "Número de Pedido" msgid "Order Release Date" msgstr "Fecha de Lanzamiento de Orden" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_order_release_date +#, fuzzy +#| msgid "Order Release Date" +msgid "Order release date planned by MRP." +msgstr "Fecha de Lanzamiento de Orden" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_origin msgid "Origin" @@ -502,21 +529,54 @@ msgstr "Producto Padre" msgid "Partially Available" msgstr "Parcialmente Disponible" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_running_availability +#, fuzzy +#| msgid "Planned Date" +msgid "Planned Availability" +msgstr "Fecha Planificada" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_date_planned msgid "Planned Date" msgstr "Fecha Planificada" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_processed -msgid "Processed" -msgstr "Procesado" +#: model:ir.model,name:mrp_multi_level.model_mrp_planned_order +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_planned_order_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_planned_order_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_planned_order_ids +#, fuzzy +#| msgid "Planned Date" +msgid "Planned Order" +msgstr "Fecha Planificada" + +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form +#, fuzzy +#| msgid "Planned Date" +msgid "Planned Orders" +msgstr "Fecha Planificada" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_planned_order_up_ids +#, fuzzy +#| msgid "Purchase Orders" +msgid "Planned Orders UP" +msgstr "Órdenes de Compra" #. module: mrp_multi_level #: model:ir.actions.act_window,name:mrp_multi_level.act_mrp_inventory_procure msgid "Procure" msgstr "Abastecer" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_proc_id +#, fuzzy +#| msgid "Location" +msgid "Procure Location" +msgstr "Ubicación" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard msgid "Procurement Request" @@ -533,6 +593,8 @@ msgstr "Producir" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_product_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Product" @@ -577,7 +639,7 @@ msgstr "UdM del Producto" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_purchase_order_id -#: selection:mrp.move,mrp_action:0 selection:mrp.move,mrp_origin:0 +#: selection:mrp.move,mrp_origin:0 selection:mrp.planned.order,mrp_action:0 msgid "Purchase Order" msgstr "Orden de Compra" @@ -596,8 +658,14 @@ msgstr "Órdenes de Compra" msgid "Qty Multiple" msgstr "Múltiplo de Cantidad" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_qty_released +msgid "Qty Released" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_qty msgid "Quantity" msgstr "Cantidad" @@ -608,7 +676,7 @@ msgid "Quantity Available" msgstr "Ctd. actual disponible" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 +#: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:75 #, python-format msgid "Quantity must be positive." msgstr "La cantidad debe ser positiva." @@ -618,6 +686,13 @@ msgstr "La cantidad debe ser positiva." msgid "Ready" msgstr "Listo" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_order_release_date +#, fuzzy +#| msgid "Order Release Date" +msgid "Release Date" +msgstr "Fecha de Lanzamiento de Orden" + #. module: mrp_multi_level #: model:ir.model.fields,help:mrp_multi_level.field_stock_location_mrp_area_id msgid "" @@ -637,11 +712,6 @@ msgstr "Ejecutar MRP" msgid "Run MRP Multi Level" msgstr "Ejecutar MRP Multi Nivel" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_running_availability -msgid "Running Availability" -msgstr "" - #. module: mrp_multi_level #: model:product.product,name:mrp_multi_level.product_product_sf_1 #: model:product.template,name:mrp_multi_level.product_product_sf_1_product_template @@ -655,6 +725,11 @@ msgstr "SF-1" msgid "SF-2" msgstr "SF-2" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock +msgid "Safety Stock" +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Selection..." @@ -665,6 +740,13 @@ msgstr "Selección..." msgid "Sent" msgstr "Enviado" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_location_proc_id +msgid "" +"Set this if you need to procure from a different locationthan area's " +"location." +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_initial_on_hand_qty msgid "Starting Inventory" @@ -701,6 +783,11 @@ msgstr "Método de Suministro" msgid "The product/MRP Area parameters combination must be unique." msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_inventory_running_availability +msgid "Theoretical inventory level if all planned orderswere released." +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "To Approve" @@ -717,6 +804,7 @@ msgid "To procure" msgstr "" #. module: mrp_multi_level +#: selection:mrp.planned.order,mrp_action:0 #: selection:product.mrp.area,supply_method:0 msgid "Transfer" msgstr "Transfer" @@ -777,6 +865,12 @@ msgstr "Asistente" msgid "Working Hours" msgstr "Horario de Trabajo" +#. module: mrp_multi_level +#: code:addons/mrp_multi_level/models/product_mrp_area.py:124 +#, python-format +msgid "You cannot use a negative number." +msgstr "" + #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_area msgid "mrp.area" @@ -802,6 +896,18 @@ msgstr "" msgid "or" msgstr "o" +#~ msgid "MRP Action Date" +#~ msgstr "Fecha de acción MRP" + +#~ msgid "MRP Move UP" +#~ msgstr "Movimiento Arriba MRP" + +#~ msgid "Minimum Stock" +#~ msgstr "Stock Mínimo" + +#~ msgid "Processed" +#~ msgstr "Procesado" + #~ msgid "MRP Product" #~ msgstr "Producto MRP" diff --git a/mrp_multi_level/i18n/mrp_multi_level.pot b/mrp_multi_level/i18n/mrp_multi_level.pot index 19b8ecdce..db3309b82 100644 --- a/mrp_multi_level/i18n/mrp_multi_level.pot +++ b/mrp_multi_level/i18n/mrp_multi_level.pot @@ -14,7 +14,7 @@ msgstr "" "Plural-Forms: \n" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_action msgid "Action" msgstr "" @@ -29,14 +29,19 @@ msgstr "" msgid "Approved" msgstr "" +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search +msgid "Archived" +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "Assigned" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_mrp_lead_time -msgid "Average delay in days to produce this product. In the case of multi-level BOM, the manufacturing lead times of the components will be added." +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_inventory_id +msgid "Associated MRP Inventory" msgstr "" #. module: mrp_multi_level @@ -47,7 +52,6 @@ msgstr "" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard #: model:ir.ui.view,arch_db:mrp_multi_level.view_run_mrp_multi_level_wizard -#: selection:mrp.move,mrp_action:0 msgid "Cancel" msgstr "" @@ -73,6 +77,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_create_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_uid msgid "Created by" msgstr "" @@ -84,6 +89,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_create_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_create_date #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_create_date msgid "Created on" msgstr "" @@ -103,6 +109,11 @@ msgstr "" msgid "Date" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_due_date +msgid "Date in which the supply must have been completed." +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Date to Procure (By Day)" @@ -126,6 +137,7 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_name msgid "Description" msgstr "" @@ -136,6 +148,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_display_name +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_display_name #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_display_name msgid "Display Name" msgstr "" @@ -145,6 +158,11 @@ msgstr "" msgid "Draft" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_due_date +msgid "Due Date" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude msgid "Exclude from MRP" @@ -167,6 +185,11 @@ msgstr "" msgid "FP-2" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_fixed +msgid "Fixed" +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 msgid "Forecast" @@ -182,6 +205,11 @@ msgstr "" msgid "Group By..." msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_group_estimate_days +msgid "Group Days of Estimates" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_id @@ -189,6 +217,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_id msgid "ID" msgstr "" @@ -226,6 +255,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level___last_update +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order___last_update #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area___last_update msgid "Last Modified on" msgstr "" @@ -237,6 +267,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_uid +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_write_uid #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_uid msgid "Last Updated by" msgstr "" @@ -248,6 +279,7 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_write_date +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_write_date #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_write_date msgid "Last Updated on" msgstr "" @@ -260,6 +292,7 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_area_location_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_location_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_id msgid "Location" msgstr "" @@ -275,11 +308,6 @@ msgstr "" msgid "MRP" msgstr "" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_action_date -msgid "MRP Action Date" -msgstr "" - #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_applicable msgid "MRP Applicable" @@ -289,6 +317,7 @@ msgstr "" #: model:ir.actions.act_window,name:mrp_multi_level.mrp_area_action #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_stock_location_mrp_area_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_form #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_area_tree @@ -337,15 +366,10 @@ msgid "MRP Inventory" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_move_down_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_move_down_ids msgid "MRP Move DOWN" msgstr "" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_move_up_ids -msgid "MRP Move UP" -msgstr "" - #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form msgid "MRP Moves" @@ -373,8 +397,8 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_production_id -#: selection:mrp.move,mrp_action:0 #: selection:mrp.move,mrp_origin:0 +#: selection:mrp.planned.order,mrp_action:0 msgid "Manufacturing Order" msgstr "" @@ -393,12 +417,6 @@ msgstr "" msgid "Minimum Order Qty" msgstr "" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_minimum_stock -#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock -msgid "Minimum Stock" -msgstr "" - #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 msgid "Move" @@ -437,13 +455,13 @@ msgid "Nbr. Days" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:173 +#: code:addons/mrp_multi_level/wizards/mrp_multi_level.py:156 #, python-format msgid "No MRP product found" msgstr "" #. module: mrp_multi_level -#: selection:mrp.move,mrp_action:0 +#: selection:mrp.planned.order,mrp_action:0 msgid "None" msgstr "" @@ -462,6 +480,11 @@ msgstr "" msgid "Order Release Date" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_order_release_date +msgid "Order release date planned by MRP." +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_origin msgid "Origin" @@ -491,14 +514,32 @@ msgstr "" msgid "Partially Available" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_running_availability +msgid "Planned Availability" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_date_planned msgid "Planned Date" msgstr "" #. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_processed -msgid "Processed" +#: model:ir.model,name:mrp_multi_level.model_mrp_planned_order +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_planned_order_ids +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_planned_order_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_planned_order_ids +msgid "Planned Order" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form +msgid "Planned Orders" +msgstr "" + +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_planned_order_up_ids +msgid "Planned Orders UP" msgstr "" #. module: mrp_multi_level @@ -506,6 +547,11 @@ msgstr "" msgid "Procure" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_proc_id +msgid "Procure Location" +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard msgid "Procurement Request" @@ -522,6 +568,8 @@ msgstr "" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_id #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_product_id +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_product_mrp_area_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_product_id #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Product" @@ -563,8 +611,8 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_purchase_order_id -#: selection:mrp.move,mrp_action:0 #: selection:mrp.move,mrp_origin:0 +#: selection:mrp.planned.order,mrp_action:0 msgid "Purchase Order" msgstr "" @@ -583,8 +631,14 @@ msgstr "" msgid "Qty Multiple" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_qty_released +msgid "Qty Released" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_qty +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_qty msgid "Quantity" msgstr "" @@ -594,7 +648,7 @@ msgid "Quantity Available" msgstr "" #. module: mrp_multi_level -#: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:80 +#: code:addons/mrp_multi_level/wizards/mrp_inventory_procure.py:75 #, python-format msgid "Quantity must be positive." msgstr "" @@ -604,6 +658,11 @@ msgstr "" msgid "Ready" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_order_release_date +msgid "Release Date" +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,help:mrp_multi_level.field_stock_location_mrp_area_id msgid "Requirements for a particular MRP area are combined for the purposes of procurement by the MRP." @@ -621,11 +680,6 @@ msgstr "" msgid "Run MRP Multi Level" msgstr "" -#. module: mrp_multi_level -#: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_running_availability -msgid "Running Availability" -msgstr "" - #. module: mrp_multi_level #: model:product.product,name:mrp_multi_level.product_product_sf_1 #: model:product.template,name:mrp_multi_level.product_product_sf_1_product_template @@ -639,6 +693,11 @@ msgstr "" msgid "SF-2" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock +msgid "Safety Stock" +msgstr "" + #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search msgid "Selection..." @@ -649,6 +708,11 @@ msgstr "" msgid "Sent" msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_product_mrp_area_location_proc_id +msgid "Set this if you need to procure from a different locationthan area's location." +msgstr "" + #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_initial_on_hand_qty msgid "Starting Inventory" @@ -685,6 +749,11 @@ msgstr "" msgid "The product/MRP Area parameters combination must be unique." msgstr "" +#. module: mrp_multi_level +#: model:ir.model.fields,help:mrp_multi_level.field_mrp_inventory_running_availability +msgid "Theoretical inventory level if all planned orderswere released." +msgstr "" + #. module: mrp_multi_level #: selection:mrp.move,state:0 msgid "To Approve" @@ -701,6 +770,7 @@ msgid "To procure" msgstr "" #. module: mrp_multi_level +#: selection:mrp.planned.order,mrp_action:0 #: selection:product.mrp.area,supply_method:0 msgid "Transfer" msgstr "" @@ -759,6 +829,12 @@ msgstr "" msgid "Working Hours" msgstr "" +#. module: mrp_multi_level +#: code:addons/mrp_multi_level/models/product_mrp_area.py:124 +#, python-format +msgid "You cannot use a negative number." +msgstr "" + #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_area msgid "mrp.area" From b94ab16d7fc4cac54e0b1dce14d622f9bc70ccfb Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Wed, 12 Jun 2019 15:54:55 +0200 Subject: [PATCH 047/188] [11.0][FIX] mrp_multi_level: * remove duplicated fields in view * fix issue using this module together with procurement_auto_create_group. --- mrp_multi_level/models/product_mrp_area.py | 3 ++- mrp_multi_level/views/mrp_area_views.xml | 2 -- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index ff6d153e0..01a1d5401 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -149,7 +149,8 @@ class ProductMRPArea(models.Model): @api.multi def _compute_supply_method(self): - group_obj = self.env['procurement.group'] + group_obj = self.env['procurement.group'].with_context( + no_auto_create_group=True) for rec in self: proc_loc = rec.location_proc_id or rec.mrp_area_id.location_id values = { diff --git a/mrp_multi_level/views/mrp_area_views.xml b/mrp_multi_level/views/mrp_area_views.xml index 1478ff608..b4742a053 100644 --- a/mrp_multi_level/views/mrp_area_views.xml +++ b/mrp_multi_level/views/mrp_area_views.xml @@ -37,8 +37,6 @@ - - From 38895967b86cff82ece439026ca6428d11732f3e Mon Sep 17 00:00:00 2001 From: Maria Sparenberg Date: Fri, 28 Jun 2019 11:42:38 +0000 Subject: [PATCH 048/188] Translated using Weblate (German) Currently translated at 97.9% (143 of 146 strings) Translation: manufacture-11.0/manufacture-11.0-mrp_multi_level Translate-URL: https://translation.odoo-community.org/projects/manufacture-11-0/manufacture-11-0-mrp_multi_level/de/ --- mrp_multi_level/i18n/de.po | 54 +++++++++++++++----------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/mrp_multi_level/i18n/de.po b/mrp_multi_level/i18n/de.po index 11f3a4040..d9da41d2f 100644 --- a/mrp_multi_level/i18n/de.po +++ b/mrp_multi_level/i18n/de.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 11.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2019-02-13 15:50+0000\n" +"PO-Revision-Date: 2019-06-28 14:42+0000\n" "Last-Translator: Maria Sparenberg \n" "Language-Team: none\n" "Language: de\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.4\n" +"X-Generator: Weblate 3.6.1\n" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_action @@ -35,7 +35,7 @@ msgstr "Genehmigt" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_search msgid "Archived" -msgstr "" +msgstr "Archiviert" #. module: mrp_multi_level #: selection:mrp.move,state:0 @@ -44,10 +44,8 @@ msgstr "Zugewiesen" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_mrp_inventory_id -#, fuzzy -#| msgid "Forecasted Inventory" msgid "Associated MRP Inventory" -msgstr "Vorhergesagter Bestand" +msgstr "Zugehöriger MRP Bestand" #. module: mrp_multi_level #: selection:product.mrp.area,supply_method:0 @@ -117,7 +115,7 @@ msgstr "Datum" #. module: mrp_multi_level #: model:ir.model.fields,help:mrp_multi_level.field_mrp_planned_order_due_date msgid "Date in which the supply must have been completed." -msgstr "" +msgstr "Das ist das Fälligkeitsdatum, zu dem der Auftrag erledigt sein muss." #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search @@ -165,10 +163,8 @@ msgstr "Entwurf" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_due_date -#, fuzzy -#| msgid "Current Date" msgid "Due Date" -msgstr "Aktuelles Datum" +msgstr "Fälligkeitsdatum" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_exclude @@ -195,7 +191,7 @@ msgstr "FP-2" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_fixed msgid "Fixed" -msgstr "" +msgstr "Fest" #. module: mrp_multi_level #: selection:mrp.move,mrp_origin:0 @@ -239,7 +235,7 @@ msgstr "" #. module: mrp_multi_level #: model:ir.model.fields,help:mrp_multi_level.field_mrp_multi_level_mrp_area_ids msgid "If empty, all areas will be computed." -msgstr "" +msgstr "Wenn das Feld leer ist, werden alle Bereiche berechnet." #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_inspection_delay @@ -355,10 +351,8 @@ msgstr "Bereiche" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_multi_level_mrp_area_ids -#, fuzzy -#| msgid "MRP Areas" msgid "MRP Areas to run" -msgstr "Bereiche" +msgstr "Auszuführende Bereiche" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_mrp_date @@ -532,10 +526,8 @@ msgstr "Teilweise verfügbar" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_running_availability -#, fuzzy -#| msgid "Running Availability" msgid "Planned Availability" -msgstr "Laufende Verfügbarkeit" +msgstr "Geplante Verfügbarkeit" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_date_planned @@ -547,17 +539,13 @@ msgstr "Geplantes Datum" #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_planned_order_ids #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_planned_order_id #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_planned_order_ids -#, fuzzy -#| msgid "Planned Date" msgid "Planned Order" -msgstr "Geplantes Datum" +msgstr "Geplanter Auftrag" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.product_mrp_area_form -#, fuzzy -#| msgid "Planned Date" msgid "Planned Orders" -msgstr "Geplantes Datum" +msgstr "Geplante Aufträge" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_move_planned_order_up_ids @@ -573,10 +561,8 @@ msgstr "Beschaffen" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_location_proc_id -#, fuzzy -#| msgid "Location" msgid "Procure Location" -msgstr "Lagerort" +msgstr "Beschaffungslagerort" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.view_mrp_inventory_procure_wizard @@ -659,7 +645,7 @@ msgstr "Mengenfaktor" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_qty_released msgid "Qty Released" -msgstr "" +msgstr "Freigegebene Menge" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_procure_item_qty @@ -685,10 +671,8 @@ msgstr "Bereit" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_planned_order_order_release_date -#, fuzzy -#| msgid "Order Release Date" msgid "Release Date" -msgstr "Auftragsfreigabe-Datum" +msgstr "Freigabe-Datum" #. module: mrp_multi_level #: model:ir.model.fields,help:mrp_multi_level.field_stock_location_mrp_area_id @@ -727,7 +711,7 @@ msgstr "SF-2" #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_product_mrp_area_mrp_minimum_stock msgid "Safety Stock" -msgstr "" +msgstr "Sicherheitsbestand" #. module: mrp_multi_level #: model:ir.ui.view,arch_db:mrp_multi_level.mrp_inventory_search @@ -745,6 +729,8 @@ msgid "" "Set this if you need to procure from a different locationthan area's " "location." msgstr "" +"Setzen Sie hier einen Lagerort, wenn die Beschaffung von einem anderen " +"Lagerort stattfinden soll als im Bereich angegeben." #. module: mrp_multi_level #: model:ir.model.fields,field_description:mrp_multi_level.field_mrp_inventory_initial_on_hand_qty @@ -786,6 +772,8 @@ msgstr "Die Kombination der Produkt-/Bereich-Parameter muss einzigartig sein." #: model:ir.model.fields,help:mrp_multi_level.field_mrp_inventory_running_availability msgid "Theoretical inventory level if all planned orderswere released." msgstr "" +"Dies ist der theoretische Lagerbestand, wenn alle geplanten Aufträge " +"freigegeben werden." #. module: mrp_multi_level #: selection:mrp.move,state:0 @@ -872,7 +860,7 @@ msgstr "Arbeitsstunden" #: code:addons/mrp_multi_level/models/product_mrp_area.py:124 #, python-format msgid "You cannot use a negative number." -msgstr "" +msgstr "Es darf keine negative Zahl angegeben werden." #. module: mrp_multi_level #: model:ir.model,name:mrp_multi_level.model_mrp_area From 5b8b41422af8419758b3930138f9e8604a6174db Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Thu, 4 Jul 2019 15:39:32 +0200 Subject: [PATCH 049/188] revert unneded context addition --- mrp_multi_level/models/product_mrp_area.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mrp_multi_level/models/product_mrp_area.py b/mrp_multi_level/models/product_mrp_area.py index 01a1d5401..ff6d153e0 100644 --- a/mrp_multi_level/models/product_mrp_area.py +++ b/mrp_multi_level/models/product_mrp_area.py @@ -149,8 +149,7 @@ class ProductMRPArea(models.Model): @api.multi def _compute_supply_method(self): - group_obj = self.env['procurement.group'].with_context( - no_auto_create_group=True) + group_obj = self.env['procurement.group'] for rec in self: proc_loc = rec.location_proc_id or rec.mrp_area_id.location_id values = { From a718192404d2c2838b2eef9b0f9e782e474335b4 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 5 Jul 2019 16:53:36 +0000 Subject: [PATCH 050/188] mrp_multi_level 11.0.3.1.0 --- mrp_multi_level/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index af8f33565..d006e8f5c 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'MRP Multi Level', - 'version': '11.0.3.0.0', + 'version': '11.0.3.1.0', 'development_status': 'Beta', 'license': 'AGPL-3', 'author': 'Ucamco, ' From 3e7351396c6ee7feafa27bdf14d8e249bbdfa16b Mon Sep 17 00:00:00 2001 From: Lois Rilo Date: Mon, 15 Jul 2019 17:19:16 +0200 Subject: [PATCH 051/188] [11.0][MIG] mrp_multi_level: open MRP inventory screen if manually run --- mrp_multi_level/wizards/mrp_multi_level.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mrp_multi_level/wizards/mrp_multi_level.py b/mrp_multi_level/wizards/mrp_multi_level.py index 69241b853..ca9c84c2a 100644 --- a/mrp_multi_level/wizards/mrp_multi_level.py +++ b/mrp_multi_level/wizards/mrp_multi_level.py @@ -767,3 +767,7 @@ class MultiLevelMrp(models.TransientModel): self._mrp_initialisation(self.mrp_area_ids) self._mrp_calculation(mrp_lowest_llc, self.mrp_area_ids) self._mrp_final_process(self.mrp_area_ids) + # Open MRP inventory screen to show result if manually run: + action = self.env.ref("mrp_multi_level.mrp_inventory_action") + result = action.read()[0] + return result From 84d0528add1d2198d944860c6753197fc11501fb Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 16 Jul 2019 11:14:33 +0000 Subject: [PATCH 052/188] mrp_multi_level 11.0.3.1.1 --- mrp_multi_level/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrp_multi_level/__manifest__.py b/mrp_multi_level/__manifest__.py index d006e8f5c..9dbbadab5 100644 --- a/mrp_multi_level/__manifest__.py +++ b/mrp_multi_level/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { 'name': 'MRP Multi Level', - 'version': '11.0.3.1.0', + 'version': '11.0.3.1.1', 'development_status': 'Beta', 'license': 'AGPL-3', 'author': 'Ucamco, ' From 62f31a5d0effb6e015759f63130066fd0a1bf487 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:10:34 +0000 Subject: [PATCH 053/188] [UPD] README.rst --- mrp_multi_level/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrp_multi_level/static/description/index.html b/mrp_multi_level/static/description/index.html index 8bb7f1c78..245c3662b 100644 --- a/mrp_multi_level/static/description/index.html +++ b/mrp_multi_level/static/description/index.html @@ -3,7 +3,7 @@ - + MRP Multi Level