From 3559aae2c242cc3e35728fe37345cf1366784da5 Mon Sep 17 00:00:00 2001 From: Sudhir Arya Date: Tue, 9 Feb 2016 15:06:46 +0530 Subject: [PATCH 01/34] Migrated sale_operating_unit module and its test cases. --- sale_operating_unit/__init__.py | 7 + sale_operating_unit/__openerp__.py | 24 ++++ sale_operating_unit/models/__init__.py | 6 + sale_operating_unit/models/sale.py | 42 ++++++ .../security/sale_security.xml | 30 ++++ sale_operating_unit/tests/__init__.py | 6 + .../tests/test_sale_operating_unit.py | 130 ++++++++++++++++++ sale_operating_unit/views/sale_view.xml | 53 +++++++ 8 files changed, 298 insertions(+) create mode 100644 sale_operating_unit/__init__.py create mode 100644 sale_operating_unit/__openerp__.py create mode 100644 sale_operating_unit/models/__init__.py create mode 100644 sale_operating_unit/models/sale.py create mode 100644 sale_operating_unit/security/sale_security.xml create mode 100644 sale_operating_unit/tests/__init__.py create mode 100644 sale_operating_unit/tests/test_sale_operating_unit.py create mode 100644 sale_operating_unit/views/sale_view.xml diff --git a/sale_operating_unit/__init__.py b/sale_operating_unit/__init__.py new file mode 100644 index 0000000000..55c73fac1c --- /dev/null +++ b/sale_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_operating_unit/__openerp__.py b/sale_operating_unit/__openerp__.py new file mode 100644 index 0000000000..9f631f218a --- /dev/null +++ b/sale_operating_unit/__openerp__.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). +{ + "name": "Operating Unit in Sales", + "version": "8.0.1.0.0", + "summary": "An operating unit (OU) is an organizational entity part of a\ + company", + "author": "Eficent Business and IT Consulting Services S.L., " + "Serpent Consulting Services Pvt. Ltd.," + "Odoo Community Association (OCA)", + "license": "AGPL-3", + "website": "http://www.eficent.com", + "category": "Purchase Management", + "depends": ["sale", "operating_unit"], + "data": [ + "views/sale_view.xml", + "security/sale_security.xml", + ], + 'installable': True, + 'active': False, +} diff --git a/sale_operating_unit/models/__init__.py b/sale_operating_unit/models/__init__.py new file mode 100644 index 0000000000..f70eaa1e7a --- /dev/null +++ b/sale_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_operating_unit/models/sale.py b/sale_operating_unit/models/sale.py new file mode 100644 index 0000000000..2946bc1d20 --- /dev/null +++ b/sale_operating_unit/models/sale.py @@ -0,0 +1,42 @@ +# -*- 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, fields, models +from openerp.tools.translate import _ +from openerp.exceptions import Warning + + +class SaleOrder(models.Model): + + _inherit = 'sale.order' + + operating_unit_id = fields.Many2one('operating.unit', 'Operating Unit', + default=lambda self: + self.env['res.users']. + operating_unit_default_get(self._uid)) + + @api.one + @api.constrains('operating_unit_id', 'company_id') + def _check_company_operating_unit(self): + if self.company_id and self.operating_unit_id and\ + self.company_id != self.operating_unit_id.company_id: + raise Warning(_('Configuration error!\nThe Company in the\ + Sales Order and in the Operating Unit must be the same.')) + + @api.model + def _make_invoice(self, order, lines): + res = super(SaleOrder, self)._make_invoice(order, lines) + invoice = self.env['account.invoice'].browse(res) + invoice.write({'operating_unit_id': order.operating_unit_id.id}) + return res + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + operating_unit_id = fields.Many2one('operating.unit', + related='order_id.operating_unit_id', + string='Operating Unit', + readonly=True) diff --git a/sale_operating_unit/security/sale_security.xml b/sale_operating_unit/security/sale_security.xml new file mode 100644 index 0000000000..21d30e41fd --- /dev/null +++ b/sale_operating_unit/security/sale_security.xml @@ -0,0 +1,30 @@ + + + + + + + ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] + Sales Orders from allowed operating units + + + + + + + + + + ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] + Sales Order lines from allowed operating units + + + + + + + + + diff --git a/sale_operating_unit/tests/__init__.py b/sale_operating_unit/tests/__init__.py new file mode 100644 index 0000000000..dfd8c07cfa --- /dev/null +++ b/sale_operating_unit/tests/__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 test_sale_operating_unit diff --git a/sale_operating_unit/tests/test_sale_operating_unit.py b/sale_operating_unit/tests/test_sale_operating_unit.py new file mode 100644 index 0000000000..fe4d54a66e --- /dev/null +++ b/sale_operating_unit/tests/test_sale_operating_unit.py @@ -0,0 +1,130 @@ +# -*- 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.tests import common + + +class TestSaleOperatingUnit(common.TransactionCase): + + def setUp(self): + super(TestSaleOperatingUnit, self).setUp() + self.res_groups = self.env['res.groups'] + self.partner_model = self.env['res.partner'] + self.res_users_model = self.env['res.users'] + self.sale_model = self.env['sale.order'] + self.sale_order_model = self.env['sale.order.line'] + self.acc_move_model = self.env['account.move'] + self.acc_invoice_model = self.env['account.invoice'] + self.res_company_model = self.env['res.company'] + self.product_model = self.env['product.product'] + self.operating_unit_model = self.env['operating.unit'] + self.company_model = self.env['res.company'] + self.payment_model = self.env['sale.advance.payment.inv'] + # Company + self.company = self.env.ref('base.main_company') + self.grp_sale_user = self.env.ref('base.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') + # B2B Operating Unit + self.b2b = self.env.ref('operating_unit.b2b_operating_unit') + # B2C Operating Unit + self.b2c = self.env.ref('operating_unit.b2c_operating_unit') + # Payment Term + self.pay = self.env.ref('account.account_payment_term_immediate') + # Customer + self.customer = self.env.ref('base.res_partner_2') + # Price list + self.pricelist = self.env.ref('product.list0') + # Partner + self.partner1 = self.env.ref('base.res_partner_1') + # Products + self.product1 = self.env.ref('product.product_product_7') + # 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 Sale Order1 + self.sale1 = self._create_sale_order(self.user1.id, self.customer, + self.product1, self.pricelist, + self.ou1) + # Create Sale Order2 + self.sale2 = self._create_sale_order(self.user2.id, self.customer, + self.product1, self.pricelist, + self.b2c) + + def _create_user(self, login, groups, company, operating_units, + context=None): + """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_order(self, uid, customer, product, pricelist, + operating_unit): + """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, + 'operating_unit_id': operating_unit.id + }) + self.sale_order_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_button_confirm() + payment = self.payment_model.create({ + 'advance_payment_method': 'all' + }) + sale_context = { + 'active_id': sale.id, + 'active_ids': sale.ids, + 'active_model': 'sale.order', + 'open_invoices': True, + } + res = payment.with_context(sale_context).create_invoices() + invoice_id = res['res_id'] + return invoice_id + + 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. + sale = self.sale_model.sudo(self.user2.id).search( + [('id', '=', self.sale1.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 + self._confirm_sale(self.sale1) + # Confirm Sale2 + b2c_invoice_id = self._confirm_sale(self.sale2) + # Checks that invoice has OU b2c + b2c = self.acc_invoice_model.sudo(self.user2.id).search( + [('id', '=', b2c_invoice_id), + ('operating_unit_id', '=', + self.b2c.id)]) + self.assertNotEqual(b2c.ids, [], 'Invoice should have b2c OU') diff --git a/sale_operating_unit/views/sale_view.xml b/sale_operating_unit/views/sale_view.xml new file mode 100644 index 0000000000..6df9ee25e4 --- /dev/null +++ b/sale_operating_unit/views/sale_view.xml @@ -0,0 +1,53 @@ + + + + + + sale.order.tree + sale.order + + + + + + + + + + sale.order.tree + sale.order + + + + + + + + + + sale.order.form + sale.order + + + + + + + + + + sale.order.list.select + sale.order + + + + + + + + + + + + + From d390fb6c9ba53891e4df067f89729ac0449f87e5 Mon Sep 17 00:00:00 2001 From: Sudhir Arya Date: Wed, 10 Feb 2016 17:10:46 +0530 Subject: [PATCH 02/34] Added OU and WH constraints in SO. --- sale_operating_unit/README.rst | 71 +++++++++++++++++++++++++ sale_operating_unit/__init__.py | 1 - sale_operating_unit/__openerp__.py | 8 +-- sale_operating_unit/models/sale.py | 17 ++++-- sale_operating_unit/views/sale_view.xml | 8 +-- 5 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 sale_operating_unit/README.rst diff --git a/sale_operating_unit/README.rst b/sale_operating_unit/README.rst new file mode 100644 index 0000000000..d1500bc54e --- /dev/null +++ b/sale_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_operating_unit/__init__.py b/sale_operating_unit/__init__.py index 55c73fac1c..162c4582ef 100644 --- a/sale_operating_unit/__init__.py +++ b/sale_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_operating_unit/__openerp__.py b/sale_operating_unit/__openerp__.py index 9f631f218a..5c43e3a294 100644 --- a/sale_operating_unit/__openerp__.py +++ b/sale_operating_unit/__openerp__.py @@ -6,15 +6,15 @@ { "name": "Operating Unit in Sales", "version": "8.0.1.0.0", - "summary": "An operating unit (OU) is an organizational entity part of a\ - company", + "summary": "An operating unit (OU) is an organizational entity part of a " + "company", "author": "Eficent Business and IT Consulting Services S.L., " "Serpent Consulting Services Pvt. Ltd.," "Odoo Community Association (OCA)", "license": "AGPL-3", "website": "http://www.eficent.com", - "category": "Purchase Management", - "depends": ["sale", "operating_unit"], + "category": "Sales Management", + "depends": ["sale", "operating_unit", "stock_operating_unit"], "data": [ "views/sale_view.xml", "security/sale_security.xml", diff --git a/sale_operating_unit/models/sale.py b/sale_operating_unit/models/sale.py index 2946bc1d20..fda81e8d83 100644 --- a/sale_operating_unit/models/sale.py +++ b/sale_operating_unit/models/sale.py @@ -4,12 +4,11 @@ # © 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, fields, models -from openerp.tools.translate import _ from openerp.exceptions import Warning +from openerp.tools.translate import _ class SaleOrder(models.Model): - _inherit = 'sale.order' operating_unit_id = fields.Many2one('operating.unit', 'Operating Unit', @@ -25,12 +24,20 @@ def _check_company_operating_unit(self): raise Warning(_('Configuration error!\nThe Company in the\ Sales Order and in the Operating Unit must be the same.')) + @api.one + @api.constrains('operating_unit_id', 'warehouse_id') + def _check_wh_operating_unit(self): + if self.operating_unit_id and\ + self.operating_unit_id != self.warehouse_id.operating_unit_id: + raise Warning(_('Configuration error!\nThe Operating Unit \ + in the Sales Order and in the Warehouse must be the same.')) + @api.model def _make_invoice(self, order, lines): - res = super(SaleOrder, self)._make_invoice(order, lines) - invoice = self.env['account.invoice'].browse(res) + inv_id = super(SaleOrder, self)._make_invoice(order, lines) + invoice = self.env['account.invoice'].browse(inv_id) invoice.write({'operating_unit_id': order.operating_unit_id.id}) - return res + return inv_id class SaleOrderLine(models.Model): diff --git a/sale_operating_unit/views/sale_view.xml b/sale_operating_unit/views/sale_view.xml index 6df9ee25e4..4ae2289087 100644 --- a/sale_operating_unit/views/sale_view.xml +++ b/sale_operating_unit/views/sale_view.xml @@ -5,7 +5,7 @@ sale.order.tree sale.order - + @@ -16,7 +16,7 @@ sale.order.tree sale.order - + @@ -27,7 +27,7 @@ sale.order.form sale.order - + @@ -38,7 +38,7 @@ sale.order.list.select sale.order - + From dd3aec92b09bae6ec480109ba3d8fdc961fcec01 Mon Sep 17 00:00:00 2001 From: aheficent Date: Tue, 23 Aug 2016 16:19:47 +0200 Subject: [PATCH 03/34] migrate code to v9 (wip) --- sale_operating_unit/README.rst | 31 +++---- sale_operating_unit/__init__.py | 7 +- sale_operating_unit/__openerp__.py | 16 ++-- sale_operating_unit/models/__init__.py | 6 +- sale_operating_unit/models/sale.py | 79 ++++++++++------- sale_operating_unit/report/__init__.py | 7 ++ sale_operating_unit/report/sale_report.py | 26 ++++++ .../security/sale_security.xml | 65 ++++++++------ sale_operating_unit/tests/__init__.py | 6 +- .../tests/test_sale_operating_unit.py | 71 +++++++++++---- .../views/sale_report_view.xml | 22 +++++ sale_operating_unit/views/sale_view.xml | 87 ++++++++++--------- 12 files changed, 268 insertions(+), 155 deletions(-) create mode 100644 sale_operating_unit/report/__init__.py create mode 100644 sale_operating_unit/report/sale_report.py create mode 100644 sale_operating_unit/views/sale_report_view.xml diff --git a/sale_operating_unit/README.rst b/sale_operating_unit/README.rst index d1500bc54e..6ee023128a 100644 --- a/sale_operating_unit/README.rst +++ b/sale_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 @@ -16,30 +16,22 @@ 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 + :target: https://runbot.odoo-community.org/runbot/213/9.0 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 ======= @@ -52,20 +44,19 @@ Images Contributors ------------ -* Eficent Business and IT Consulting Services S.L. -* Serpent Consulting Services Pvt. Ltd. +Jordi Ballester Alomar +Aaron Henriquez +Sudhir Arya Maintainer ---------- .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association - :target: https://odoo-community.org + :target: http://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_operating_unit/__init__.py b/sale_operating_unit/__init__.py index 162c4582ef..aba9faabea 100644 --- a/sale_operating_unit/__init__.py +++ b/sale_operating_unit/__init__.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar +# © 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 +from . import report diff --git a/sale_operating_unit/__openerp__.py b/sale_operating_unit/__openerp__.py index 5c43e3a294..ee919352c8 100644 --- a/sale_operating_unit/__openerp__.py +++ b/sale_operating_unit/__openerp__.py @@ -1,24 +1,24 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar +# © 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", - "version": "8.0.1.0.0", + "version": "9.0.1.0.0", "summary": "An operating unit (OU) is an organizational entity part of a " "company", "author": "Eficent Business and IT Consulting Services S.L., " "Serpent Consulting Services Pvt. Ltd.," "Odoo Community Association (OCA)", - "license": "AGPL-3", + "license": "LGPL-3", "website": "http://www.eficent.com", "category": "Sales Management", - "depends": ["sale", "operating_unit", "stock_operating_unit"], + "depends": ["sale", "account_operating_unit", "sales_team_operating_unit"], "data": [ "views/sale_view.xml", + "views/sale_report_view.xml", "security/sale_security.xml", ], - 'installable': True, - 'active': False, + 'installable': True } diff --git a/sale_operating_unit/models/__init__.py b/sale_operating_unit/models/__init__.py index f70eaa1e7a..7098e1ec33 100644 --- a/sale_operating_unit/models/__init__.py +++ b/sale_operating_unit/models/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar +# © 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 sale diff --git a/sale_operating_unit/models/sale.py b/sale_operating_unit/models/sale.py index fda81e8d83..99d086e2ab 100644 --- a/sale_operating_unit/models/sale.py +++ b/sale_operating_unit/models/sale.py @@ -1,49 +1,66 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar +# © 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, fields, models -from openerp.exceptions import Warning -from openerp.tools.translate import _ +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). +from openerp import _, api, fields, models +from openerp.exceptions import ValidationError class SaleOrder(models.Model): _inherit = 'sale.order' - operating_unit_id = fields.Many2one('operating.unit', 'Operating Unit', - default=lambda self: - self.env['res.users']. - operating_unit_default_get(self._uid)) + @api.model + def _default_operating_unit(self): + if self._defaults['team_id'](self): + return self.env['crm.team'].browse(self._defaults['team_id']( + self)).operating_unit_id + else: + return self.env.user.default_operating_unit_id + + operating_unit_id = fields.Many2one( + comodel_name='operating.unit', + string='Operating Unit', + default=_default_operating_unit + ) + + @api.onchange('team_id') + @api.depends('team_id') + def onchange_team_id(self): + self.operating_unit_id = self.team_id.operating_unit_id - @api.one + @api.multi + @api.constrains('team_id', 'operating_unit_id') + def _check_team_operating_unit(self): + for rec in self: + if (rec.team_id and + rec.team_id.operating_unit_id != rec.operating_unit_id): + raise ValidationError(_('Configuration error\n' + 'The Operating Unit of the sales team ' + 'must match with that of the ' + 'quote/sales order')) + + @api.multi @api.constrains('operating_unit_id', 'company_id') def _check_company_operating_unit(self): - if self.company_id and self.operating_unit_id and\ - self.company_id != self.operating_unit_id.company_id: - raise Warning(_('Configuration error!\nThe Company in the\ - Sales Order and in the Operating Unit must be the same.')) - - @api.one - @api.constrains('operating_unit_id', 'warehouse_id') - def _check_wh_operating_unit(self): - if self.operating_unit_id and\ - self.operating_unit_id != self.warehouse_id.operating_unit_id: - raise Warning(_('Configuration error!\nThe Operating Unit \ - in the Sales Order and in the Warehouse must be the same.')) + for rec in self: + if (rec.company_id and rec.operating_unit_id and + rec.company_id != rec.operating_unit_id.company_id): + raise ValidationError(_('Configuration error\nThe Company in' + ' the Sales Order and in the Operating' + ' Unit must be the same.')) - @api.model - def _make_invoice(self, order, lines): - inv_id = super(SaleOrder, self)._make_invoice(order, lines) - invoice = self.env['account.invoice'].browse(inv_id) - invoice.write({'operating_unit_id': order.operating_unit_id.id}) - return inv_id + @api.multi + def _prepare_invoice(self): + self.ensure_one() + invoice_vals = super(SaleOrder, self)._prepare_invoice() + invoice_vals['operating_unit_id'] = self.operating_unit_id.id + return invoice_vals class SaleOrderLine(models.Model): _inherit = 'sale.order.line' - operating_unit_id = fields.Many2one('operating.unit', - related='order_id.operating_unit_id', + operating_unit_id = fields.Many2one(related='order_id.operating_unit_id', string='Operating Unit', readonly=True) diff --git a/sale_operating_unit/report/__init__.py b/sale_operating_unit/report/__init__.py new file mode 100644 index 0000000000..c05079a834 --- /dev/null +++ b/sale_operating_unit/report/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# © 2016 Eficent Business and IT Consulting Services S.L. +# - Jordi Ballester Alomar +# © 2016 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import sale_report diff --git a/sale_operating_unit/report/sale_report.py b/sale_operating_unit/report/sale_report.py new file mode 100644 index 0000000000..ac37257d40 --- /dev/null +++ b/sale_operating_unit/report/sale_report.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright 2016 Eficent Business and IT Consulting Services S.L. +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0). + +from openerp import fields, models + + +class SaleReport(models.Model): + + _inherit = "sale.report" + + operating_unit_id = fields.Many2one('operating.unit', 'Operating Unit') + + def _select(self): + select_str = super(SaleReport, self)._select() + select_str += """ + ,s.operating_unit_id + """ + return select_str + + def _group_by(self): + group_by_str = super(SaleReport, self)._group_by() + group_by_str += """ + ,s.operating_unit_id + """ + return group_by_str diff --git a/sale_operating_unit/security/sale_security.xml b/sale_operating_unit/security/sale_security.xml index 21d30e41fd..7ba69f102e 100644 --- a/sale_operating_unit/security/sale_security.xml +++ b/sale_operating_unit/security/sale_security.xml @@ -1,30 +1,43 @@ - - + + - - - ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] - Sales Orders from allowed operating units - - - - - - + + + ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] + Sales Orders from allowed operating units + + + + + + - - - ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] - Sales Order lines from allowed operating units - - - - - - + + + ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] + Sales Order lines from allowed operating units + + + + + + - - + + + ['|',('operating_unit_id','=',False),('operating_unit_id','in',[g.id for g in user.operating_unit_ids])] + Sales Report from allowed operating units + + + + + + + + diff --git a/sale_operating_unit/tests/__init__.py b/sale_operating_unit/tests/__init__.py index dfd8c07cfa..e6af403af8 100644 --- a/sale_operating_unit/tests/__init__.py +++ b/sale_operating_unit/tests/__init__.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# © 2015 Eficent Business and IT Consulting Services S.L. - -# Jordi Ballester Alomar +# © 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_operating_unit diff --git a/sale_operating_unit/tests/test_sale_operating_unit.py b/sale_operating_unit/tests/test_sale_operating_unit.py index fe4d54a66e..391347929b 100644 --- a/sale_operating_unit/tests/test_sale_operating_unit.py +++ b/sale_operating_unit/tests/test_sale_operating_unit.py @@ -3,7 +3,6 @@ # 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.tests import common @@ -15,7 +14,8 @@ def setUp(self): self.partner_model = self.env['res.partner'] self.res_users_model = self.env['res.users'] self.sale_model = self.env['sale.order'] - self.sale_order_model = self.env['sale.order.line'] + self.sale_line_model = self.env['sale.order.line'] + self.sale_team_model = self.registry('crm.team') self.acc_move_model = self.env['account.move'] self.acc_invoice_model = self.env['account.invoice'] self.res_company_model = self.env['res.company'] @@ -42,7 +42,9 @@ def setUp(self): # Partner self.partner1 = self.env.ref('base.res_partner_1') # Products - self.product1 = self.env.ref('product.product_product_7') + 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], @@ -51,17 +53,23 @@ def setUp(self): 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) + # Create Sale Order1 self.sale1 = self._create_sale_order(self.user1.id, self.customer, self.product1, self.pricelist, - self.ou1) + self.sale_team_ou1) # Create Sale Order2 self.sale2 = self._create_sale_order(self.user2.id, self.customer, self.product1, self.pricelist, - self.b2c) + self.sale_team_b2c) - def _create_user(self, login, groups, company, operating_units, - context=None): + 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({ @@ -76,17 +84,27 @@ def _create_user(self, login, groups, company, operating_units, }) return user - def _create_sale_order(self, uid, customer, product, pricelist, - operating_unit): + def _create_sale_team(self, uid, operating_unit): + """Create a sale team.""" + context = {'mail_create_nosubscribe': True} + team_id = self.sale_team_model.create(self.cr, uid, { + 'name': operating_unit.name, + 'operating_unit_id': operating_unit.id + }, context=context) + return self.sale_team_model.browse(self.cr, uid, team_id, + context=context) + + def _create_sale_order(self, uid, customer, product, pricelist, team): """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, - 'operating_unit_id': operating_unit.id + 'team_id': team.id, + 'operating_unit_id': team.operating_unit_id.id }) - self.sale_order_model.sudo(uid).create({ + self.sale_line_model.sudo(uid).create({ 'order_id': sale.id, 'product_id': product.id, 'name': 'Sale Order Line' @@ -94,7 +112,7 @@ def _create_sale_order(self, uid, customer, product, pricelist, return sale def _confirm_sale(self, sale): - sale.action_button_confirm() + sale.action_confirm() payment = self.payment_model.create({ 'advance_payment_method': 'all' }) @@ -113,9 +131,8 @@ def test_security(self): # User 2 is only assigned to Operating Unit B2C, and cannot # Access Sales order from Main Operating Unit. sale = self.sale_model.sudo(self.user2.id).search( - [('id', '=', self.sale1.id), - ('operating_unit_id', '=', - self.ou1.id)]) + [('id', '=', self.sale1.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 @@ -124,7 +141,25 @@ def test_security(self): b2c_invoice_id = self._confirm_sale(self.sale2) # Checks that invoice has OU b2c b2c = self.acc_invoice_model.sudo(self.user2.id).search( - [('id', '=', b2c_invoice_id), - ('operating_unit_id', '=', - self.b2c.id)]) + [('id', '=', b2c_invoice_id), + ('operating_unit_id', '=', self.b2c.id)]) self.assertNotEqual(b2c.ids, [], 'Invoice should have b2c OU') + + def test_security_2(self): + """Test Sale Operating Unit""" + # User 2 is only assigned to Operating Unit B2C, and cannot + # Access Sales order from Main Operating Unit. + sale = self.sale_model.sudo(self.user2.id).search( + [('id', '=', self.sale1.id), + ('operating_unit_id', '=', + self.ou1.id)]) + self.assertEqual(sale.ids, [], 'User 2 should not have access to ' + 'OU %s' % self.ou1.name) + + sale = self.sale_model.sudo(self.user2.id).search( + [('id', '=', self.sale2.id), + ('operating_unit_id', '=', + self.b2c.id)]) + + self.assertEqual(len(sale.ids), 1, 'User 1 should have access to ' + 'OU %s' % self.b2c.name) diff --git a/sale_operating_unit/views/sale_report_view.xml b/sale_operating_unit/views/sale_report_view.xml new file mode 100644 index 0000000000..b5220acdd5 --- /dev/null +++ b/sale_operating_unit/views/sale_report_view.xml @@ -0,0 +1,22 @@ + + + + + sale.report.search + sale.report + + + + + + + + + + + + diff --git a/sale_operating_unit/views/sale_view.xml b/sale_operating_unit/views/sale_view.xml index 4ae2289087..d42143a350 100644 --- a/sale_operating_unit/views/sale_view.xml +++ b/sale_operating_unit/views/sale_view.xml @@ -1,53 +1,54 @@ - - + + - - sale.order.tree - sale.order - - - - - + + sale.order.tree + sale.order + + + + - + + - - sale.order.tree - sale.order - - - - - + + sale.order.tree + sale.order + + + + - + + - - sale.order.form - sale.order - - - - - + + sale.order.form + sale.order + + + + - + + - - sale.order.list.select - sale.order - - - - - - - - + + sale.order.list.select + sale.order + + + + + + + - + + - - + From 704248e5d3c9b5905cfe7de4551982af843805fe Mon Sep 17 00:00:00 2001 From: ahenriquez Date: Tue, 31 Jan 2017 12:27:40 +0100 Subject: [PATCH 04/34] [MIG] sale_operating_unit: Migrated to 10.0 --- sale_operating_unit/README.rst | 20 ++++++---------- sale_operating_unit/__init__.py | 4 ++-- .../{__openerp__.py => __manifest__.py} | 8 +++---- sale_operating_unit/models/__init__.py | 5 ++-- sale_operating_unit/models/crm_team.py | 23 ++++++++++++++++++ sale_operating_unit/models/sale.py | 24 ++++++++++++------- sale_operating_unit/report/sale_report.py | 2 +- .../security/sale_security.xml | 2 +- sale_operating_unit/tests/__init__.py | 4 ++-- .../tests/test_sale_operating_unit.py | 23 +++++++++--------- sale_operating_unit/views/sale_view.xml | 2 +- 11 files changed, 70 insertions(+), 47 deletions(-) rename sale_operating_unit/{__openerp__.py => __manifest__.py} (76%) create mode 100644 sale_operating_unit/models/crm_team.py diff --git a/sale_operating_unit/README.rst b/sale_operating_unit/README.rst index 6ee023128a..8d75daa49b 100644 --- a/sale_operating_unit/README.rst +++ b/sale_operating_unit/README.rst @@ -11,18 +11,9 @@ 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. - - -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/9.0 + :target: https://runbot.odoo-community.org/runbot/213/10.0 Bug Tracker =========== @@ -44,9 +35,12 @@ Images Contributors ------------ -Jordi Ballester Alomar -Aaron Henriquez -Sudhir Arya +* Jordi Ballester Alomar +* Aaron Henriquez +* Lois Rilo +* Miquel Raich +* Sudhir Arya +* Darshan Patel Maintainer ---------- diff --git a/sale_operating_unit/__init__.py b/sale_operating_unit/__init__.py index aba9faabea..dcf1db9320 100644 --- a/sale_operating_unit/__init__.py +++ b/sale_operating_unit/__init__.py @@ -1,7 +1,7 @@ # -*- 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 from . import report diff --git a/sale_operating_unit/__openerp__.py b/sale_operating_unit/__manifest__.py similarity index 76% rename from sale_operating_unit/__openerp__.py rename to sale_operating_unit/__manifest__.py index ee919352c8..4e0505613a 100644 --- a/sale_operating_unit/__openerp__.py +++ b/sale_operating_unit/__manifest__.py @@ -1,14 +1,14 @@ # -*- 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", - "version": "9.0.1.0.0", + "version": "10.0.1.0.0", "summary": "An operating unit (OU) is an organizational entity part of a " "company", - "author": "Eficent Business and IT Consulting Services S.L., " + "author": "Eficent, " "Serpent Consulting Services Pvt. Ltd.," "Odoo Community Association (OCA)", "license": "LGPL-3", diff --git a/sale_operating_unit/models/__init__.py b/sale_operating_unit/models/__init__.py index 7098e1ec33..1ad3a4a9c3 100644 --- a/sale_operating_unit/models/__init__.py +++ b/sale_operating_unit/models/__init__.py @@ -1,6 +1,7 @@ # -*- 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 sale +from . import crm_team diff --git a/sale_operating_unit/models/crm_team.py b/sale_operating_unit/models/crm_team.py new file mode 100644 index 0000000000..0b4062cb14 --- /dev/null +++ b/sale_operating_unit/models/crm_team.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 CrmTeam(models.Model): + _inherit = 'crm.team' + + @api.multi + @api.constrains('operating_unit_id') + def _check_sales_order_operating_unit(self): + for rec in self: + orders = self.env['sale.order'].search( + [('team_id', '=', rec.id), ('operating_unit_id', '!=', + rec.operating_unit_id.id)]) + if orders: + raise ValidationError(_('Sales orders already exist ' + 'referencing this team in other ' + 'operating units.')) diff --git a/sale_operating_unit/models/sale.py b/sale_operating_unit/models/sale.py index 99d086e2ab..98fe3fe871 100644 --- a/sale_operating_unit/models/sale.py +++ b/sale_operating_unit/models/sale.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 import _, api, fields, models -from openerp.exceptions import ValidationError +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError class SaleOrder(models.Model): @@ -12,9 +12,9 @@ class SaleOrder(models.Model): @api.model def _default_operating_unit(self): - if self._defaults['team_id'](self): - return self.env['crm.team'].browse(self._defaults['team_id']( - self)).operating_unit_id + team = self.env['crm.team']._get_default_team_id() + if team.operating_unit_id: + return team.operating_unit_id else: return self.env.user.default_operating_unit_id @@ -25,9 +25,15 @@ def _default_operating_unit(self): ) @api.onchange('team_id') - @api.depends('team_id') def onchange_team_id(self): - self.operating_unit_id = self.team_id.operating_unit_id + if self.team_id: + self.operating_unit_id = self.team_id.operating_unit_id + + @api.onchange('operating_unit_id') + def onchange_operating_unit_id(self): + if self.team_id and self.team_id.operating_unit_id != \ + self.operating_unit_id: + self.team_id = False @api.multi @api.constrains('team_id', 'operating_unit_id') diff --git a/sale_operating_unit/report/sale_report.py b/sale_operating_unit/report/sale_report.py index ac37257d40..d7e9975bbb 100644 --- a/sale_operating_unit/report/sale_report.py +++ b/sale_operating_unit/report/sale_report.py @@ -2,7 +2,7 @@ # Copyright 2016 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0). -from openerp import fields, models +from odoo import fields, models class SaleReport(models.Model): diff --git a/sale_operating_unit/security/sale_security.xml b/sale_operating_unit/security/sale_security.xml index 7ba69f102e..96d059704f 100644 --- a/sale_operating_unit/security/sale_security.xml +++ b/sale_operating_unit/security/sale_security.xml @@ -1,5 +1,5 @@ - diff --git a/sale_operating_unit/tests/__init__.py b/sale_operating_unit/tests/__init__.py index e6af403af8..e3f02fec13 100644 --- a/sale_operating_unit/tests/__init__.py +++ b/sale_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_operating_unit diff --git a/sale_operating_unit/tests/test_sale_operating_unit.py b/sale_operating_unit/tests/test_sale_operating_unit.py index 391347929b..cf175cfde8 100644 --- a/sale_operating_unit/tests/test_sale_operating_unit.py +++ b/sale_operating_unit/tests/test_sale_operating_unit.py @@ -1,9 +1,9 @@ # -*- 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 AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from openerp.tests import common +from odoo.tests import common class TestSaleOperatingUnit(common.TransactionCase): @@ -15,7 +15,7 @@ def setUp(self): self.res_users_model = self.env['res.users'] self.sale_model = self.env['sale.order'] self.sale_line_model = self.env['sale.order.line'] - self.sale_team_model = self.registry('crm.team') + self.sale_team_model = self.env['crm.team'] self.acc_move_model = self.env['account.move'] self.acc_invoice_model = self.env['account.invoice'] self.res_company_model = self.env['res.company'] @@ -25,7 +25,7 @@ def setUp(self): self.payment_model = self.env['sale.advance.payment.inv'] # Company self.company = self.env.ref('base.main_company') - self.grp_sale_user = self.env.ref('base.group_sale_manager') + 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') @@ -86,13 +86,12 @@ def _create_user(self, login, groups, company, operating_units): def _create_sale_team(self, uid, operating_unit): """Create a sale team.""" - context = {'mail_create_nosubscribe': True} - team_id = self.sale_team_model.create(self.cr, uid, { - 'name': operating_unit.name, - 'operating_unit_id': operating_unit.id - }, context=context) - return self.sale_team_model.browse(self.cr, uid, team_id, - context=context) + 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): """Create a sale order.""" diff --git a/sale_operating_unit/views/sale_view.xml b/sale_operating_unit/views/sale_view.xml index d42143a350..5340c6479d 100644 --- a/sale_operating_unit/views/sale_view.xml +++ b/sale_operating_unit/views/sale_view.xml @@ -1,5 +1,5 @@ - From d669c15294de53988c4de03c5e928e7f8952a753 Mon Sep 17 00:00:00 2001 From: Darshan Patel Date: Tue, 4 Jul 2017 14:48:56 +0530 Subject: [PATCH 05/34] [FIX] readonly on OU --- sale_operating_unit/__manifest__.py | 2 +- sale_operating_unit/models/sale.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/sale_operating_unit/__manifest__.py b/sale_operating_unit/__manifest__.py index 4e0505613a..3dbe06168b 100644 --- a/sale_operating_unit/__manifest__.py +++ b/sale_operating_unit/__manifest__.py @@ -5,7 +5,7 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). { "name": "Operating Unit in Sales", - "version": "10.0.1.0.0", + "version": "10.0.1.1.0", "summary": "An operating unit (OU) is an organizational entity part of a " "company", "author": "Eficent, " diff --git a/sale_operating_unit/models/sale.py b/sale_operating_unit/models/sale.py index 98fe3fe871..a5b29573c6 100644 --- a/sale_operating_unit/models/sale.py +++ b/sale_operating_unit/models/sale.py @@ -21,7 +21,10 @@ def _default_operating_unit(self): operating_unit_id = fields.Many2one( comodel_name='operating.unit', string='Operating Unit', - default=_default_operating_unit + default=_default_operating_unit, + readonly=True, + states={'draft': [('readonly', False)], + 'sent': [('readonly', False)]} ) @api.onchange('team_id') From 3b87cabdcf28962da7d48c5a51b3ed95fe29238d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Be=C3=B1at=20Jimenez?= Date: Thu, 31 Jan 2019 13:38:36 +0100 Subject: [PATCH 06/34] [MIG] sale_operating_unit: Migration to v11 --- sale_operating_unit/README.rst | 78 +++- sale_operating_unit/__init__.py | 4 - sale_operating_unit/__manifest__.py | 11 +- sale_operating_unit/models/__init__.py | 4 - sale_operating_unit/models/crm_team.py | 5 +- sale_operating_unit/models/sale.py | 17 +- sale_operating_unit/readme/CONTRIBUTORS.rst | 6 + sale_operating_unit/readme/DESCRIPTION.rst | 4 + sale_operating_unit/readme/USAGE.rst | 4 + sale_operating_unit/report/__init__.py | 4 - sale_operating_unit/report/sale_report.py | 3 +- .../security/sale_security.xml | 2 +- .../static/description/index.html | 437 ++++++++++++++++++ sale_operating_unit/tests/__init__.py | 4 - .../tests/test_sale_operating_unit.py | 5 +- .../views/sale_report_view.xml | 12 +- sale_operating_unit/views/sale_view.xml | 21 +- 17 files changed, 547 insertions(+), 74 deletions(-) create mode 100644 sale_operating_unit/readme/CONTRIBUTORS.rst create mode 100644 sale_operating_unit/readme/DESCRIPTION.rst create mode 100644 sale_operating_unit/readme/USAGE.rst create mode 100644 sale_operating_unit/static/description/index.html diff --git a/sale_operating_unit/README.rst b/sale_operating_unit/README.rst index 8d75daa49b..968a3581b9 100644 --- a/sale_operating_unit/README.rst +++ b/sale_operating_unit/README.rst @@ -1,39 +1,69 @@ -.. 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 -=============================== +======================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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/11.0/sale_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-11-0/operating-unit-11-0-sale_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/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| 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. -.. 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 +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Follow these steps: + +#. Create a Sale Order. +#. The Operating Unit of the Sale Team is assigned to the Sale Order. 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 ------------- +~~~~~~~~~~~~ * Jordi Ballester Alomar * Aaron Henriquez @@ -42,15 +72,19 @@ Contributors * Sudhir Arya * Darshan Patel -Maintainer ----------- +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. .. image:: https://odoo-community.org/logo.png :alt: Odoo Community Association - :target: http://odoo-community.org - -This module is maintained by the OCA. + :target: https://odoo-community.org 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_operating_unit/__init__.py b/sale_operating_unit/__init__.py index dcf1db9320..8668eed3d1 100644 --- a/sale_operating_unit/__init__.py +++ b/sale_operating_unit/__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 models from . import report diff --git a/sale_operating_unit/__manifest__.py b/sale_operating_unit/__manifest__.py index 3dbe06168b..b273e4b532 100644 --- a/sale_operating_unit/__manifest__.py +++ b/sale_operating_unit/__manifest__.py @@ -1,24 +1,23 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. +# © 2019 Eficent Business and IT Consulting Services S.L. # - Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2019 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", - "version": "10.0.1.1.0", + "version": "11.0.1.1.0", "summary": "An operating unit (OU) is an organizational entity part of a " "company", "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", "account_operating_unit", "sales_team_operating_unit"], "data": [ + "security/sale_security.xml", "views/sale_view.xml", "views/sale_report_view.xml", - "security/sale_security.xml", ], 'installable': True } diff --git a/sale_operating_unit/models/__init__.py b/sale_operating_unit/models/__init__.py index 1ad3a4a9c3..c2e6859443 100644 --- a/sale_operating_unit/models/__init__.py +++ b/sale_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 from . import crm_team diff --git a/sale_operating_unit/models/crm_team.py b/sale_operating_unit/models/crm_team.py index 0b4062cb14..f08012a2d7 100644 --- a/sale_operating_unit/models/crm_team.py +++ b/sale_operating_unit/models/crm_team.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. +# © 2019 Eficent Business and IT Consulting Services S.L. # - Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2019 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_operating_unit/models/sale.py b/sale_operating_unit/models/sale.py index a5b29573c6..fde652f43b 100644 --- a/sale_operating_unit/models/sale.py +++ b/sale_operating_unit/models/sale.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. +# © 2019 Eficent Business and IT Consulting Services S.L. # - Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2019 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 @@ -15,8 +14,7 @@ def _default_operating_unit(self): team = self.env['crm.team']._get_default_team_id() if team.operating_unit_id: return team.operating_unit_id - else: - return self.env.user.default_operating_unit_id + return self.env.user.default_operating_unit_id operating_unit_id = fields.Many2one( comodel_name='operating.unit', @@ -44,10 +42,9 @@ def _check_team_operating_unit(self): for rec in self: if (rec.team_id and rec.team_id.operating_unit_id != rec.operating_unit_id): - raise ValidationError(_('Configuration error\n' - 'The Operating Unit of the sales team ' - 'must match with that of the ' - 'quote/sales order')) + raise ValidationError(_('Configuration error. The Operating ' + 'Unit of the sales team must match ' + 'with that of the quote/sales order')) @api.multi @api.constrains('operating_unit_id', 'company_id') @@ -55,7 +52,7 @@ def _check_company_operating_unit(self): for rec in self: if (rec.company_id and rec.operating_unit_id and rec.company_id != rec.operating_unit_id.company_id): - raise ValidationError(_('Configuration error\nThe Company in' + raise ValidationError(_('Configuration error. The Company in' ' the Sales Order and in the Operating' ' Unit must be the same.')) diff --git a/sale_operating_unit/readme/CONTRIBUTORS.rst b/sale_operating_unit/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..c3b152f8bb --- /dev/null +++ b/sale_operating_unit/readme/CONTRIBUTORS.rst @@ -0,0 +1,6 @@ +* Jordi Ballester Alomar +* Aaron Henriquez +* Lois Rilo +* Miquel Raich +* Sudhir Arya +* Darshan Patel diff --git a/sale_operating_unit/readme/DESCRIPTION.rst b/sale_operating_unit/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..2974ea356e --- /dev/null +++ b/sale_operating_unit/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +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. diff --git a/sale_operating_unit/readme/USAGE.rst b/sale_operating_unit/readme/USAGE.rst new file mode 100644 index 0000000000..d9002f8574 --- /dev/null +++ b/sale_operating_unit/readme/USAGE.rst @@ -0,0 +1,4 @@ +Follow these steps: + +#. Create a Sale Order. +#. The Operating Unit of the Sale Team is assigned to the Sale Order. diff --git a/sale_operating_unit/report/__init__.py b/sale_operating_unit/report/__init__.py index c05079a834..fca264f877 100644 --- a/sale_operating_unit/report/__init__.py +++ b/sale_operating_unit/report/__init__.py @@ -1,7 +1,3 @@ -# -*- coding: utf-8 -*- -# © 2016 Eficent Business and IT Consulting Services S.L. -# - Jordi Ballester Alomar -# © 2016 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from . import sale_report diff --git a/sale_operating_unit/report/sale_report.py b/sale_operating_unit/report/sale_report.py index d7e9975bbb..5c33e389d7 100644 --- a/sale_operating_unit/report/sale_report.py +++ b/sale_operating_unit/report/sale_report.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -# Copyright 2016 Eficent Business and IT Consulting Services S.L. +# Copyright 2019 Eficent Business and IT Consulting Services S.L. # License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl-3.0). from odoo import fields, models diff --git a/sale_operating_unit/security/sale_security.xml b/sale_operating_unit/security/sale_security.xml index 96d059704f..6a8c5bc8af 100644 --- a/sale_operating_unit/security/sale_security.xml +++ b/sale_operating_unit/security/sale_security.xml @@ -1,5 +1,5 @@ - diff --git a/sale_operating_unit/static/description/index.html b/sale_operating_unit/static/description/index.html new file mode 100644 index 0000000000..d2d46b3090 --- /dev/null +++ b/sale_operating_unit/static/description/index.html @@ -0,0 +1,437 @@ + + + + + + +Operating Unit in Sales + + + +
+

