From fdc4fad785d770aaffeba110f64035db2b5fddb0 Mon Sep 17 00:00:00 2001 From: cubells Date: Wed, 24 May 2017 20:48:17 +0200 Subject: [PATCH] [MIG][10.0] account_analytic_distribution_required module --- .../README.rst | 80 +++++++ .../__init__.py | 4 + .../__manifest__.py | 20 ++ .../i18n/ar.po | 73 ++++++ .../i18n/ca.po | 73 ++++++ .../i18n/cs_CZ.po | 81 +++++++ .../i18n/es.po | 84 +++++++ .../i18n/fr.po | 73 ++++++ .../i18n/hr.po | 81 +++++++ .../i18n/hr_HR.po | 73 ++++++ .../i18n/pt_BR.po | 73 ++++++ .../models/__init__.py | 4 + .../models/account.py | 75 +++++++ .../tests/__init__.py | 4 + .../test_account_analytic_plan_required.py | 208 ++++++++++++++++++ 15 files changed, 1006 insertions(+) create mode 100644 account_analytic_distribution_required/README.rst create mode 100644 account_analytic_distribution_required/__init__.py create mode 100644 account_analytic_distribution_required/__manifest__.py create mode 100644 account_analytic_distribution_required/i18n/ar.po create mode 100644 account_analytic_distribution_required/i18n/ca.po create mode 100644 account_analytic_distribution_required/i18n/cs_CZ.po create mode 100644 account_analytic_distribution_required/i18n/es.po create mode 100644 account_analytic_distribution_required/i18n/fr.po create mode 100644 account_analytic_distribution_required/i18n/hr.po create mode 100644 account_analytic_distribution_required/i18n/hr_HR.po create mode 100644 account_analytic_distribution_required/i18n/pt_BR.po create mode 100644 account_analytic_distribution_required/models/__init__.py create mode 100644 account_analytic_distribution_required/models/account.py create mode 100644 account_analytic_distribution_required/tests/__init__.py create mode 100644 account_analytic_distribution_required/tests/test_account_analytic_plan_required.py diff --git a/account_analytic_distribution_required/README.rst b/account_analytic_distribution_required/README.rst new file mode 100644 index 0000000000..39de18f42e --- /dev/null +++ b/account_analytic_distribution_required/README.rst @@ -0,0 +1,80 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============================== +Account Analytic Plan Required +============================== + +This module extends account_analytic_required and adds 2 policies to +control the use of analytic distributions. The policies behave as follow + +* never: no analytic account nor analytic distribution allowed +* always: analytic account required +* always_plan: analytic_distribution required +* always_plan_or_account: analytic distribution or analytic account required +* optional: do what you like, + +In any case analytic account and analytic distribution are mutually exclusive. + + +Configuration +============= + +To configure this module, you need to: + +#. Go to *Invoicing (or Accounting) > Configuration > Accounting > Account + Types* and select the correct **Policy for analytic account** for every + account type you want. + +Usage +===== + +To use this module, you need to: + +#. Create an invoice and add a line with an account of the same type you + are configured above. +#. Add an analytic distribution or an analytic account to that line. +#. When you validate the invoice you get a message if analytic account or + distribution are incorrect. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/87/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 smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Stéphane Bidoul +* Vicent Cubells + +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 https://odoo-community.org. diff --git a/account_analytic_distribution_required/__init__.py b/account_analytic_distribution_required/__init__.py new file mode 100644 index 0000000000..ec50cfc0f3 --- /dev/null +++ b/account_analytic_distribution_required/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models diff --git a/account_analytic_distribution_required/__manifest__.py b/account_analytic_distribution_required/__manifest__.py new file mode 100644 index 0000000000..fe7df8a50d --- /dev/null +++ b/account_analytic_distribution_required/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Copyright 2014 Acsone - Stéphane Bidoul +# Copyright 2017 Tecnativa - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + 'name': 'Account Analytic Distribution Required', + 'version': '10.0.1.0.0', + 'category': 'Analytic Accounting', + 'license': 'AGPL-3', + 'author': "ACSONE SA/NV, " + "Tecnativa, " + "Odoo Community Association (OCA)", + 'website': 'http://www.acsone.eu/', + 'depends': [ + 'account_analytic_required', + 'account_analytic_distribution', + ], + 'application': False, + 'installable': True, +} diff --git a/account_analytic_distribution_required/i18n/ar.po b/account_analytic_distribution_required/i18n/ar.po new file mode 100644 index 0000000000..87ed5824ee --- /dev/null +++ b/account_analytic_distribution_required/i18n/ar.po @@ -0,0 +1,73 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-21 02:39+0000\n" +"PO-Revision-Date: 2017-06-21 02:39+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Arabic (https://www.transifex.com/oca/teams/23907/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\n" +"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "نوع الحساب" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "" diff --git a/account_analytic_distribution_required/i18n/ca.po b/account_analytic_distribution_required/i18n/ca.po new file mode 100644 index 0000000000..8487d248a8 --- /dev/null +++ b/account_analytic_distribution_required/i18n/ca.po @@ -0,0 +1,73 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-21 02:39+0000\n" +"PO-Revision-Date: 2017-06-21 02:39+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: Catalan (https://www.transifex.com/oca/teams/23907/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Tipus de compte" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "" diff --git a/account_analytic_distribution_required/i18n/cs_CZ.po b/account_analytic_distribution_required/i18n/cs_CZ.po new file mode 100644 index 0000000000..01c652ec08 --- /dev/null +++ b/account_analytic_distribution_required/i18n/cs_CZ.po @@ -0,0 +1,81 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# Lukáš Spurný , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 03:54+0000\n" +"PO-Revision-Date: 2018-02-21 03:54+0000\n" +"Last-Translator: Lukáš Spurný , 2018\n" +"Language-Team: Czech (Czech Republic) (https://www.transifex.com/oca/teams/23907/cs_CZ/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs_CZ\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Typ účtu" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "Vždy (analytický účet nebo distribuce)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "Vždy (analytická distribuce)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "Analytická účetní a analytická distribuce se navzájem vylučují" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" +"Analytická politika je nastavena na hodnotu vždy (analytický účet nebo " +"distribuce) s účtem %s'%s', ale v řádku přesunu účtu se značkou '%s' chybí " +"analytická distribuce a analytický účet." + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" +"Analytická politika je nastavena na hodnotu \"Vždy (analytická distribuce)\"" +" s účtem %s \"%s\", ale v řádku přesunu účtu s popisem \"%s\" chybí " +"analytická distribuce." + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" +"Analytická politika je nastavena na hodnotu 'Nikdy' s účtem %s '%s', ale " +"řádek přesunu účtu s označením '%s' má analytickou distribuci %s '%s'." + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "Položka žurnálu" diff --git a/account_analytic_distribution_required/i18n/es.po b/account_analytic_distribution_required/i18n/es.po new file mode 100644 index 0000000000..069df999fa --- /dev/null +++ b/account_analytic_distribution_required/i18n/es.po @@ -0,0 +1,84 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# OCA Transbot , 2017 +# Pedro M. Baeza , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-21 02:39+0000\n" +"PO-Revision-Date: 2017-06-21 02:39+0000\n" +"Last-Translator: Pedro M. Baeza , 2017\n" +"Language-Team: Spanish (https://www.transifex.com/oca/teams/23907/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Tipo de cuenta" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "Siempre (cuenta analítica o distribución)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "Siempre (distribución analítica)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "" +"La cuenta analítica y la distribución analítica son mutuamente exclusivas" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" +"La política analítica está establecida a 'Siempre (cuenta analítica o " +"distribución)' con la cuenta %s '%s' pero falta la distribución analítica y " +"la cuenta analítica en el apunte contable con la etiqueta '%s'." + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" +"La política analítica está establecida a 'Siempre (distribución analítica)' " +"con la cuenta %s '%s' pero falta la distribución analítica en el apunte " +"contable con la etiqueta '%s'." + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" +"La política analítica está establecida a 'Nunca' con la cuenta %s '%s' pero " +"el apunte contable con la etiqueta '%s' tiene la distribución analítica %s " +"'%s'." + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "Apunte contable" diff --git a/account_analytic_distribution_required/i18n/fr.po b/account_analytic_distribution_required/i18n/fr.po new file mode 100644 index 0000000000..653d243c5f --- /dev/null +++ b/account_analytic_distribution_required/i18n/fr.po @@ -0,0 +1,73 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# OCA Transbot , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-21 02:39+0000\n" +"PO-Revision-Date: 2017-06-21 02:39+0000\n" +"Last-Translator: OCA Transbot , 2017\n" +"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Type de compte" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "" diff --git a/account_analytic_distribution_required/i18n/hr.po b/account_analytic_distribution_required/i18n/hr.po new file mode 100644 index 0000000000..cfdbe74a9b --- /dev/null +++ b/account_analytic_distribution_required/i18n/hr.po @@ -0,0 +1,81 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# Bole , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-21 03:54+0000\n" +"PO-Revision-Date: 2018-02-21 03:54+0000\n" +"Last-Translator: Bole , 2018\n" +"Language-Team: Croatian (https://www.transifex.com/oca/teams/23907/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hr\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Tip konta" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "Uvijek (analitički konto ili distribucija)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "Uvijek (analitička distribucija)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "Analitički konto i analitička distribucija se međusobno isključuju" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" +"Pravilo analitike je postavljeno na 'Uvijek (analitički konto ili " +"distribucija) sa kontom %s '%s' ali analitičkoj distribuciji i analitičkom " +"kontu nedostaju stavke temeljnice sa nazivom '%s'." + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" +"Pravilo analitike je postavljeno na 'Uvijek (analitička distribucija) za " +"konto %s '%s' ali analitičkoj distribuciji nedostaje stavka temeljnice sa " +"nazivom '%s'." + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" +"Pravilo analitike je postavljeno na 'Nikad' za konto %s '%s' ali stavka " +"temeljnice sa nazivom '%s' sadrži analitičku distribuciju %s '%s'." + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "Stavka dnevnika" diff --git a/account_analytic_distribution_required/i18n/hr_HR.po b/account_analytic_distribution_required/i18n/hr_HR.po new file mode 100644 index 0000000000..2422f46bae --- /dev/null +++ b/account_analytic_distribution_required/i18n/hr_HR.po @@ -0,0 +1,73 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# Bole , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-30 02:40+0000\n" +"PO-Revision-Date: 2017-06-30 02:40+0000\n" +"Last-Translator: Bole , 2017\n" +"Language-Team: Croatian (Croatia) (https://www.transifex.com/oca/teams/23907/hr_HR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hr_HR\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Tip konta" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "Uvjek (analitički konto ili distribucija)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "Uvjek (analitička distribucija)" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "Stavka dnevnika" diff --git a/account_analytic_distribution_required/i18n/pt_BR.po b/account_analytic_distribution_required/i18n/pt_BR.po new file mode 100644 index 0000000000..a73fa46648 --- /dev/null +++ b/account_analytic_distribution_required/i18n/pt_BR.po @@ -0,0 +1,73 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_analytic_distribution_required +# +# Translators: +# Rodrigo de Almeida Sottomaior Macedo , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-06-21 02:39+0000\n" +"PO-Revision-Date: 2017-06-21 02:39+0000\n" +"Last-Translator: Rodrigo de Almeida Sottomaior Macedo , 2017\n" +"Language-Team: Portuguese (Brazil) (https://www.transifex.com/oca/teams/23907/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_account_type +msgid "Account Type" +msgstr "Tipo de Conta" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:16 +#, python-format +msgid "Always (analytic account or distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:14 +#, python-format +msgid "Always (analytic distribution)" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:29 +#, python-format +msgid "Analytic account and analytic distribution are mutually exclusive" +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:47 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic account or distribution)' with " +"account %s '%s' but the analytic distribution and the analytic account are " +"missing in the account move line with label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:36 +#, python-format +msgid "" +"Analytic policy is set to 'Always (analytic distribution)' with account %s " +"'%s' but the analytic distribution is missing in the account move line with " +"label '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: code:addons/account_analytic_distribution_required/models/account.py:58 +#, python-format +msgid "" +"Analytic policy is set to 'Never' with account %s '%s' but the account move " +"line with label '%s' has an analytic distribution %s '%s'." +msgstr "" + +#. module: account_analytic_distribution_required +#: model:ir.model,name:account_analytic_distribution_required.model_account_move_line +msgid "Journal Item" +msgstr "Item diário" diff --git a/account_analytic_distribution_required/models/__init__.py b/account_analytic_distribution_required/models/__init__.py new file mode 100644 index 0000000000..aa6d41725d --- /dev/null +++ b/account_analytic_distribution_required/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account diff --git a/account_analytic_distribution_required/models/account.py b/account_analytic_distribution_required/models/account.py new file mode 100644 index 0000000000..299b88bd2c --- /dev/null +++ b/account_analytic_distribution_required/models/account.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# Copyright 2014 Acsone - Stéphane Bidoul +# Copyright 2017 Tecnativa - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, exceptions, fields, models + + +class AccountAccountType(models.Model): + _inherit = "account.account.type" + + analytic_policy = fields.Selection( + selection_add=[ + ('always_plan', _('Always (analytic distribution)')), + ('always_plan_or_account', + _('Always (analytic account or distribution)')) + ], + ) + + +class AccountMoveLine(models.Model): + _inherit = "account.move.line" + + @api.multi + def _check_analytic_distribution_required_msg(self): + for move_line in self: + if move_line.analytic_account_id \ + and move_line.analytic_distribution_id: + return _('Analytic account and analytic distribution ' + 'are mutually exclusive') + if move_line.debit == 0 and move_line.credit == 0: + continue + analytic_policy = self._get_analytic_policy(move_line.account_id) + if analytic_policy == 'always_plan' \ + and not move_line.analytic_distribution_id: + return _("Analytic policy is set to " + "'Always (analytic distribution)' with account " + "%s '%s' but the analytic distribution is " + "missing in the account move line with " + "label '%s'.") % \ + (move_line.account_id.code, + move_line.account_id.name, + move_line.name) + if analytic_policy == 'always_plan_or_account' \ + and not move_line.analytic_account_id \ + and not move_line.analytic_distribution_id: + return _("Analytic policy is set to " + "'Always (analytic account or distribution)' " + "with account %s '%s' but the analytic " + "distribution and the analytic account are " + "missing in the account move line " + "with label '%s'.") % \ + (move_line.account_id.code, + move_line.account_id.name, + move_line.name) + elif analytic_policy == 'never' \ + and move_line.analytic_distribution_id: + return _("Analytic policy is set to 'Never' with account " + "%s '%s' but the account move line with label " + "'%s' has an analytic distribution %s '%s'.") % \ + (move_line.account_id.code, + move_line.account_id.name, + move_line.name, + move_line.analytic_account_id.code, + move_line.analytic_account_id.name) + + @api.constrains('analytic_account_id', 'analytic_distribution_id', + 'account_id', 'debit', 'credit') + def _check_analytic_required(self): + for rec in self: + message = rec._check_analytic_distribution_required_msg() + if message: + raise exceptions.ValidationError(message) + else: + super(AccountMoveLine, self)._check_analytic_required() diff --git a/account_analytic_distribution_required/tests/__init__.py b/account_analytic_distribution_required/tests/__init__.py new file mode 100644 index 0000000000..0c2312363d --- /dev/null +++ b/account_analytic_distribution_required/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_account_analytic_plan_required diff --git a/account_analytic_distribution_required/tests/test_account_analytic_plan_required.py b/account_analytic_distribution_required/tests/test_account_analytic_plan_required.py new file mode 100644 index 0000000000..fa406605ab --- /dev/null +++ b/account_analytic_distribution_required/tests/test_account_analytic_plan_required.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +# Copyright 2014 Acsone - Stéphane Bidoul +# Copyright 2017 Tecnativa - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime + +from odoo.tests.common import SavepointCase +from odoo.exceptions import ValidationError + + +class TestAccountAnalyticPlanRequired(SavepointCase): + + @classmethod + def setUpClass(cls): + super(TestAccountAnalyticPlanRequired, cls).setUpClass() + cls.account_obj = cls.env['account.account'] + cls.account_type_obj = cls.env['account.account.type'] + cls.move_obj = cls.env['account.move'] + cls.move_line_obj = cls.env['account.move.line'] + cls.analytic_account_obj = cls.env['account.analytic.account'] + cls.analytic_distribution_obj = \ + cls.env['account.analytic.distribution'] + cls.user_type = cls.env.ref('account.data_account_type_revenue') + cls.analytic_account_id = cls.analytic_account_obj.create({ + 'name': 'test aa', + }) + cls.account_type = cls.account_type_obj.create({ + 'name': 'Test account_type' + }) + cls.account_id = cls.env['account.account'].create({ + 'name': 'Test account', + 'code': '440000_demo', + 'user_type_id': cls.account_type.id, + 'reconcile': True}) + cls.account_expense_id = cls.env['account.account'].create({ + 'name': 'Other accoynt', + 'code': '600000_demo', + 'user_type_id': + cls.env.ref('account.data_account_type_expenses').id, + 'reconcile': False}) + cls.analytic_distribution_id = cls.analytic_distribution_obj.create({ + 'name': 'test ad', + }) + + def _create_move(self, with_analytic, with_analytic_plan, amount=100): + date = datetime.now() + move_vals = { + 'journal_id': + self.env['account.journal'].search([('type', '=', 'sale')]).id, + 'date': date, + } + move_id = self.move_obj.create(move_vals) + move_line_id = self.move_line_obj.with_context( + check_move_validity=False + ).create({ + 'move_id': move_id.id, + 'name': '/', + 'debit': 0, + 'credit': amount, + 'account_id': self.account_id.id, + 'analytic_account_id': + self.analytic_account_id.id if with_analytic else False, + 'analytic_distribution_id': + self.analytic_distribution_id.id if with_analytic_plan else False, + }) + self.move_line_obj.create({ + 'move_id': move_id.id, + 'name': '/', + 'debit': amount, + 'credit': 0, + 'account_id': self.account_expense_id.id, + }) + return move_line_id + + def test_optional(self): + self._create_move(with_analytic=False, with_analytic_plan=False) + self._create_move(with_analytic=True, with_analytic_plan=False) + self._create_move(with_analytic=False, with_analytic_plan=True) + + def test_exclusive(self): + with self.assertRaises(ValidationError): + self._create_move(with_analytic=True, with_analytic_plan=True) + + def test_always_no_analytic(self): + self.account_type.write({ + 'analytic_policy': 'always', + }) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=False, with_analytic_plan=False) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=False, with_analytic_plan=True) + + def test_always_no_analytic_0(self): + # accept missing analytic account when debit=credit=0 + self.account_type.write({ + 'analytic_policy': 'always', + }) + self._create_move(with_analytic=False, with_analytic_plan=False, + amount=0) + + def test_always_with_analytic(self): + self.account_type.write({ + 'analytic_policy': 'always', + }) + self._create_move(with_analytic=True, with_analytic_plan=False) + + def test_always_plan_no_analytic_plan(self): + self.account_type.write({ + 'analytic_policy': 'always_plan', + }) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=False, with_analytic_plan=False) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=True, with_analytic_plan=False) + + def test_always_plan_no_analytic_plan_0(self): + # accept missing analytic distribution when debit=credit=0 + self.account_type.write({ + 'analytic_policy': 'always_plan', + }) + self._create_move(with_analytic=False, with_analytic_plan=False, + amount=0) + + def test_always_plan_with_analytic_plan(self): + self.account_type.write({ + 'analytic_policy': 'always_plan', + }) + self._create_move(with_analytic=False, with_analytic_plan=True) + + def test_always_plan_or_account_nothing(self): + self.account_type.write({ + 'analytic_policy': 'always_plan_or_account', + }) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=False, with_analytic_plan=False) + + def test_always_plan_or_account_no_analytic_plan_0(self): + # accept missing analytic distribution when debit=credit=0 + self.account_type.write({ + 'analytic_policy': 'always_plan_or_account', + }) + self._create_move(with_analytic=False, with_analytic_plan=False, + amount=0) + self._create_move(with_analytic=True, with_analytic_plan=False, + amount=0) + self._create_move(with_analytic=False, with_analytic_plan=True, + amount=0) + + def test_always_plan_or_account_with(self): + self.account_id.user_type_id.write({ + 'analytic_policy': 'always_plan_or_account', + }) + self._create_move(with_analytic=False, with_analytic_plan=True) + self._create_move(with_analytic=True, with_analytic_plan=False) + + def test_never_no_analytic(self): + self.account_type.write({ + 'analytic_policy': 'never', + }) + self._create_move(with_analytic=False, with_analytic_plan=False) + + def test_never_with_analytic(self): + self.account_type.write({ + 'analytic_policy': 'never', + }) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=True, with_analytic_plan=False) + with self.assertRaises(ValidationError): + self._create_move(with_analytic=False, with_analytic_plan=True) + + def test_never_with_analytic_0(self): + # accept analytic when debit=credit=0 + self.account_type.write({ + 'analytic_policy': 'never', + }) + self._create_move(with_analytic=True, with_analytic_plan=False, + amount=0) + self._create_move(with_analytic=False, with_analytic_plan=True, + amount=0) + + def test_always_remove_analytic_plan(self): + # remove analytic plan account when policy is always + self.account_type.write({ + 'analytic_policy': 'always_plan', + }) + line_id = self._create_move(with_analytic=False, + with_analytic_plan=True) + with self.assertRaises(ValidationError): + line_id.write({'analytic_distribution_id': False}) + + def test_change_account(self): + self.account_type.write({ + 'analytic_policy': 'always_plan', + }) + # change account to a_expense with policy always_plan but missing + # analytic distribution + with self.assertRaises(ValidationError): + line_id = self._create_move(with_analytic=False, + with_analytic_plan=False) + line_id.write({ + 'account_id': self.account_expense_id.id}) + # change account to a_expense with policy always_plan + # with analytic distribution -> ok + self.move_line_obj.write({ + 'account_id': self.account_expense_id.id, + 'analytic_distribution_id': self.analytic_distribution_id.id, + })