From 221749bf805ef91be672c7b213283f1d7a0a13bf Mon Sep 17 00:00:00 2001 From: Rudy Valentin Date: Wed, 6 Jun 2018 14:39:33 +0200 Subject: [PATCH] [rva/eezeeit-1] Migration of account_tax_code and account_tax_constraints --- account_tax_code/README.rst | 54 ++++++++++++++++++ account_tax_code/__init__.py | 2 + account_tax_code/__manifest__.py | 26 +++++++++ account_tax_code/models/__init__.py | 4 ++ .../models/account_invoice_tax.py | 12 ++++ account_tax_code/models/account_tax.py | 16 ++++++ .../models/account_tax_template.py | 11 ++++ account_tax_code/static/description/icon.png | Bin 0 -> 9455 bytes account_tax_code/views/account_invoice.xml | 26 +++++++++ .../views/account_invoice_tax.xml | 16 ++++++ account_tax_code/views/account_tax.xml | 37 ++++++++++++ .../views/account_tax_template.xml | 37 ++++++++++++ account_tax_constraints/README.rst | 10 ++++ account_tax_constraints/__init__.py | 2 + account_tax_constraints/__manifest__.py | 16 ++++++ account_tax_constraints/models/__init__.py | 2 + account_tax_constraints/models/account_tax.py | 28 +++++++++ .../static/description/icon.png | Bin 0 -> 17495 bytes 18 files changed, 299 insertions(+) create mode 100644 account_tax_code/README.rst create mode 100644 account_tax_code/__init__.py create mode 100644 account_tax_code/__manifest__.py create mode 100644 account_tax_code/models/__init__.py create mode 100644 account_tax_code/models/account_invoice_tax.py create mode 100644 account_tax_code/models/account_tax.py create mode 100644 account_tax_code/models/account_tax_template.py create mode 100644 account_tax_code/static/description/icon.png create mode 100644 account_tax_code/views/account_invoice.xml create mode 100644 account_tax_code/views/account_invoice_tax.xml create mode 100644 account_tax_code/views/account_tax.xml create mode 100644 account_tax_code/views/account_tax_template.xml create mode 100644 account_tax_constraints/README.rst create mode 100644 account_tax_constraints/__init__.py create mode 100644 account_tax_constraints/__manifest__.py create mode 100644 account_tax_constraints/models/__init__.py create mode 100644 account_tax_constraints/models/account_tax.py create mode 100644 account_tax_constraints/static/description/icon.png diff --git a/account_tax_code/README.rst b/account_tax_code/README.rst new file mode 100644 index 00000000..575419a3 --- /dev/null +++ b/account_tax_code/README.rst @@ -0,0 +1,54 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +================ +account tax code +================ + +This module adds a 'code' field to taxes in order to facilitate e.g. +the tax object lookup, the synchronisation with tax templates or +the construction of tax reports. + +Installation +============ + +There is no specific installation procedure for this module. + +Configuration and 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/92/10.0 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smash it by providing detailed and welcomed feedback. + +Credits +======= + +Contributors +------------ + +* Luc De Meyer + +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. diff --git a/account_tax_code/__init__.py b/account_tax_code/__init__.py new file mode 100644 index 00000000..a0fdc10f --- /dev/null +++ b/account_tax_code/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/account_tax_code/__manifest__.py b/account_tax_code/__manifest__.py new file mode 100644 index 00000000..0dd87a95 --- /dev/null +++ b/account_tax_code/__manifest__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Copyright 2009-2018 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'account tax code', + 'version': '11.0.1.0.0', + 'category': 'Accounting & Finance', + 'summary': """ + Add 'code' field to taxes + """, + 'author': 'Noviat,' + 'Odoo Community Association (OCA)', + 'website': 'https://github.com/OCA/account-financial-tools', + 'depends': [ + 'account', + ], + 'data': [ + 'views/account_invoice.xml', + 'views/account_invoice_tax.xml', + 'views/account_tax.xml', + 'views/account_tax_template.xml', + ], + 'installable': True, + 'license': 'AGPL-3', +} diff --git a/account_tax_code/models/__init__.py b/account_tax_code/models/__init__.py new file mode 100644 index 00000000..327eb8a7 --- /dev/null +++ b/account_tax_code/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +from . import account_invoice_tax +from . import account_tax +from . import account_tax_template diff --git a/account_tax_code/models/account_invoice_tax.py b/account_tax_code/models/account_invoice_tax.py new file mode 100644 index 00000000..5e293913 --- /dev/null +++ b/account_tax_code/models/account_invoice_tax.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright 2009-2018 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountInvoiceTax(models.Model): + _inherit = 'account.invoice.tax' + + tax_code = fields.Char( + related='tax_id.code', readonly=True) diff --git a/account_tax_code/models/account_tax.py b/account_tax_code/models/account_tax.py new file mode 100644 index 00000000..76cefabd --- /dev/null +++ b/account_tax_code/models/account_tax.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2009-2018 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountTax(models.Model): + _inherit = 'account.tax' + + code = fields.Char() + + _sql_constraints = [ + ('code_company_uniq', 'unique (code,company_id)', + 'The code of the Tax must be unique per company !') + ] diff --git a/account_tax_code/models/account_tax_template.py b/account_tax_code/models/account_tax_template.py new file mode 100644 index 00000000..15580907 --- /dev/null +++ b/account_tax_code/models/account_tax_template.py @@ -0,0 +1,11 @@ +# -*- coding: utf-8 -*- +# Copyright 2009-2018 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountTaxTemplate(models.Model): + _inherit = 'account.tax.template' + + code = fields.Char() diff --git a/account_tax_code/static/description/icon.png b/account_tax_code/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/account_tax_code/views/account_invoice.xml b/account_tax_code/views/account_invoice.xml new file mode 100644 index 00000000..76acfda0 --- /dev/null +++ b/account_tax_code/views/account_invoice.xml @@ -0,0 +1,26 @@ + + + + + account.invoice.supplier.form.inherit + account.invoice + + + + + + + + + + account.invoice.form.inherit + account.invoice + + + + + + + + + diff --git a/account_tax_code/views/account_invoice_tax.xml b/account_tax_code/views/account_invoice_tax.xml new file mode 100644 index 00000000..f1f6cc2d --- /dev/null +++ b/account_tax_code/views/account_invoice_tax.xml @@ -0,0 +1,16 @@ + + + + + account.invoice.tax.form.inherit + account.invoice.tax + + + + + + + + + + diff --git a/account_tax_code/views/account_tax.xml b/account_tax_code/views/account_tax.xml new file mode 100644 index 00000000..501a2127 --- /dev/null +++ b/account_tax_code/views/account_tax.xml @@ -0,0 +1,37 @@ + + + + + account.tax.search + account.tax + + + + ['|', '|', ('name', 'ilike', self), ('description', 'ilike', self), ('code', 'ilike', self)] + + + + + + account.tax.tree + account.tax + + + + + + + + + + account.tax.form + account.tax + + + + + + + + + diff --git a/account_tax_code/views/account_tax_template.xml b/account_tax_code/views/account_tax_template.xml new file mode 100644 index 00000000..9e2f2667 --- /dev/null +++ b/account_tax_code/views/account_tax_template.xml @@ -0,0 +1,37 @@ + + + + + account.tax.template.search + account.tax.template + + + + ['|', ('name','ilike',self), ('description','ilike',self), ('code', 'ilike', self')] + + + + + + account.tax.template.tree + account.tax.template + + + + + + + + + + account.tax.template.form + account.tax.template + + + + + + + + + diff --git a/account_tax_constraints/README.rst b/account_tax_constraints/README.rst new file mode 100644 index 00000000..2aaf57c3 --- /dev/null +++ b/account_tax_constraints/README.rst @@ -0,0 +1,10 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: https://www.gnu.org/licenses/agpl + :alt: License: AGPL-3 + +======================= +Account Tax constraints +======================= + +This module prohibits the removal of a tax when this tax +has been set on product records. diff --git a/account_tax_constraints/__init__.py b/account_tax_constraints/__init__.py new file mode 100644 index 00000000..a0fdc10f --- /dev/null +++ b/account_tax_constraints/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/account_tax_constraints/__manifest__.py b/account_tax_constraints/__manifest__.py new file mode 100644 index 00000000..5422cdd0 --- /dev/null +++ b/account_tax_constraints/__manifest__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2009-2018 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Account Tax constraints', + 'version': '11.0.1.0.0', + 'category': 'Accounting & Finance', + 'website': 'https://www.noviat.com', + 'author': 'Noviat', + 'license': 'AGPL-3', + 'installable': True, + 'depends': [ + 'account', + ], +} diff --git a/account_tax_constraints/models/__init__.py b/account_tax_constraints/models/__init__.py new file mode 100644 index 00000000..f8456f67 --- /dev/null +++ b/account_tax_constraints/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import account_tax diff --git a/account_tax_constraints/models/account_tax.py b/account_tax_constraints/models/account_tax.py new file mode 100644 index 00000000..ae98681c --- /dev/null +++ b/account_tax_constraints/models/account_tax.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Copyright 2009-2018 Noviat. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, models, _ +from odoo.exceptions import UserError + + +class AccountTax(models.Model): + _inherit = 'account.tax' + + @api.multi + def unlink(self): + for tax in self: + products = self.env['product.template'].with_context( + active_test=False).search( + ['|', ('supplier_taxes_id', '=', tax.id), + ('taxes_id', '=', tax.id)]) + if products: + product_list = [ + '%s' % x.name for x in products] + raise UserError(_( + "You cannot delete a tax that " + "has been set on product records" + "\nAs an alterative, you can disable a " + "tax via the 'active' flag." + "\n\nProduct records: %s") % product_list) + return super(AccountTax, self).unlink() diff --git a/account_tax_constraints/static/description/icon.png b/account_tax_constraints/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32740c0cc5a5dac8166d897c827a9aa75a94d276 GIT binary patch literal 17495 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