From bc563c4d534c6205a7fd4745a3d93e00d56d31f7 Mon Sep 17 00:00:00 2001 From: Sudhir Arya Date: Wed, 10 Feb 2016 15:12:43 +0530 Subject: [PATCH 01/22] Added Sale Stock OU module for v8. --- sale_stock_operating_unit/__init__.py | 7 ++ sale_stock_operating_unit/__openerp__.py | 35 ++++++++ sale_stock_operating_unit/models/__init__.py | 6 ++ sale_stock_operating_unit/models/sale.py | 37 +++++++++ .../static/description/icon.png | Bin 0 -> 9455 bytes sale_stock_operating_unit/tests/__init__.py | 10 +++ .../tests/test_sale_stock_operating_unit.py | 77 ++++++++++++++++++ 7 files changed, 172 insertions(+) create mode 100644 sale_stock_operating_unit/__init__.py create mode 100644 sale_stock_operating_unit/__openerp__.py create mode 100644 sale_stock_operating_unit/models/__init__.py create mode 100644 sale_stock_operating_unit/models/sale.py create mode 100644 sale_stock_operating_unit/static/description/icon.png create mode 100644 sale_stock_operating_unit/tests/__init__.py create mode 100644 sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py diff --git a/sale_stock_operating_unit/__init__.py b/sale_stock_operating_unit/__init__.py new file mode 100644 index 0000000000..55c73fac1c --- /dev/null +++ b/sale_stock_operating_unit/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import models +from . import tests diff --git a/sale_stock_operating_unit/__openerp__.py b/sale_stock_operating_unit/__openerp__.py new file mode 100644 index 0000000000..5b20bba1d8 --- /dev/null +++ b/sale_stock_operating_unit/__openerp__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Operating Unit in Sales Stock", + "version": "7.0.1.0.0", + "author": "Eficent, Odoo Community Association (OCA)", + "website": "http://www.eficent.com", + "category": "Purchase Management", + "depends": ["sale_stock", + "sale_operating_unit", + "stock_operating_unit"], + "description": """ +Operating Unit in Sales Stock +============================= +This module prevents a user from selecting a Warehouse in the Sale Shop +that does not belong to the same operating unit. + + +Credits +======= + +Contributors +------------ + +* Jordi Ballester + + """, + "data": [], + 'installable': True, + 'active': False, +} diff --git a/sale_stock_operating_unit/models/__init__.py b/sale_stock_operating_unit/models/__init__.py new file mode 100644 index 0000000000..f70eaa1e7a --- /dev/null +++ b/sale_stock_operating_unit/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import sale diff --git a/sale_stock_operating_unit/models/sale.py b/sale_stock_operating_unit/models/sale.py new file mode 100644 index 0000000000..59b10a36d7 --- /dev/null +++ b/sale_stock_operating_unit/models/sale.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from openerp.osv import fields, orm +from openerp.tools.translate import _ + + +class SaleShop(orm.Model): + _inherit = 'sale.shop' + + def _check_warehouse_operating_unit(self, cr, uid, ids, context=None): + for r in self.browse(cr, uid, ids, context=context): + if r.warehouse_id and r.operating_unit_id and \ + r.warehouse_id.operating_unit_id != r.operating_unit_id: + return False + return True + + _constraints = [ + (_check_warehouse_operating_unit, + 'The Operating Unit in the Warehouse must be the same as in the ' + 'Sale Shop.', ['operating_unit_id', 'warehouse_id'])] + + +class SaleOrder(orm.Model): + _inherit = 'sale.order' + + def _prepare_order_picking(self, cr, uid, order, context=None): + res = super(SaleOrder, self)._prepare_order_picking(cr, uid, order, + context=context) + if order.operating_unit_id: + res.update({ + 'operating_unit_id': order.operating_unit_id.id + }) + + return res diff --git a/sale_stock_operating_unit/static/description/icon.png b/sale_stock_operating_unit/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/sale_stock_operating_unit/tests/__init__.py b/sale_stock_operating_unit/tests/__init__.py new file mode 100644 index 0000000000..b60f7099ac --- /dev/null +++ b/sale_stock_operating_unit/tests/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from . import test_sale_stock_operating_unit + +checks = [ + test_sale_stock_operating_unit, +] diff --git a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py new file mode 100644 index 0000000000..b85c2b28a7 --- /dev/null +++ b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from openerp import netsvc +from openerp.addons.sale_operating_unit.tests import test_sale_operating_unit + + +class TestSaleStockOperatingUnit(test_sale_operating_unit. + TestSaleOperatingUnit): + + def setUp(self): + super(TestSaleStockOperatingUnit, self).setUp() + cr, uid, context = self.cr, self.uid, {} + data_model = self.registry('ir.model.data') + self.warehouse_model = self.registry('stock.warehouse') + # B2C Warehouse + self.warehouse2 = data_model.get_object(cr, uid, + 'stock_operating_unit', + 'stock_warehouse_b2c') + # Create Shop2 + self.new_shop2_id = self._update_shops(cr, self.user2_id, + self.shop2_id, self.warehouse2, + context=context) + self.stock_pick_model = self.registry('stock.picking.out') +# # Create Sale Order2 + self.new_sale2_id = self._update_sale_order(cr, self.user2_id, + self.sale2_id, + self.new_shop2_id, + context=context) + + def _update_shops(self, cr, uid, shop_id, warehouse, context=None): + """Create a shop.""" + self.shop_model.write(cr, uid, [shop_id], { + 'warehouse_id': warehouse.id, + }) + shop = self.shop_model.browse(cr, uid, shop_id) + new_shop_id = shop.id + return new_shop_id + + def _update_sale_order(self, cr, uid, sale_id, shop, context=None): + """Create a sale order.""" + self.sale_model.write(cr, uid, [sale_id], { + 'shop_id': shop, + }) + sale = self.sale_model.browse(cr, uid, sale_id) + new_sale_id = sale.id + return new_sale_id + + def _confirm_sale(self, cr, uid, sale_id): + self.sale_model.action_button_confirm(cr, uid, [sale_id]) + sale = self.sale_model.browse(cr, uid, sale_id) + for picking in sale.picking_ids: + self.operating_unit = picking.operating_unit_id + return sale + + def test_security(self): + """Test Sale Operating Unit""" + # User 2 is only assigned to Operating Unit B2C, and cannot + # Access Sales order from Main Operating Unit. + cr, uid = self.cr, self.uid + sale_ids = self.sale_model.search(self.cr, self.user2_id, + [('operating_unit_id', '=', + self.ou1.id)]) + self.assertEqual(sale_ids, [], 'User 2 should not have access to ' + 'OU %s' % self.ou1.name) + # Confirm Sale1 + sale1 = self._confirm_sale(cr, uid, self.sale1_id) + # Checks that OU in sale order and stock picking matches or not. + self.assertEqual(self.operating_unit, sale1.operating_unit_id, + 'OU in Sale Order and Picking should be same') + # Confirm Sale2 + sale2 = self._confirm_sale(cr, uid, self.new_sale2_id) + # Checks that OU in sale order and stock picking matches or not. + self.assertEqual(self.operating_unit, sale2.operating_unit_id, + 'OU in Sale Order and Picking should be same') From a4119d70e8c42993373578740976fdfe229ef390 Mon Sep 17 00:00:00 2001 From: Sudhir Arya Date: Wed, 10 Feb 2016 17:09:27 +0530 Subject: [PATCH 02/22] Migrated Sale Stock OU module from v7 to v8. --- sale_stock_operating_unit/__openerp__.py | 27 ++++++-------- sale_stock_operating_unit/models/__init__.py | 2 +- sale_stock_operating_unit/models/sale.py | 37 ------------------- .../models/sale_stock.py | 24 ++++++++++++ 4 files changed, 36 insertions(+), 54 deletions(-) delete mode 100644 sale_stock_operating_unit/models/sale.py create mode 100644 sale_stock_operating_unit/models/sale_stock.py diff --git a/sale_stock_operating_unit/__openerp__.py b/sale_stock_operating_unit/__openerp__.py index 5b20bba1d8..7a16abc17f 100644 --- a/sale_stock_operating_unit/__openerp__.py +++ b/sale_stock_operating_unit/__openerp__.py @@ -6,28 +6,23 @@ { "name": "Operating Unit in Sales Stock", - "version": "7.0.1.0.0", - "author": "Eficent, Odoo Community Association (OCA)", + "summary": "An operating unit (OU) is an organizational entity part of a " + "company", + "version": "8.0.1.0.0", + "author": "Eficent, Serpent Consulting Services Pvt. Ltd., " + "Odoo Community Association (OCA)", "website": "http://www.eficent.com", - "category": "Purchase Management", - "depends": ["sale_stock", - "sale_operating_unit", - "stock_operating_unit"], + "category": "Sales Management", + "depends": [ + "sale_stock", + "sale_operating_unit", + "stock_operating_unit", + ], "description": """ Operating Unit in Sales Stock ============================= This module prevents a user from selecting a Warehouse in the Sale Shop that does not belong to the same operating unit. - - -Credits -======= - -Contributors ------------- - -* Jordi Ballester - """, "data": [], 'installable': True, diff --git a/sale_stock_operating_unit/models/__init__.py b/sale_stock_operating_unit/models/__init__.py index f70eaa1e7a..94e2800aa5 100644 --- a/sale_stock_operating_unit/models/__init__.py +++ b/sale_stock_operating_unit/models/__init__.py @@ -3,4 +3,4 @@ # Jordi Ballester Alomar # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from . import sale +from . import sale_stock diff --git a/sale_stock_operating_unit/models/sale.py b/sale_stock_operating_unit/models/sale.py deleted file mode 100644 index 59b10a36d7..0000000000 --- a/sale_stock_operating_unit/models/sale.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from openerp.osv import fields, orm -from openerp.tools.translate import _ - - -class SaleShop(orm.Model): - _inherit = 'sale.shop' - - def _check_warehouse_operating_unit(self, cr, uid, ids, context=None): - for r in self.browse(cr, uid, ids, context=context): - if r.warehouse_id and r.operating_unit_id and \ - r.warehouse_id.operating_unit_id != r.operating_unit_id: - return False - return True - - _constraints = [ - (_check_warehouse_operating_unit, - 'The Operating Unit in the Warehouse must be the same as in the ' - 'Sale Shop.', ['operating_unit_id', 'warehouse_id'])] - - -class SaleOrder(orm.Model): - _inherit = 'sale.order' - - def _prepare_order_picking(self, cr, uid, order, context=None): - res = super(SaleOrder, self)._prepare_order_picking(cr, uid, order, - context=context) - if order.operating_unit_id: - res.update({ - 'operating_unit_id': order.operating_unit_id.id - }) - - return res diff --git a/sale_stock_operating_unit/models/sale_stock.py b/sale_stock_operating_unit/models/sale_stock.py new file mode 100644 index 0000000000..e1b3e6babe --- /dev/null +++ b/sale_stock_operating_unit/models/sale_stock.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# © 2015 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +from openerp import api, models + + +class StockMove(models.Model): + _inherit = 'stock.move' + + @api.model + def _prepare_picking_assign(self, move): + """ + Override to add Operating Units to Picking. + """ + values = super(StockMove, self)._prepare_picking_assign(move) + sale_line = move.procurement_id and move.procurement_id.sale_line_id + if sale_line: + values.update({ + 'operating_unit_id': sale_line.order_id and + sale_line.order_id.operating_unit_id.id + }) + return values From 1fc5c012fda6d22d1fe7044302b9bc01acdec3e0 Mon Sep 17 00:00:00 2001 From: Sudhir Arya Date: Wed, 10 Feb 2016 18:27:35 +0530 Subject: [PATCH 03/22] Added Test cases and Readme file. --- sale_stock_operating_unit/README.rst | 71 +++++++++++++++++++ sale_stock_operating_unit/__init__.py | 1 - .../models/sale_stock.py | 2 +- sale_stock_operating_unit/tests/__init__.py | 4 -- .../tests/test_sale_stock_operating_unit.py | 62 +++------------- 5 files changed, 81 insertions(+), 59 deletions(-) create mode 100644 sale_stock_operating_unit/README.rst diff --git a/sale_stock_operating_unit/README.rst b/sale_stock_operating_unit/README.rst new file mode 100644 index 0000000000..c29ad528e5 --- /dev/null +++ b/sale_stock_operating_unit/README.rst @@ -0,0 +1,71 @@ +.. image:: https://img.shields.io/badge/license-AGPLv3-blue.svg + :target: https://www.gnu.org/licenses/agpl.html + :alt: License: AGPL-3 + +=============================== +Operating Unit in Sales +=============================== + +This module was written to extend the Sales capabilities of Odoo. +This module introduces the operating unit to the Sales Order. +Security rules are defined to ensure that users can only display the +Sales Orders in which they are allowed access to. + +Installation +============ + +No additional installation instructions are required. + +Configuration +============= + +Go to 'Settings / Technical / Actions / User-defined Defaults' and remove +the default set for the Shop. + +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/213/7.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 smashing it by providing a detailed and welcomed `feedback +`_. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Eficent Business and IT Consulting Services S.L. +* Serpent Consulting Services Pvt. Ltd. + +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 http://odoo-community.org. \ No newline at end of file diff --git a/sale_stock_operating_unit/__init__.py b/sale_stock_operating_unit/__init__.py index 55c73fac1c..162c4582ef 100644 --- a/sale_stock_operating_unit/__init__.py +++ b/sale_stock_operating_unit/__init__.py @@ -4,4 +4,3 @@ # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from . import models -from . import tests diff --git a/sale_stock_operating_unit/models/sale_stock.py b/sale_stock_operating_unit/models/sale_stock.py index e1b3e6babe..a26f3ace4a 100644 --- a/sale_stock_operating_unit/models/sale_stock.py +++ b/sale_stock_operating_unit/models/sale_stock.py @@ -19,6 +19,6 @@ def _prepare_picking_assign(self, move): if sale_line: values.update({ 'operating_unit_id': sale_line.order_id and - sale_line.order_id.operating_unit_id.id + sale_line.order_id.operating_unit_id.id }) return values diff --git a/sale_stock_operating_unit/tests/__init__.py b/sale_stock_operating_unit/tests/__init__.py index b60f7099ac..d0f33843aa 100644 --- a/sale_stock_operating_unit/tests/__init__.py +++ b/sale_stock_operating_unit/tests/__init__.py @@ -4,7 +4,3 @@ # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from . import test_sale_stock_operating_unit - -checks = [ - test_sale_stock_operating_unit, -] diff --git a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py index b85c2b28a7..74b33a6ee9 100644 --- a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py +++ b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py @@ -12,66 +12,22 @@ class TestSaleStockOperatingUnit(test_sale_operating_unit. def setUp(self): super(TestSaleStockOperatingUnit, self).setUp() - cr, uid, context = self.cr, self.uid, {} - data_model = self.registry('ir.model.data') - self.warehouse_model = self.registry('stock.warehouse') - # B2C Warehouse - self.warehouse2 = data_model.get_object(cr, uid, - 'stock_operating_unit', - 'stock_warehouse_b2c') - # Create Shop2 - self.new_shop2_id = self._update_shops(cr, self.user2_id, - self.shop2_id, self.warehouse2, - context=context) - self.stock_pick_model = self.registry('stock.picking.out') -# # Create Sale Order2 - self.new_sale2_id = self._update_sale_order(cr, self.user2_id, - self.sale2_id, - self.new_shop2_id, - context=context) - def _update_shops(self, cr, uid, shop_id, warehouse, context=None): - """Create a shop.""" - self.shop_model.write(cr, uid, [shop_id], { - 'warehouse_id': warehouse.id, - }) - shop = self.shop_model.browse(cr, uid, shop_id) - new_shop_id = shop.id - return new_shop_id - - def _update_sale_order(self, cr, uid, sale_id, shop, context=None): - """Create a sale order.""" - self.sale_model.write(cr, uid, [sale_id], { - 'shop_id': shop, - }) - sale = self.sale_model.browse(cr, uid, sale_id) - new_sale_id = sale.id - return new_sale_id - - def _confirm_sale(self, cr, uid, sale_id): - self.sale_model.action_button_confirm(cr, uid, [sale_id]) - sale = self.sale_model.browse(cr, uid, sale_id) - for picking in sale.picking_ids: - self.operating_unit = picking.operating_unit_id - return sale + def _confirm_sale(self, sale): + sale.action_button_confirm() + return True def test_security(self): """Test Sale Operating Unit""" - # User 2 is only assigned to Operating Unit B2C, and cannot - # Access Sales order from Main Operating Unit. - cr, uid = self.cr, self.uid - sale_ids = self.sale_model.search(self.cr, self.user2_id, - [('operating_unit_id', '=', - self.ou1.id)]) - self.assertEqual(sale_ids, [], 'User 2 should not have access to ' - 'OU %s' % self.ou1.name) # Confirm Sale1 - sale1 = self._confirm_sale(cr, uid, self.sale1_id) + self._confirm_sale(self.sale1) # Checks that OU in sale order and stock picking matches or not. - self.assertEqual(self.operating_unit, sale1.operating_unit_id, + self.assertEqual(self.sale1.operating_unit_id, + self.sale1.picking_ids.operating_unit_id, 'OU in Sale Order and Picking should be same') # Confirm Sale2 - sale2 = self._confirm_sale(cr, uid, self.new_sale2_id) + self._confirm_sale(self.sale2) # Checks that OU in sale order and stock picking matches or not. - self.assertEqual(self.operating_unit, sale2.operating_unit_id, + self.assertEqual(self.sale2.operating_unit_id, + self.sale2.picking_ids.operating_unit_id, 'OU in Sale Order and Picking should be same') From 64539c0d6ce75df20da3364fbcee8238ef8f72fa Mon Sep 17 00:00:00 2001 From: aheficent Date: Wed, 24 Aug 2016 11:14:24 +0200 Subject: [PATCH 04/22] Migrate to v9 --- sale_stock_operating_unit/README.rst | 21 +++----- sale_stock_operating_unit/__init__.py | 2 +- sale_stock_operating_unit/__openerp__.py | 13 ++--- .../models/sale_stock.py | 49 ++++++++++++++++++- sale_stock_operating_unit/tests/__init__.py | 2 +- .../tests/test_sale_stock_operating_unit.py | 6 +-- 6 files changed, 62 insertions(+), 31 deletions(-) diff --git a/sale_stock_operating_unit/README.rst b/sale_stock_operating_unit/README.rst index c29ad528e5..b2f1e6c901 100644 --- a/sale_stock_operating_unit/README.rst +++ b/sale_stock_operating_unit/README.rst @@ -1,6 +1,6 @@ -.. image:: https://img.shields.io/badge/license-AGPLv3-blue.svg - :target: https://www.gnu.org/licenses/agpl.html - :alt: License: AGPL-3 +.. image:: https://img.shields.io/badge/license-LGPLv3-blue.svg + :target: https://www.gnu.org/licenses/lgpl.html + :alt: License: LGPL-3 =============================== Operating Unit in Sales @@ -11,10 +11,6 @@ This module introduces the operating unit to the Sales Order. Security rules are defined to ensure that users can only display the Sales Orders in which they are allowed access to. -Installation -============ - -No additional installation instructions are required. Configuration ============= @@ -33,13 +29,10 @@ Bug Tracker =========== Bugs are tracked on `GitHub Issues -`_. In case of trouble, please +`_. 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 -`_. +help us smashing it by providing a detailed and welcomed feedback. + Credits ======= @@ -68,4 +61,4 @@ 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 http://odoo-community.org. \ No newline at end of file +To contribute to this module, please visit http://odoo-community.org. diff --git a/sale_stock_operating_unit/__init__.py b/sale_stock_operating_unit/__init__.py index 162c4582ef..747d0698d4 100644 --- a/sale_stock_operating_unit/__init__.py +++ b/sale_stock_operating_unit/__init__.py @@ -2,5 +2,5 @@ # © 2015 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import models diff --git a/sale_stock_operating_unit/__openerp__.py b/sale_stock_operating_unit/__openerp__.py index 7a16abc17f..d3639b0f7e 100644 --- a/sale_stock_operating_unit/__openerp__.py +++ b/sale_stock_operating_unit/__openerp__.py @@ -2,15 +2,16 @@ # © 2015 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). { "name": "Operating Unit in Sales Stock", "summary": "An operating unit (OU) is an organizational entity part of a " "company", - "version": "8.0.1.0.0", + "version": "9.0.1.0.0", "author": "Eficent, Serpent Consulting Services Pvt. Ltd., " "Odoo Community Association (OCA)", + "license": "LGPL-3", "website": "http://www.eficent.com", "category": "Sales Management", "depends": [ @@ -18,13 +19,5 @@ "sale_operating_unit", "stock_operating_unit", ], - "description": """ -Operating Unit in Sales Stock -============================= -This module prevents a user from selecting a Warehouse in the Sale Shop -that does not belong to the same operating unit. - """, - "data": [], 'installable': True, - 'active': False, } diff --git a/sale_stock_operating_unit/models/sale_stock.py b/sale_stock_operating_unit/models/sale_stock.py index a26f3ace4a..9260b5bb19 100644 --- a/sale_stock_operating_unit/models/sale_stock.py +++ b/sale_stock_operating_unit/models/sale_stock.py @@ -2,8 +2,9 @@ # © 2015 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from openerp import api, models +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from openerp import api, models, _ +from openerp.exceptions import ValidationError class StockMove(models.Model): @@ -22,3 +23,47 @@ def _prepare_picking_assign(self, move): sale_line.order_id.operating_unit_id.id }) return values + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + @api.onchange('team_id') + def onchange_team_id(self): + super(SaleOrder, self).onchange_team_id() + if self.team_id and self.team_id.operating_unit_id: + warehouses = self.env['stock.warehouse'].search( + [('operating_unit_id', '=', + self.team_id.operating_unit_id.id)]) + if warehouses: + self.warehouse_id = warehouses[0] + + @api.onchange('operating_unit_id') + def onchange_operating_unit_id(self): + if self.operating_unit_id: + warehouses = self.env['stock.warehouse'].search( + [('operating_unit_id', '=', + self.operating_unit_id.id)]) + if warehouses: + self.warehouse_id = warehouses[0] + if self.team_id and self.team_id.operating_unit_id != \ + self.operating_unit_id: + self.team_id = False + + @api.onchange('warehouse_id') + def onchange_warehouse_id(self): + if self.warehouse_id: + self.operating_unit_id = self.warehouse_id.operating_unit_id + if self.team_id and self.team_id.operating_unit_id != \ + self.operating_unit_id: + self.team_id = False + + @api.multi + @api.constrains('operating_unit_id', 'warehouse_id') + def _check_wh_operating_unit(self): + for rec in self: + if rec.operating_unit_id and rec.operating_unit_id != \ + rec.warehouse_id.operating_unit_id: + raise ValidationError(_('Configuration error!\nThe Operating' + 'Unit in the Sales Order and in the' + ' Warehouse must be the same.')) diff --git a/sale_stock_operating_unit/tests/__init__.py b/sale_stock_operating_unit/tests/__init__.py index d0f33843aa..a585db84eb 100644 --- a/sale_stock_operating_unit/tests/__init__.py +++ b/sale_stock_operating_unit/tests/__init__.py @@ -2,5 +2,5 @@ # © 2015 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import test_sale_stock_operating_unit diff --git a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py index 74b33a6ee9..90288d2416 100644 --- a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py +++ b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py @@ -2,8 +2,8 @@ # © 2015 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar # © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from openerp import netsvc +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + from openerp.addons.sale_operating_unit.tests import test_sale_operating_unit @@ -14,7 +14,7 @@ def setUp(self): super(TestSaleStockOperatingUnit, self).setUp() def _confirm_sale(self, sale): - sale.action_button_confirm() + sale.action_confirm() return True def test_security(self): From 6ddb8fb88a2230c8cf9276b1538235206693bd67 Mon Sep 17 00:00:00 2001 From: lreficent Date: Tue, 31 Jan 2017 13:30:21 +0100 Subject: [PATCH 05/22] [MIG] sale_stock_operating_unit to v10. --- sale_stock_operating_unit/README.rst | 16 +++++----- sale_stock_operating_unit/__init__.py | 4 +-- .../{__openerp__.py => __manifest__.py} | 8 ++--- sale_stock_operating_unit/models/__init__.py | 10 ++++--- .../models/{sale_stock.py => sale_order.py} | 29 +++---------------- .../models/stock_move.py | 23 +++++++++++++++ .../models/stock_warehouse.py | 23 +++++++++++++++ sale_stock_operating_unit/tests/__init__.py | 4 +-- .../tests/test_sale_stock_operating_unit.py | 6 ++-- 9 files changed, 74 insertions(+), 49 deletions(-) rename sale_stock_operating_unit/{__openerp__.py => __manifest__.py} (73%) rename sale_stock_operating_unit/models/{sale_stock.py => sale_order.py} (66%) create mode 100644 sale_stock_operating_unit/models/stock_move.py create mode 100644 sale_stock_operating_unit/models/stock_warehouse.py diff --git a/sale_stock_operating_unit/README.rst b/sale_stock_operating_unit/README.rst index b2f1e6c901..f9fc7687c0 100644 --- a/sale_stock_operating_unit/README.rst +++ b/sale_stock_operating_unit/README.rst @@ -2,15 +2,13 @@ :target: https://www.gnu.org/licenses/lgpl.html :alt: License: LGPL-3 -=============================== -Operating Unit in Sales -=============================== - -This module was written to extend the Sales capabilities of Odoo. -This module introduces the operating unit to the Sales Order. -Security rules are defined to ensure that users can only display the -Sales Orders in which they are allowed access to. +============================= +Operating Unit in Sales Stock +============================= +This module was written to extend the Sales and the Stock capabilities of Odoo. +This module introduces some new operating unit (OU) capabilities in order to +enhance the performance of already existing OU features for Sales and Stock. Configuration ============= @@ -23,7 +21,7 @@ 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/213/7.0 + :target: https://runbot.odoo-community.org/runbot/213/10.0 Bug Tracker =========== diff --git a/sale_stock_operating_unit/__init__.py b/sale_stock_operating_unit/__init__.py index 747d0698d4..2ac09aec86 100644 --- a/sale_stock_operating_unit/__init__.py +++ b/sale_stock_operating_unit/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - +# © 2015-17 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import models diff --git a/sale_stock_operating_unit/__openerp__.py b/sale_stock_operating_unit/__manifest__.py similarity index 73% rename from sale_stock_operating_unit/__openerp__.py rename to sale_stock_operating_unit/__manifest__.py index d3639b0f7e..87c94071e9 100644 --- a/sale_stock_operating_unit/__openerp__.py +++ b/sale_stock_operating_unit/__manifest__.py @@ -1,18 +1,18 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - +# © 2015-17 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). { "name": "Operating Unit in Sales Stock", "summary": "An operating unit (OU) is an organizational entity part of a " "company", - "version": "9.0.1.0.0", + "version": "10.0.1.0.0", "author": "Eficent, Serpent Consulting Services Pvt. Ltd., " "Odoo Community Association (OCA)", "license": "LGPL-3", - "website": "http://www.eficent.com", + "website": "https://github.com/OCA/operating-unit", "category": "Sales Management", "depends": [ "sale_stock", diff --git a/sale_stock_operating_unit/models/__init__.py b/sale_stock_operating_unit/models/__init__.py index 94e2800aa5..165f269659 100644 --- a/sale_stock_operating_unit/models/__init__.py +++ b/sale_stock_operating_unit/models/__init__.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - +# © 2015-17 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from . import sale_stock +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from . import sale_order +from . import stock_move +from . import stock_warehouse diff --git a/sale_stock_operating_unit/models/sale_stock.py b/sale_stock_operating_unit/models/sale_order.py similarity index 66% rename from sale_stock_operating_unit/models/sale_stock.py rename to sale_stock_operating_unit/models/sale_order.py index 9260b5bb19..1577750539 100644 --- a/sale_stock_operating_unit/models/sale_stock.py +++ b/sale_stock_operating_unit/models/sale_order.py @@ -1,28 +1,10 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - +# © 2015-17 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from openerp import api, models, _ -from openerp.exceptions import ValidationError - - -class StockMove(models.Model): - _inherit = 'stock.move' - - @api.model - def _prepare_picking_assign(self, move): - """ - Override to add Operating Units to Picking. - """ - values = super(StockMove, self)._prepare_picking_assign(move) - sale_line = move.procurement_id and move.procurement_id.sale_line_id - if sale_line: - values.update({ - 'operating_unit_id': sale_line.order_id and - sale_line.order_id.operating_unit_id.id - }) - return values +from odoo import api, models, _ +from odoo.exceptions import ValidationError class SaleOrder(models.Model): @@ -46,9 +28,6 @@ def onchange_operating_unit_id(self): self.operating_unit_id.id)]) if warehouses: self.warehouse_id = warehouses[0] - if self.team_id and self.team_id.operating_unit_id != \ - self.operating_unit_id: - self.team_id = False @api.onchange('warehouse_id') def onchange_warehouse_id(self): diff --git a/sale_stock_operating_unit/models/stock_move.py b/sale_stock_operating_unit/models/stock_move.py new file mode 100644 index 0000000000..18107f0dbc --- /dev/null +++ b/sale_stock_operating_unit/models/stock_move.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from odoo import models + + +class StockMove(models.Model): + _inherit = 'stock.move' + + def _get_new_picking_values(self): + """ + Override to add Operating Units to Picking. + """ + values = super(StockMove, self)._prepare_picking_assign() + sale_line = self.procurement_id and self.procurement_id.sale_line_id + if sale_line: + values.update({ + 'operating_unit_id': sale_line.order_id and + sale_line.order_id.operating_unit_id.id + }) + return values diff --git a/sale_stock_operating_unit/models/stock_warehouse.py b/sale_stock_operating_unit/models/stock_warehouse.py new file mode 100644 index 0000000000..c4eabcc795 --- /dev/null +++ b/sale_stock_operating_unit/models/stock_warehouse.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Jordi Ballester Alomar +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from odoo import api, models, _ +from odoo.exceptions import ValidationError + + +class StockWarehouse(models.Model): + _inherit = 'stock.warehouse' + + @api.multi + @api.constrains('operating_unit_id') + def _check_existing_so_in_wh(self): + for rec in self: + sales = self.env['sales.order'].search([ + ('warehouse_id', '=', rec.id), + ('operating_unit_id', '!=', rec.operating_unit_id)]) + if sales: + raise ValidationError(_( + 'Sales Order records already exist(s) for this warehouse' + ' and operating unit.')) diff --git a/sale_stock_operating_unit/tests/__init__.py b/sale_stock_operating_unit/tests/__init__.py index a585db84eb..3dc1091e8f 100644 --- a/sale_stock_operating_unit/tests/__init__.py +++ b/sale_stock_operating_unit/tests/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - +# © 2015-17 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import test_sale_stock_operating_unit diff --git a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py index 90288d2416..a519e0c1fd 100644 --- a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py +++ b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - +# © 2015-17 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from openerp.addons.sale_operating_unit.tests import test_sale_operating_unit +from odoo.addons.sale_operating_unit.tests import test_sale_operating_unit class TestSaleStockOperatingUnit(test_sale_operating_unit. From ece3e7c46e17b334e84aed563eaaa9f788e519ec Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Wed, 8 Feb 2017 12:09:54 +0100 Subject: [PATCH 06/22] Fix constraint on warehouses (#61) --- sale_stock_operating_unit/models/stock_warehouse.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sale_stock_operating_unit/models/stock_warehouse.py b/sale_stock_operating_unit/models/stock_warehouse.py index c4eabcc795..3fe320e312 100644 --- a/sale_stock_operating_unit/models/stock_warehouse.py +++ b/sale_stock_operating_unit/models/stock_warehouse.py @@ -14,9 +14,9 @@ class StockWarehouse(models.Model): @api.constrains('operating_unit_id') def _check_existing_so_in_wh(self): for rec in self: - sales = self.env['sales.order'].search([ + sales = self.env['sale.order'].search([ ('warehouse_id', '=', rec.id), - ('operating_unit_id', '!=', rec.operating_unit_id)]) + ('operating_unit_id', '!=', rec.operating_unit_id.id)]) if sales: raise ValidationError(_( 'Sales Order records already exist(s) for this warehouse' From 59337a737ff446f2558295565cbe9c7b1428f154 Mon Sep 17 00:00:00 2001 From: aaron Date: Wed, 16 May 2018 11:27:39 +0200 Subject: [PATCH 07/22] [FIX]team operating unit has more priority than the default warehouse od the company [FIX]access operating unit of the sales team --- sale_stock_operating_unit/models/sale_order.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/sale_stock_operating_unit/models/sale_order.py b/sale_stock_operating_unit/models/sale_order.py index 1577750539..1e7f2beb41 100644 --- a/sale_stock_operating_unit/models/sale_order.py +++ b/sale_stock_operating_unit/models/sale_order.py @@ -3,13 +3,28 @@ # Jordi Ballester Alomar # © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo import api, models, _ +from odoo import api, fields, models, _ from odoo.exceptions import ValidationError class SaleOrder(models.Model): _inherit = 'sale.order' + @api.model + def _default_warehouse_id(self): + res = super(SaleOrder, self)._default_warehouse_id() + team = self._get_default_team() + warehouses = self.env['stock.warehouse'].search( + [('operating_unit_id', '=', team.sudo().operating_unit_id.id)], + limit=1) + if warehouses: + return warehouses + return res + + warehouse_id = fields.Many2one( + comodel_name='stock.warehouse', + default=_default_warehouse_id) + @api.onchange('team_id') def onchange_team_id(self): super(SaleOrder, self).onchange_team_id() From e26afd42e40adbf2da1f75578c919cdec018fcc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Be=C3=B1at=20Jimenez?= Date: Mon, 11 Feb 2019 14:01:26 +0100 Subject: [PATCH 08/22] [MIG] sale_stock_operating_unit: Migration to v12 --- sale_stock_operating_unit/README.rst | 82 +++- sale_stock_operating_unit/__init__.py | 4 - sale_stock_operating_unit/__manifest__.py | 7 +- sale_stock_operating_unit/models/__init__.py | 4 - .../models/sale_order.py | 11 +- .../models/stock_move.py | 18 +- .../models/stock_warehouse.py | 5 +- .../readme/CONFIGURATION.rst | 2 + .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 3 + sale_stock_operating_unit/readme/USAGE.rst | 15 + .../static/description/index.html | 443 ++++++++++++++++++ sale_stock_operating_unit/tests/__init__.py | 4 - .../tests/test_sale_stock_operating_unit.py | 105 ++++- 14 files changed, 641 insertions(+), 64 deletions(-) create mode 100644 sale_stock_operating_unit/readme/CONFIGURATION.rst create mode 100644 sale_stock_operating_unit/readme/CONTRIBUTORS.rst create mode 100644 sale_stock_operating_unit/readme/DESCRIPTION.rst create mode 100644 sale_stock_operating_unit/readme/USAGE.rst create mode 100644 sale_stock_operating_unit/static/description/index.html diff --git a/sale_stock_operating_unit/README.rst b/sale_stock_operating_unit/README.rst index f9fc7687c0..c9cc7c113c 100644 --- a/sale_stock_operating_unit/README.rst +++ b/sale_stock_operating_unit/README.rst @@ -1,62 +1,96 @@ -.. image:: https://img.shields.io/badge/license-LGPLv3-blue.svg - :target: https://www.gnu.org/licenses/lgpl.html - :alt: License: LGPL-3 - ============================= Operating Unit in Sales Stock ============================= +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Foperating--unit-lightgray.png?logo=github + :target: https://github.com/OCA/operating-unit/tree/12.0/sale_stock_operating_unit + :alt: OCA/operating-unit +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/operating-unit-12-0/operating-unit-12-0-sale_stock_operating_unit + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/213/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + This module was written to extend the Sales and the Stock capabilities of Odoo. This module introduces some new operating unit (OU) capabilities in order to enhance the performance of already existing OU features for Sales and Stock. -Configuration -============= +**Table of contents** -Go to 'Settings / Technical / Actions / User-defined Defaults' and remove -the default set for the Shop. +.. contents:: + :local: 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/213/10.0 +Follow these steps: + +#. Use a created Operating Unit (OU) or create one in Settings -> + Users&Companies -> Operating + Units. +#. Use a created Sales Team or create a new one in Sales -> Configuration -> + Sales Team and assign an OU +#. Create a new Warehouse with the previous OU (or use a Warehouse with an + assigned OU) +#. Check the Location has the same OU as the Warehouse in Inventory -> + Configuration Locations (make sure you have Storage Locations checkbox + activated) +#. Create a new Sale Order with the Sales Team, Operating Unit and Warehouse + used/created before. +#. OU, Picking Type and Location are propagated to the Picking. 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 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. Credits ======= -Images ------- +Authors +~~~~~~~ -* Odoo Community Association: `Icon `_. +* Eficent +* Serpent Consulting Services Pvt. Ltd. Contributors ------------- +~~~~~~~~~~~~ * Eficent Business and IT Consulting Services S.L. * Serpent Consulting Services Pvt. Ltd. -Maintainer ----------- +Maintainers +~~~~~~~~~~~ + +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 http://odoo-community.org. +This module is part of the `OCA/operating-unit `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_stock_operating_unit/__init__.py b/sale_stock_operating_unit/__init__.py index 2ac09aec86..133f68732d 100644 --- a/sale_stock_operating_unit/__init__.py +++ b/sale_stock_operating_unit/__init__.py @@ -1,6 +1,2 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import models diff --git a/sale_stock_operating_unit/__manifest__.py b/sale_stock_operating_unit/__manifest__.py index 87c94071e9..51f165ee31 100644 --- a/sale_stock_operating_unit/__manifest__.py +++ b/sale_stock_operating_unit/__manifest__.py @@ -1,14 +1,13 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Copyright 2015-19 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# Copyright 2015-19 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). { "name": "Operating Unit in Sales Stock", "summary": "An operating unit (OU) is an organizational entity part of a " "company", - "version": "10.0.1.0.0", + "version": "12.0.1.0.0", "author": "Eficent, Serpent Consulting Services Pvt. Ltd., " "Odoo Community Association (OCA)", "license": "LGPL-3", diff --git a/sale_stock_operating_unit/models/__init__.py b/sale_stock_operating_unit/models/__init__.py index 165f269659..18ebfa1c1e 100644 --- a/sale_stock_operating_unit/models/__init__.py +++ b/sale_stock_operating_unit/models/__init__.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import sale_order from . import stock_move diff --git a/sale_stock_operating_unit/models/sale_order.py b/sale_stock_operating_unit/models/sale_order.py index 1e7f2beb41..f3b451a28f 100644 --- a/sale_stock_operating_unit/models/sale_order.py +++ b/sale_stock_operating_unit/models/sale_order.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Copyright 2015-19 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# Copyright 2015-19 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import api, fields, models, _ from odoo.exceptions import ValidationError @@ -31,7 +30,8 @@ def onchange_team_id(self): if self.team_id and self.team_id.operating_unit_id: warehouses = self.env['stock.warehouse'].search( [('operating_unit_id', '=', - self.team_id.operating_unit_id.id)]) + self.team_id.operating_unit_id.id)], + limit=1) if warehouses: self.warehouse_id = warehouses[0] @@ -40,7 +40,8 @@ def onchange_operating_unit_id(self): if self.operating_unit_id: warehouses = self.env['stock.warehouse'].search( [('operating_unit_id', '=', - self.operating_unit_id.id)]) + self.operating_unit_id.id)], + limit=1) if warehouses: self.warehouse_id = warehouses[0] diff --git a/sale_stock_operating_unit/models/stock_move.py b/sale_stock_operating_unit/models/stock_move.py index 18107f0dbc..0727c8189e 100644 --- a/sale_stock_operating_unit/models/stock_move.py +++ b/sale_stock_operating_unit/models/stock_move.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Copyright 2015-19 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# Copyright 2015-19 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import models @@ -13,11 +12,10 @@ def _get_new_picking_values(self): """ Override to add Operating Units to Picking. """ - values = super(StockMove, self)._prepare_picking_assign() - sale_line = self.procurement_id and self.procurement_id.sale_line_id - if sale_line: - values.update({ - 'operating_unit_id': sale_line.order_id and - sale_line.order_id.operating_unit_id.id - }) + values = super(StockMove, self)._get_new_picking_values() + + values.update({ + 'operating_unit_id': self.sale_line_id.operating_unit_id.id + }) + return values diff --git a/sale_stock_operating_unit/models/stock_warehouse.py b/sale_stock_operating_unit/models/stock_warehouse.py index 3fe320e312..76e5b21581 100644 --- a/sale_stock_operating_unit/models/stock_warehouse.py +++ b/sale_stock_operating_unit/models/stock_warehouse.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Copyright 2015-19 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# Copyright 2015-19 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import api, models, _ from odoo.exceptions import ValidationError diff --git a/sale_stock_operating_unit/readme/CONFIGURATION.rst b/sale_stock_operating_unit/readme/CONFIGURATION.rst new file mode 100644 index 0000000000..01a0841ee6 --- /dev/null +++ b/sale_stock_operating_unit/readme/CONFIGURATION.rst @@ -0,0 +1,2 @@ +Go to 'Settings / Technical / Actions / User-defined Defaults' and remove +the default set for the Shop. diff --git a/sale_stock_operating_unit/readme/CONTRIBUTORS.rst b/sale_stock_operating_unit/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..6f26312176 --- /dev/null +++ b/sale_stock_operating_unit/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Eficent Business and IT Consulting Services S.L. +* Serpent Consulting Services Pvt. Ltd. diff --git a/sale_stock_operating_unit/readme/DESCRIPTION.rst b/sale_stock_operating_unit/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..4a1bbe58ae --- /dev/null +++ b/sale_stock_operating_unit/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module was written to extend the Sales and the Stock capabilities of Odoo. +This module introduces some new operating unit (OU) capabilities in order to +enhance the performance of already existing OU features for Sales and Stock. diff --git a/sale_stock_operating_unit/readme/USAGE.rst b/sale_stock_operating_unit/readme/USAGE.rst new file mode 100644 index 0000000000..a4f2957826 --- /dev/null +++ b/sale_stock_operating_unit/readme/USAGE.rst @@ -0,0 +1,15 @@ +Follow these steps: + +#. Use a created Operating Unit (OU) or create one in Settings -> + Users&Companies -> Operating + Units. +#. Use a created Sales Team or create a new one in Sales -> Configuration -> + Sales Team and assign an OU +#. Create a new Warehouse with the previous OU (or use a Warehouse with an + assigned OU) +#. Check the Location has the same OU as the Warehouse in Inventory -> + Configuration Locations (make sure you have Storage Locations checkbox + activated) +#. Create a new Sale Order with the Sales Team, Operating Unit and Warehouse + used/created before. +#. OU, Picking Type and Location are propagated to the Picking. \ No newline at end of file diff --git a/sale_stock_operating_unit/static/description/index.html b/sale_stock_operating_unit/static/description/index.html new file mode 100644 index 0000000000..e7ceba476f --- /dev/null +++ b/sale_stock_operating_unit/static/description/index.html @@ -0,0 +1,443 @@ + + + + + + +Operating Unit in Sales Stock + + + +
+

