From 6e6be10c2d0bad882c32b1df39336290785adae0 Mon Sep 17 00:00:00 2001 From: Andrea Date: Thu, 23 May 2019 15:17:17 +0200 Subject: [PATCH] [9.0][MIG] account_cost_center --- account_cost_center/README.rst | 14 +- account_cost_center/__init__.py | 3 +- account_cost_center/__openerp__.py | 11 +- account_cost_center/models/__init__.py | 3 +- .../models/account_cost_center.py | 7 +- account_cost_center/models/account_invoice.py | 24 ++- .../models/account_invoice_line.py | 13 +- .../models/account_invoice_report.py | 13 +- .../models/account_move_line.py | 4 +- .../security/account_cost_center_security.xml | 13 ++ account_cost_center/tests/__init__.py | 4 + account_cost_center/tests/test_cost_center.py | 63 ++++++++ .../views/account_cost_center.xml | 140 +++++++++--------- account_cost_center/views/account_invoice.xml | 64 ++++---- .../views/account_invoice_report.xml | 26 ++-- account_cost_center/views/account_move.xml | 27 ++-- .../views/account_move_line.xml | 40 +++-- 17 files changed, 271 insertions(+), 198 deletions(-) create mode 100644 account_cost_center/security/account_cost_center_security.xml create mode 100644 account_cost_center/tests/__init__.py create mode 100644 account_cost_center/tests/test_cost_center.py diff --git a/account_cost_center/README.rst b/account_cost_center/README.rst index 2da46954c..77395ffdb 100644 --- a/account_cost_center/README.rst +++ b/account_cost_center/README.rst @@ -1,5 +1,5 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl :alt: License: AGPL-3 =========== @@ -15,12 +15,14 @@ Usage This module is relevant when you are creating sales invoices and using analytic accounting. -Start using cost centers by defining the cost centers. Be aware that Analytic Accounting must be activated on the user for the following menu option. +Start using cost centers by defining the cost centers. Be aware that Analytic Accounting +must be activated on the user for the following menu option. Use the menu in the accounting module: **Configuration > Analytics accounting > Cost centers** -Once defined you can add a cost center to an invoice line. A default cost center for the current invoice can be set in the other info tab. +Once defined you can add a cost center to an invoice line. A default cost center for +the current invoice can be set in the other info tab. This module adds the cost center concept to the reporting module. @@ -31,7 +33,7 @@ Here you can select or unselect the cost center within your analysis. .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot - :target: https://runbot.odoo-community.org/runbot/92/8.0 + :target: https://runbot.odoo-community.org/runbot/92/9.0 Bug Tracker @@ -40,7 +42,7 @@ 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. +help us smash it by providing detailed and welcomed feedback. Credits ======= diff --git a/account_cost_center/__init__.py b/account_cost_center/__init__.py index 218dd5b99..b44d76594 100644 --- a/account_cost_center/__init__.py +++ b/account_cost_center/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import models diff --git a/account_cost_center/__openerp__.py b/account_cost_center/__openerp__.py index 854cdff28..d0975b990 100644 --- a/account_cost_center/__openerp__.py +++ b/account_cost_center/__openerp__.py @@ -1,21 +1,22 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2016-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { 'name': 'Costcenter', 'summary': 'Cost center information for invoice lines', - 'author': 'ONESTEiN BV,Odoo Community Association (OCA)', + 'author': 'Onestein, Odoo Community Association (OCA)', 'license': 'AGPL-3', - 'website': 'http://www.onestein.eu', + 'website': 'https://github.com/OCA/account-financial-tools/', 'category': 'Accounting', - 'version': '8.0.1.0.0', + 'version': '9.0.1.0.0', 'depends': [ 'account', 'base_view_inheritance_extension' ], 'data': [ 'security/ir.model.access.csv', + 'security/account_cost_center_security.xml', 'views/account_cost_center.xml', 'views/account_move.xml', 'views/account_move_line.xml', diff --git a/account_cost_center/models/__init__.py b/account_cost_center/models/__init__.py index de7ebfff4..caabea9a2 100644 --- a/account_cost_center/models/__init__.py +++ b/account_cost_center/models/__init__.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from . import account_move_line from . import account_invoice diff --git a/account_cost_center/models/account_cost_center.py b/account_cost_center/models/account_cost_center.py index 8347f3695..b521cb070 100644 --- a/account_cost_center/models/account_cost_center.py +++ b/account_cost_center/models/account_cost_center.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2015-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from openerp import fields, models @@ -12,8 +12,7 @@ class AccountCostCenter(models.Model): name = fields.Char(string='Title', required=True) code = fields.Char(required=True) company_id = fields.Many2one( - comodel_name='res.company', + 'res.company', string='Company', - required=True, default=lambda self: self.env.user.company_id ) diff --git a/account_cost_center/models/account_invoice.py b/account_cost_center/models/account_invoice.py index b583b0396..c5495a3e7 100644 --- a/account_cost_center/models/account_invoice.py +++ b/account_cost_center/models/account_invoice.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2015-2019 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from openerp import api, fields, models @@ -11,12 +11,26 @@ class AccountInvoice(models.Model): cost_center_id = fields.Many2one( 'account.cost.center', string='Cost Center', - help='Default Cost Center' + readonly=True, + states={'draft': [('readonly', False)]}, + help='Default Cost Center', ) @api.model - def line_get_convert(self, line, part, date): - res = super(AccountInvoice, self).line_get_convert(line, part, date) + def line_get_convert(self, line, part): + res = super(AccountInvoice, self).line_get_convert(line, part) if line.get('cost_center_id'): res['cost_center_id'] = line['cost_center_id'] return res + + @api.model + def invoice_line_move_line_get(self): + res = super(AccountInvoice, self).invoice_line_move_line_get() + + for dict_data in res: + invl_id = dict_data.get('invl_id') + line = self.env['account.invoice.line'].browse(invl_id) + if line.cost_center_id: + dict_data['cost_center_id'] = line.cost_center_id.id + + return res diff --git a/account_cost_center/models/account_invoice_line.py b/account_cost_center/models/account_invoice_line.py index 310cf7bed..620653958 100644 --- a/account_cost_center/models/account_invoice_line.py +++ b/account_cost_center/models/account_invoice_line.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2015-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from openerp import api, fields, models @@ -17,12 +17,5 @@ class AccountInvoiceLine(models.Model): 'account.cost.center', string='Cost Center', index=True, - default=_default_cost_center + default=lambda self: self._default_cost_center(), ) - - @api.model - def move_line_get_item(self, line): - res = super(AccountInvoiceLine, self).move_line_get_item(line) - if line.cost_center_id: - res['cost_center_id'] = line.cost_center_id.id - return res diff --git a/account_cost_center/models/account_invoice_report.py b/account_cost_center/models/account_invoice_report.py index 599205901..01bb08736 100644 --- a/account_cost_center/models/account_invoice_report.py +++ b/account_cost_center/models/account_invoice_report.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2015-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from openerp import fields, models @@ -21,15 +21,12 @@ class AccountInvoiceReport(models.Model): def _select(self): return super(AccountInvoiceReport, self)._select() + \ - ", sub.cost_center_id as cost_center_id, " + \ - "sub.account_analytic_id as account_analytic_id" + ", sub.cost_center_id as cost_center_id" def _sub_select(self): return super(AccountInvoiceReport, self)._sub_select() + \ - ", ail.cost_center_id as cost_center_id, " + \ - "ail.account_analytic_id as account_analytic_id" + ", ail.cost_center_id as cost_center_id" def _group_by(self): return super(AccountInvoiceReport, self)._group_by() + \ - ", ail.cost_center_id, " + \ - "ail.account_analytic_id" + ", ail.cost_center_id" diff --git a/account_cost_center/models/account_move_line.py b/account_cost_center/models/account_move_line.py index cd4c08d58..65298f89d 100644 --- a/account_cost_center/models/account_move_line.py +++ b/account_cost_center/models/account_move_line.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Copyright 2015-2017 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2015-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from openerp import fields, models diff --git a/account_cost_center/security/account_cost_center_security.xml b/account_cost_center/security/account_cost_center_security.xml new file mode 100644 index 000000000..0c3270cb1 --- /dev/null +++ b/account_cost_center/security/account_cost_center_security.xml @@ -0,0 +1,13 @@ + + + + + + Cost center multi company rule + + + ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])] + + + + diff --git a/account_cost_center/tests/__init__.py b/account_cost_center/tests/__init__.py new file mode 100644 index 000000000..1b3d287d3 --- /dev/null +++ b/account_cost_center/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_cost_center diff --git a/account_cost_center/tests/test_cost_center.py b/account_cost_center/tests/test_cost_center.py new file mode 100644 index 000000000..c19e1a0af --- /dev/null +++ b/account_cost_center/tests/test_cost_center.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2017-2018 Onestein () +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openerp.addons.account.tests.account_test_classes\ + import AccountingTestCase + + +class TestAccountCostCenter(AccountingTestCase): + + def test_invoice_costcenter(self): + Account = self.env['account.account'] + CostCenter = self.env['account.cost.center'] + InvLine = self.env['account.invoice.line'] + + acc_rec = self.env.ref('account.data_account_type_receivable') + acc_exp = self.env.ref('account.data_account_type_expenses') + invoice_account = Account.search([ + ('user_type_id', '=', acc_rec.id) + ], limit=1).id + invoice_line_account = Account.search([ + ('user_type_id', '=', acc_exp.id)], + limit=1).id + + invoice = self.env['account.invoice'].create({ + 'partner_id': self.env.ref('base.res_partner_2').id, + 'account_id': invoice_account, + 'type': 'in_invoice', + }) + + line1 = InvLine.create({ + 'product_id': self.env.ref('product.product_product_2').id, + 'quantity': 1.0, + 'price_unit': 100.0, + 'invoice_id': invoice.id, + 'name': 'product that cost 100', + 'account_id': invoice_line_account, + }) + empty_cost_center = CostCenter.browse() + self.assertTrue( + (line1.cost_center_id == empty_cost_center), + "Default cost center per line not set") + + costcenter = CostCenter.create({ + 'name': 'Cost Center Test', + 'code': 'CC1', + 'company_id': self.env.user.company_id.id + }) + invoice.cost_center_id = costcenter + + line2 = InvLine.with_context(cost_center_id=costcenter.id).create({ + 'product_id': self.env.ref('product.product_product_4').id, + 'quantity': 1.0, + 'price_unit': 130.0, + 'invoice_id': invoice.id, + 'name': 'product that cost 130', + 'account_id': invoice_line_account, + }) + self.assertTrue( + (line2.cost_center_id == costcenter), + "Default cost center per line set") + + invoice.signal_workflow('invoice_open') diff --git a/account_cost_center/views/account_cost_center.xml b/account_cost_center/views/account_cost_center.xml index 91419917b..aa12ec1bc 100644 --- a/account_cost_center/views/account_cost_center.xml +++ b/account_cost_center/views/account_cost_center.xml @@ -1,78 +1,78 @@ - - - + + - - - account.cost.center - -
- - -
-
+ + + account.cost.center + + + + +
+
+
+ + + - - - - - - + + - - -
- -
-
+
+ + +
+ +
+
- - account.cost.center - - - - - - - + + account.cost.center + + + + + + + + - - account.cost.center - - - - - - + + account.cost.center + + + + + + - - Cost Centers - ir.actions.act_window - account.cost.center - form - tree,form - - -

