diff --git a/stock_removal_location_by_priority/README.rst b/stock_removal_location_by_priority/README.rst index 3077dbd0a..316c910af 100644 --- a/stock_removal_location_by_priority/README.rst +++ b/stock_removal_location_by_priority/README.rst @@ -1,72 +1,97 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - ================================== Stock Removal Location by Priority ================================== +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github + :target: https://github.com/OCA/stock-logistics-warehouse/tree/11.0/stock_removal_location_by_priority + :alt: OCA/stock-logistics-warehouse +.. |badge4| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/153/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| + This module adds a removal priority field on stock locations. This priority applies when removing a product from different stock locations and the incoming dates are equal in both locations. +**Table of contents** + +.. contents:: + :local: + Configuration ============= -You can configure the removal priority as follows: +You can activate the removal priority as follows: #. Go to "Inventory > Configuration > Settings" -#. In 'Location & Warehouse' section, mark the "Removal Priority" option. +#. In 'Operations' section, mark the "Removal Priority" option. +#. You also need to activate the following settings in the section *Warehouse* if they are not yet: -NOTE: To be able to view this option you need to have already marked: + #. Manage several locations using *Storage Locations* option. + #. Advanced routing using "Multi-Step Routes" option. -#. Manage several locations in "Warehouses and Locations usage level" option. -#. Advanced routing of products using rules in "Routing" option. - -Usage -===== - -To use this module, you need to: +Then, set the *Removal Priority* in the desired locations. Remember that a +lower number means more priority: #. Go to "Inventory > Configuration > Warehouse Management > Locations" #. In each Location form, in the Logistics section, put a Removal Priority. -.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas - :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/153/10.0 +Usage +===== +After configure your locations properly, the system will select the quant +at the location with more priority in case of equal date, no matter if you +use FIFO or LIFO removal strategy. 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. +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 feedback. +Do not contact contributors directly about support or help with technical issues. -Images ------- +Credits +======= -* Odoo Community Association: `Icon `_. +Authors +~~~~~~~ + +* Eficent Contributors ------------- +~~~~~~~~~~~~ * Miquel Raïch +* Lois Rilo +Maintainers +~~~~~~~~~~~ -Maintainer ----------- +This module is maintained by the OCA. .. 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. +This module is part of the `OCA/stock-logistics-warehouse `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/stock_removal_location_by_priority/__init__.py b/stock_removal_location_by_priority/__init__.py index 2e7485cc7..cd4bd41dd 100644 --- a/stock_removal_location_by_priority/__init__.py +++ b/stock_removal_location_by_priority/__init__.py @@ -1,7 +1,2 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 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 . import models from .init_hook import pre_init_hook diff --git a/stock_removal_location_by_priority/__manifest__.py b/stock_removal_location_by_priority/__manifest__.py index 9aa7cce4f..6eab05cee 100644 --- a/stock_removal_location_by_priority/__manifest__.py +++ b/stock_removal_location_by_priority/__manifest__.py @@ -1,11 +1,10 @@ -# -*- coding: utf-8 -*- # Copyright 2017 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). { "name": "Stock Removal Location by Priority", "summary": "Establish a removal priority on stock locations.", - "version": "10.0.1.0.0", + "version": "11.0.1.0.0", "author": "Eficent, " "Odoo Community Association (OCA)", "website": "https://github.com/OCA/stock-logistics-warehouse", diff --git a/stock_removal_location_by_priority/init_hook.py b/stock_removal_location_by_priority/init_hook.py index a3055b980..5b2be5faf 100644 --- a/stock_removal_location_by_priority/init_hook.py +++ b/stock_removal_location_by_priority/init_hook.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 Eficent Business and IT Consulting Services, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). diff --git a/stock_removal_location_by_priority/models/__init__.py b/stock_removal_location_by_priority/models/__init__.py index 629e8d9a6..81e02630a 100644 --- a/stock_removal_location_by_priority/models/__init__.py +++ b/stock_removal_location_by_priority/models/__init__.py @@ -1,8 +1,3 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 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 . import stock_config_settings +from . import res_config_settings from . import stock_location from . import stock_quant diff --git a/stock_removal_location_by_priority/models/res_config_settings.py b/stock_removal_location_by_priority/models/res_config_settings.py new file mode 100644 index 000000000..99ef62790 --- /dev/null +++ b/stock_removal_location_by_priority/models/res_config_settings.py @@ -0,0 +1,17 @@ +# Copyright 2017-18 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 odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = 'res.config.settings' + + group_removal_priority = fields.Boolean( + string="Removal Priority", + implied_group='stock_removal_location_by_priority.' + 'group_removal_priority', + help="Removal priority that applies when the incoming dates " + "are equal in both locations.", + ) diff --git a/stock_removal_location_by_priority/models/stock_config_settings.py b/stock_removal_location_by_priority/models/stock_config_settings.py deleted file mode 100644 index 5da3aa22a..000000000 --- a/stock_removal_location_by_priority/models/stock_config_settings.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from odoo import fields, models - - -class StockConfigSettings(models.TransientModel): - _inherit = 'stock.config.settings' - - group_removal_priority = fields.Selection([ - (0, 'Don\'t use \'Removal Priority\' in Locations'), - (1, 'Use \'Removal Priority\' in Locations'), - ], "Removal Priority", - implied_group='stock_removal_location_by_priority.' - 'group_removal_priority', - help="Removal priority that applies when the incoming dates " - "are equal in both locations.") diff --git a/stock_removal_location_by_priority/models/stock_location.py b/stock_removal_location_by_priority/models/stock_location.py index 08d948fd2..c067823cf 100644 --- a/stock_removal_location_by_priority/models/stock_location.py +++ b/stock_removal_location_by_priority/models/stock_location.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # Copyright 2017 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). @@ -9,7 +8,8 @@ from odoo import fields, models class StockLocation(models.Model): _inherit = 'stock.location' - removal_priority = fields.Integer(help="This priority applies when " - "removing stock and incoming dates " - "are equal.", - string="Removal Priority", default=10) + removal_priority = fields.Integer( + string="Removal Priority", default=10, + help="This priority applies when removing stock and incoming dates " + "are equal.", + ) diff --git a/stock_removal_location_by_priority/models/stock_quant.py b/stock_removal_location_by_priority/models/stock_quant.py index 93cbb9294..6eb768821 100644 --- a/stock_removal_location_by_priority/models/stock_quant.py +++ b/stock_removal_location_by_priority/models/stock_quant.py @@ -1,29 +1,29 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# Copyright 2017-18 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 odoo import api, fields, models -from odoo.tools.translate import _ +from odoo import api, fields, models, _ from odoo.exceptions import UserError -class Quant(models.Model): +class StockQuant(models.Model): _inherit = 'stock.quant' removal_priority = fields.Integer( - related='location_id.removal_priority', readonly=True, store=True) + related='location_id.removal_priority', + readonly=True, store=True, + ) @api.model - def _quants_removal_get_order(self, removal_strategy=None): + def _get_removal_strategy_order(self, removal_strategy=None): if self.user_has_groups( 'stock_removal_location_by_priority.group_removal_priority'): if removal_strategy == 'fifo': - return 'in_date, removal_priority, id' + return 'in_date ASC NULLS FIRST, removal_priority ASC, id' elif removal_strategy == 'lifo': - return 'in_date desc, removal_priority asc, id desc' + return 'in_date DESC NULLS LAST, removal_priority ASC, id desc' raise UserError(_('Removal strategy %s not implemented.') % ( removal_strategy,)) else: - return super(Quant, self)._quants_removal_get_order( + return super()._get_removal_strategy_order( removal_strategy=removal_strategy) diff --git a/stock_removal_location_by_priority/readme/CONFIGURE.rst b/stock_removal_location_by_priority/readme/CONFIGURE.rst new file mode 100644 index 000000000..c160586be --- /dev/null +++ b/stock_removal_location_by_priority/readme/CONFIGURE.rst @@ -0,0 +1,14 @@ +You can activate the removal priority as follows: + +#. Go to "Inventory > Configuration > Settings" +#. In 'Operations' section, mark the "Removal Priority" option. +#. You also need to activate the following settings in the section *Warehouse* if they are not yet: + + #. Manage several locations using *Storage Locations* option. + #. Advanced routing using "Multi-Step Routes" option. + +Then, set the *Removal Priority* in the desired locations. Remember that a +lower number means more priority: + +#. Go to "Inventory > Configuration > Warehouse Management > Locations" +#. In each Location form, in the Logistics section, put a Removal Priority. diff --git a/stock_removal_location_by_priority/readme/CONTRIBUTORS.rst b/stock_removal_location_by_priority/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..9843f5f12 --- /dev/null +++ b/stock_removal_location_by_priority/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Miquel Raïch +* Lois Rilo diff --git a/stock_removal_location_by_priority/readme/DESCRIPTION.rst b/stock_removal_location_by_priority/readme/DESCRIPTION.rst new file mode 100644 index 000000000..11aa2cb8b --- /dev/null +++ b/stock_removal_location_by_priority/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module adds a removal priority field on stock locations. +This priority applies when removing a product from different stock locations +and the incoming dates are equal in both locations. diff --git a/stock_removal_location_by_priority/readme/USAGE.rst b/stock_removal_location_by_priority/readme/USAGE.rst new file mode 100644 index 000000000..94c9ee303 --- /dev/null +++ b/stock_removal_location_by_priority/readme/USAGE.rst @@ -0,0 +1,3 @@ +After configure your locations properly, the system will select the quant +at the location with more priority in case of equal date, no matter if you +use FIFO or LIFO removal strategy. diff --git a/stock_removal_location_by_priority/security/stock_security.xml b/stock_removal_location_by_priority/security/stock_security.xml index da6b1aaa2..230cc962b 100644 --- a/stock_removal_location_by_priority/security/stock_security.xml +++ b/stock_removal_location_by_priority/security/stock_security.xml @@ -1,8 +1,8 @@ - - - - Removal Priority - - - + + + + Removal Priority + + + diff --git a/stock_removal_location_by_priority/tests/__init__.py b/stock_removal_location_by_priority/tests/__init__.py index 574b5131a..57ed6d147 100644 --- a/stock_removal_location_by_priority/tests/__init__.py +++ b/stock_removal_location_by_priority/tests/__init__.py @@ -1,6 +1 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 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 . import test_stock_removal_location_by_priority diff --git a/stock_removal_location_by_priority/tests/test_stock_removal_location_by_priority.py b/stock_removal_location_by_priority/tests/test_stock_removal_location_by_priority.py index a53e88fdc..037efd0be 100644 --- a/stock_removal_location_by_priority/tests/test_stock_removal_location_by_priority.py +++ b/stock_removal_location_by_priority/tests/test_stock_removal_location_by_priority.py @@ -1,7 +1,9 @@ -# -*- coding: utf-8 -*- -# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# Copyright 2017-18 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 + from odoo.tests.common import TransactionCase @@ -14,7 +16,7 @@ class TestStockRemovalLocationByPriority(TransactionCase): self.stock_warehouse_model = self.env['stock.warehouse'] self.stock_picking_model = self.env['stock.picking'] self.stock_change_model = self.env['stock.change.product.qty'] - self.product_template_model = self.env['product.template'] + self.product_model = self.env['product.product'] self.quant_model = self.env['stock.quant'] self.picking_internal = self.env.ref('stock.picking_type_internal') @@ -22,21 +24,24 @@ class TestStockRemovalLocationByPriority(TransactionCase): self.location_supplier = self.env.ref('stock.stock_location_suppliers') self.company = self.env.ref('base.main_company') - self.grp_rem_priority = self.env.ref( + grp_rem_priority = self.env.ref( 'stock_removal_location_by_priority.group_removal_priority') - self.g_stock_user = self.env.ref('stock.group_stock_user') - - self.user = self._create_user( - 'user_1', [self.g_stock_user, self.grp_rem_priority], - self.company).id + # We assign the group to admin, as the _get_removal_strategy_order + # method is going to be always executed as sudo. + user_admin = self.env.ref('base.user_root') + user_admin.groups_id = [(4, grp_rem_priority.id, 0)] self.wh1 = self.stock_warehouse_model.create({ 'name': 'WH1', 'code': 'WH1', }) - # Create a locations: + # Removal strategies: + self.fifo = self.env.ref('stock.removal_fifo') + self.lifo = self.env.ref('stock.removal_lifo') + + # Create locations: self.stock = self.stock_location_model.create({ 'name': 'Stock Base', 'usage': 'internal', @@ -45,6 +50,7 @@ class TestStockRemovalLocationByPriority(TransactionCase): 'name': 'Shelf_A', 'usage': 'internal', 'location_id': self.stock.id, + 'removal_priority': 10, }) self.shelf_B = self.stock_location_model.create({ 'name': 'Shelf_B', @@ -52,148 +58,93 @@ class TestStockRemovalLocationByPriority(TransactionCase): 'location_id': self.stock.id, 'removal_priority': 5, }) + self.stock_2 = self.stock_location_model.create({ + 'name': 'Another Stock Location', + 'usage': 'internal', + }) # Create a product: - self.product_templ_1 = self.product_template_model.create({ - 'name': 'Test Product Template 1', + self.product_1 = self.product_model.create({ + 'name': 'Test Product 1', 'type': 'product', - 'default_code': 'PROD_1', }) - def _create_user(self, login, groups, company): - group_ids = [group.id for group in groups] - user = self.res_users_model.create({ - 'name': login, - 'login': login, - 'password': 'demo', - 'email': 'example@yourcompany.com', - 'company_id': company.id, - 'company_ids': [(4, company.id)], - 'groups_id': [(6, 0, group_ids)] + # Create quants: + today = date.today() + q1 = self.quant_model.create({ + 'product_id': self.product_1.id, + 'location_id': self.shelf_A.id, + 'quantity': 5.0, + 'in_date': today, }) - return user + q2 = self.quant_model.create({ + 'product_id': self.product_1.id, + 'location_id': self.shelf_B.id, + 'quantity': 5.0, + 'in_date': today, + }) + self.quants = q1 + q2 def _create_picking(self, picking_type, location, location_dest, qty): - - picking = self.stock_picking_model.sudo(self.user).create({ + picking = self.stock_picking_model.create({ 'picking_type_id': picking_type.id, 'location_id': location.id, 'location_dest_id': location_dest.id, 'move_lines': [ (0, 0, { 'name': 'Test move', - 'product_id': self.product1.id, - 'product_uom': self.product1.uom_id.id, + 'product_id': self.product_1.id, + 'product_uom': self.product_1.uom_id.id, 'product_uom_qty': qty, 'location_id': location.id, 'location_dest_id': location_dest.id, - 'price_unit': 2 + 'price_unit': 2, })] }) return picking - def test_stock_removal_location_by_priority_fifo(self): - """Tests removal priority.""" - wiz1 = self.stock_change_model.with_context( - active_id=self.product_templ_1.id, - active_model='product.template' - ).create({'new_quantity': 20, - 'location_id': self.stock.id, - 'product_tmpl_id': self.product_templ_1.id, - }) - wiz1.change_product_qty() - self.product1 = wiz1.product_id - + def test_01_stock_removal_location_by_priority_fifo(self): + """Tests removal priority with FIFO strategy.""" + self.stock.removal_strategy_id = self.fifo + # quants must start unreserved + for q in self.quants: + self.assertEqual(q.reserved_quantity, 0.0) + if q.location_id == self.shelf_A: + self.assertEqual(q.removal_priority, 10) + if q.location_id == self.shelf_B: + self.assertEqual(q.removal_priority, 5) + self.assertEqual(self.quants[0].in_date, self.quants[1].in_date) picking_1 = self._create_picking( - self.picking_internal, self.stock, self.shelf_A, 5) + self.picking_internal, self.stock, self.stock_2, 5) picking_1.action_confirm() picking_1.action_assign() - picking_2 = self._create_picking( - self.picking_internal, self.stock, self.shelf_B, 10) - picking_2.action_confirm() - picking_2.action_assign() - - self.assertEqual(picking_1.pack_operation_ids. - linked_move_operation_ids.reserved_quant_id.in_date, - picking_2.pack_operation_ids. - linked_move_operation_ids.reserved_quant_id.in_date, - 'Testing data not generated properly.') - - wiz_act = picking_1.do_new_transfer() - wiz2 = self.env[wiz_act['res_model']].browse(wiz_act['res_id']) - wiz2.process() - - wiz_act = picking_2.do_new_transfer() - wiz3 = self.env[wiz_act['res_model']].browse(wiz_act['res_id']) - wiz3.process() - - picking_3 = self._create_picking( - self.picking_out, self.stock, self.location_supplier, 5) - picking_3.action_confirm() - picking_3.action_assign() - wiz_act = picking_3.do_new_transfer() - wiz4 = self.env[wiz_act['res_model']].browse(wiz_act['res_id']) - wiz4.process() - - records = self.quant_model.search( - [('product_id', '=', self.product1.id)]) - for record in records: - self.assertEqual(record.qty, 5, - 'Removal_priority did\'nt work properly.') - - def test_stock_removal_location_by_priority_lifo(self): - """Tests removal priority.""" - removal_method_id = self.env['product.removal'].search( - [('name', '=', 'lifo')]).id - self.stock.removal_strategy_id = removal_method_id - self.shelf_A.removal_strategy_id = removal_method_id - self.shelf_B.removal_strategy_id = removal_method_id - self.location_supplier.removal_strategy_id = removal_method_id - wiz1 = self.stock_change_model.with_context( - active_id=self.product_templ_1.id, - active_model='product.template' - ).create({'new_quantity': 20, - 'location_id': self.stock.id, - 'product_tmpl_id': self.product_templ_1.id, - }) - wiz1.change_product_qty() - self.product1 = wiz1.product_id + # quants must be reserved in Shelf B (lower removal_priority value). + for q in self.quants: + if q.location_id == self.shelf_A: + self.assertEqual(q.reserved_quantity, 0.0) + if q.location_id == self.shelf_B: + self.assertEqual(q.reserved_quantity, 5.0) + def test_02_stock_removal_location_by_priority_lifo(self): + """Tests removal priority with LIFO strategy.""" + self.stock.removal_strategy_id = self.lifo + # quants must start unreserved + for q in self.quants: + self.assertEqual(q.reserved_quantity, 0.0) + if q.location_id == self.shelf_A: + self.assertEqual(q.removal_priority, 10) + if q.location_id == self.shelf_B: + self.assertEqual(q.removal_priority, 5) + self.assertEqual(self.quants[0].in_date, self.quants[1].in_date) picking_1 = self._create_picking( - self.picking_internal, self.stock, self.shelf_A, 5) + self.picking_internal, self.stock, self.stock_2, 5) picking_1.action_confirm() picking_1.action_assign() - picking_2 = self._create_picking( - self.picking_internal, self.stock, self.shelf_B, 10) - picking_2.action_confirm() - picking_2.action_assign() - - self.assertEqual(picking_1.pack_operation_ids. - linked_move_operation_ids.reserved_quant_id.in_date, - picking_2.pack_operation_ids. - linked_move_operation_ids.reserved_quant_id.in_date, - 'Testing data not generated properly.') - - wiz_act = picking_1.do_new_transfer() - wiz2 = self.env[wiz_act['res_model']].browse(wiz_act['res_id']) - wiz2.process() - - wiz_act = picking_2.do_new_transfer() - wiz3 = self.env[wiz_act['res_model']].browse(wiz_act['res_id']) - wiz3.process() - - picking_3 = self._create_picking( - self.picking_out, self.stock, self.location_supplier, 5) - picking_3.action_confirm() - picking_3.action_assign() - wiz_act = picking_3.do_new_transfer() - wiz4 = self.env[wiz_act['res_model']].browse(wiz_act['res_id']) - wiz4.process() - - records = self.quant_model.search( - [('product_id', '=', self.product1.id)]) - for record in records: - self.assertEqual(record.qty, 5, - 'Removal_priority did\'nt work properly.') + # quants must be reserved in Shelf B (lower removal_priority value). + for q in self.quants: + if q.location_id == self.shelf_A: + self.assertEqual(q.reserved_quantity, 0.0) + if q.location_id == self.shelf_B: + self.assertEqual(q.reserved_quantity, 5.0) diff --git a/stock_removal_location_by_priority/views/res_config_settings_views.xml b/stock_removal_location_by_priority/views/res_config_settings_views.xml index 7ee9c871f..d40cd25e0 100644 --- a/stock_removal_location_by_priority/views/res_config_settings_views.xml +++ b/stock_removal_location_by_priority/views/res_config_settings_views.xml @@ -1,16 +1,26 @@ - - stock.config.view - removal_priority - stock.config.settings - + res.config.settings - removal_priority + res.config.settings + - - - + +
+
+ +
+
+
+
+