Operating Unit in Sales Stock

+ + +

Beta License: LGPL-3 OCA/operating-unit Translate me on Weblate Try me on Runbot

+

This module was written to extend the Sales and the Stock capabilities of Odoo. +This module introduces some new operating unit (OU) capabilities in order to +enhance the performance of already existing OU features for Sales and Stock.

+

Table of contents

+ +
+

Usage

+

Follow these steps:

+
    +
  1. Use a created Operating Unit (OU) or create one in Settings -> +Users&Companies -> Operating +Units.
  2. +
  3. Use a created Sales Team or create a new one in Sales -> Configuration -> +Sales Team and assign an OU
  4. +
  5. Create a new Warehouse with the previous OU (or use a Warehouse with an +assigned OU)
  6. +
  7. Check the Location has the same OU as the Warehouse in Inventory -> +Configuration Locations (make sure you have Storage Locations checkbox +activated)
  8. +
  9. Create a new Sale Order with the Sales Team, Operating Unit and Warehouse +used/created before.
  10. +
  11. OU, Picking Type and Location are propagated to the Picking.
  12. +
+
+
+

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 +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Eficent
  • +
  • Serpent Consulting Services Pvt. Ltd.
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

This module is part of the OCA/operating-unit project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/sale_stock_operating_unit/tests/__init__.py b/sale_stock_operating_unit/tests/__init__.py index 3dc1091e8f..0d6189565e 100644 --- a/sale_stock_operating_unit/tests/__init__.py +++ b/sale_stock_operating_unit/tests/__init__.py @@ -1,6 +1,2 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import test_sale_stock_operating_unit diff --git a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py index a519e0c1fd..3038e4bf70 100644 --- a/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py +++ b/sale_stock_operating_unit/tests/test_sale_stock_operating_unit.py @@ -1,17 +1,110 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# Copyright 2015-19 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# Copyright 2015-19 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from odoo.addons.sale_operating_unit.tests import test_sale_operating_unit +from odoo.tests import common -class TestSaleStockOperatingUnit(test_sale_operating_unit. - TestSaleOperatingUnit): +class TestSaleStockOperatingUnit(common.TransactionCase): def setUp(self): super(TestSaleStockOperatingUnit, self).setUp() + self.res_groups = self.env['res.groups'] + self.res_users_model = self.env['res.users'] + self.warehouse_model = self.env['stock.warehouse'] + self.sale_model = self.env['sale.order'] + self.sale_line_model = self.env['sale.order.line'] + self.sale_team_model = self.env['crm.team'] + # Company + self.company = self.env.ref('base.main_company') + # Groups + self.grp_sale_user = self.env.ref('sales_team.group_sale_manager') + self.grp_acc_user = self.env.ref('account.group_account_invoice') + # Main Operating Unit + self.ou1 = self.env.ref('operating_unit.main_operating_unit') + # B2C Operating Unit + self.b2c = self.env.ref('operating_unit.b2c_operating_unit') + # Customer + self.customer = self.env.ref('base.res_partner_2') + # Price list + self.pricelist = self.env.ref('product.list0') + # Products + self.product1 = self.env.ref( + 'product.product_product_7') + self.product1.write({'invoice_policy': 'order'}) + # Create user1 + self.user1 = self._create_user('user_1', [self.grp_sale_user, + self.grp_acc_user], + self.company, [self.ou1, self.b2c]) + # Create user2 + self.user2 = self._create_user('user_2', [self.grp_sale_user, + self.grp_acc_user], + self.company, [self.b2c]) + + # Create sales team OU1 + self.sale_team_ou1 = self._create_sale_team(self.user1.id, self.ou1) + + # Create sales team OU2 + self.sale_team_b2c = self._create_sale_team(self.user2.id, self.b2c) + + # Warehouses + self.ou1_wh = self.env.ref('stock.warehouse0') + self.b2c_wh = self.env.ref('stock_operating_unit.stock_warehouse_b2c') + # Locations + self.b2c_wh.lot_stock_id.write({'company_id': self.company.id, + 'operating_unit_id': self.b2c.id}) + + # Create Sale Order1 + self.sale1 = self._create_sale_order(self.user1.id, self.customer, + self.product1, self.pricelist, + self.sale_team_ou1, self.ou1_wh) + # Create Sale Order2 + self.sale2 = self._create_sale_order(self.user2.id, self.customer, + self.product1, self.pricelist, + self.sale_team_b2c, self.b2c_wh) + + def _create_user(self, login, groups, company, operating_units): + """Create a user.""" + group_ids = [group.id for group in groups] + user = self.res_users_model.create({ + 'name': 'Test Sales User', + 'login': login, + 'password': 'demo', + 'email': 'example@yourcompany.com', + 'company_id': company.id, + 'company_ids': [(4, company.id)], + 'operating_unit_ids': [(4, ou.id) for ou in operating_units], + 'groups_id': [(6, 0, group_ids)] + }) + return user + + def _create_sale_team(self, uid, operating_unit): + """Create a sale team.""" + team = self.sale_team_model.sudo(uid).with_context( + mail_create_nosubscribe=True).create({ + 'name': operating_unit.name, + 'operating_unit_id': operating_unit.id + }) + return team + + def _create_sale_order(self, uid, customer, product, pricelist, team, wh): + """Create a sale order.""" + sale = self.sale_model.sudo(uid).create({ + 'partner_id': customer.id, + 'partner_invoice_id': customer.id, + 'partner_shipping_id': customer.id, + 'pricelist_id': pricelist.id, + 'team_id': team.id, + 'operating_unit_id': team.operating_unit_id.id, + 'warehouse_id': wh.id + }) + self.sale_line_model.sudo(uid).create({ + 'order_id': sale.id, + 'product_id': product.id, + 'name': 'Sale Order Line' + }) + return sale def _confirm_sale(self, sale): sale.action_confirm() From b338e33740aac7f1087910c784e820d1476479c4 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 18 Dec 2019 14:43:02 +0000 Subject: [PATCH 09/22] [UPD] Update sale_stock_operating_unit.pot --- .../i18n/sale_stock_operating_unit.pot | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 sale_stock_operating_unit/i18n/sale_stock_operating_unit.pot diff --git a/sale_stock_operating_unit/i18n/sale_stock_operating_unit.pot b/sale_stock_operating_unit/i18n/sale_stock_operating_unit.pot new file mode 100644 index 0000000000..bc26df6f19 --- /dev/null +++ b/sale_stock_operating_unit/i18n/sale_stock_operating_unit.pot @@ -0,0 +1,44 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_stock_operating_unit +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: sale_stock_operating_unit +#: code:addons/sale_stock_operating_unit/models/sale_order.py:62 +#, python-format +msgid "Configuration error!\n" +"The OperatingUnit in the Sales Order and in the Warehouse must be the same." +msgstr "" + +#. module: sale_stock_operating_unit +#: model:ir.model,name:sale_stock_operating_unit.model_sale_order +msgid "Sale Order" +msgstr "" + +#. module: sale_stock_operating_unit +#: code:addons/sale_stock_operating_unit/models/stock_warehouse.py:20 +#, python-format +msgid "Sales Order records already exist(s) for this warehouse and operating unit." +msgstr "" + +#. module: sale_stock_operating_unit +#: model:ir.model,name:sale_stock_operating_unit.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: sale_stock_operating_unit +#: model:ir.model,name:sale_stock_operating_unit.model_stock_warehouse +#: model:ir.model.fields,field_description:sale_stock_operating_unit.field_sale_order__warehouse_id +msgid "Warehouse" +msgstr "" + From 5a4d468871a6870fea2290b3aff1d6dea01eb4f2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 18 Dec 2019 14:50:15 +0000 Subject: [PATCH 10/22] [UPD] README.rst --- sale_stock_operating_unit/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_stock_operating_unit/static/description/index.html b/sale_stock_operating_unit/static/description/index.html index e7ceba476f..e5b83dace8 100644 --- a/sale_stock_operating_unit/static/description/index.html +++ b/sale_stock_operating_unit/static/description/index.html @@ -3,7 +3,7 @@ - + Operating Unit in Sales Stock