Operating Unit in Sales

+ + +

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

+

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.

+

Table of contents

+ +
+

Usage

+

Follow these steps:

+
    +
  1. Create a Sale Order.
  2. +
  3. The Operating Unit of the Sale Team is assigned to the Sale Order.
  4. +
+
+
+

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_operating_unit/tests/__init__.py b/sale_operating_unit/tests/__init__.py index e3f02fec13..a9528c200c 100644 --- a/sale_operating_unit/tests/__init__.py +++ b/sale_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_operating_unit diff --git a/sale_operating_unit/tests/test_sale_operating_unit.py b/sale_operating_unit/tests/test_sale_operating_unit.py index cf175cfde8..65580f591f 100644 --- a/sale_operating_unit/tests/test_sale_operating_unit.py +++ b/sale_operating_unit/tests/test_sale_operating_unit.py @@ -1,7 +1,6 @@ -# -*- coding: utf-8 -*- -# © 2015-17 Eficent Business and IT Consulting Services S.L. - +# © 2019 Eficent Business and IT Consulting Services S.L. - # Jordi Ballester Alomar -# © 2015-17 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya +# © 2019 Serpent Consulting Services Pvt. Ltd. - Sudhir Arya # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo.tests import common diff --git a/sale_operating_unit/views/sale_report_view.xml b/sale_operating_unit/views/sale_report_view.xml index b5220acdd5..827b5973bb 100644 --- a/sale_operating_unit/views/sale_report_view.xml +++ b/sale_operating_unit/views/sale_report_view.xml @@ -1,6 +1,8 @@ - + sale.report.search sale.report @@ -8,14 +10,16 @@ ref="sale.view_order_product_search"/> - + - + - +
diff --git a/sale_operating_unit/views/sale_view.xml b/sale_operating_unit/views/sale_view.xml index 5340c6479d..efa978987f 100644 --- a/sale_operating_unit/views/sale_view.xml +++ b/sale_operating_unit/views/sale_view.xml @@ -1,5 +1,5 @@ - @@ -10,7 +10,9 @@ - +
@@ -21,7 +23,9 @@ - +
@@ -32,7 +36,9 @@ - +
@@ -42,9 +48,10 @@ sale.order - - - + + + From b52bc25dcb037265a4030fec31166c685adb9ddc Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 21 May 2019 09:22:04 +0000 Subject: [PATCH 07/34] [ADD] icon.png --- sale_operating_unit/static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sale_operating_unit/static/description/icon.png diff --git a/sale_operating_unit/static/description/icon.png b/sale_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 From 8587b75c4e4d08a007ed534a44124356505a7ba8 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:23:40 +0000 Subject: [PATCH 08/34] [UPD] README.rst --- sale_operating_unit/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sale_operating_unit/static/description/index.html b/sale_operating_unit/static/description/index.html index d2d46b3090..d81207afdd 100644 --- a/sale_operating_unit/static/description/index.html +++ b/sale_operating_unit/static/description/index.html @@ -3,7 +3,7 @@ - + Operating Unit in Sales