- Click to add a new event. -

-

- Cost centers provide an extra analytic dimension -

-
-
+ + Cost Centers + ir.actions.act_window + account.cost.center + form + tree,form + + +

+ Click to add a new cost center. +

+

+ Cost centers provide an extra analytic dimension +

+
+
- - + + -
-
+ diff --git a/account_cost_center/views/account_invoice.xml b/account_cost_center/views/account_invoice.xml index 1ee1b7d32..064cd17eb 100644 --- a/account_cost_center/views/account_invoice.xml +++ b/account_cost_center/views/account_invoice.xml @@ -1,38 +1,36 @@ - - + - - account.invoice - - - - - - - - - - cost_center_id - + + account.invoice + + + + - - - - account.invoice - - - - - - - - - - cost_center_id - + + + + + cost_center_id - + + - - + + account.invoice + + + + + + + + + + cost_center_id + + + + + diff --git a/account_cost_center/views/account_invoice_report.xml b/account_cost_center/views/account_invoice_report.xml index e525d4575..c6e7ccfda 100644 --- a/account_cost_center/views/account_invoice_report.xml +++ b/account_cost_center/views/account_invoice_report.xml @@ -1,17 +1,15 @@ - - + - - account.invoice.report - - - - - - - - + + account.invoice.report + + + + + + + + - - + diff --git a/account_cost_center/views/account_move.xml b/account_cost_center/views/account_move.xml index 81d2cdb6c..861fd0618 100644 --- a/account_cost_center/views/account_move.xml +++ b/account_cost_center/views/account_move.xml @@ -1,19 +1,14 @@ - - + - - account.move - - - - - - - - - - + + account.move + + + + + + + - - + diff --git a/account_cost_center/views/account_move_line.xml b/account_cost_center/views/account_move_line.xml index f476c5b4a..c211c5204 100644 --- a/account_cost_center/views/account_move_line.xml +++ b/account_cost_center/views/account_move_line.xml @@ -1,27 +1,25 @@ - - + - - account.move.line - - - - - + + account.move.line + + + + - + + - - account.move.line - - 1 - - - - + + account.move.line + + 1 + + + - + + - - +