From 824a4eca2d79f1ba9391b357b13d54cadfe84a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Mon, 19 Feb 2024 09:24:34 +0100 Subject: [PATCH 1/3] [ADD] hr_expense_employee_analytic_default: New module TT47803 [UPD] Update hr_expense_employee_analytic_default.pot --- .../README.rst | 107 +++++ .../__init__.py | 3 + .../__manifest__.py | 14 + .../hr_expense_employee_analytic_default.pot | 24 + .../models/__init__.py | 4 + .../models/account_analytic_default.py | 35 ++ .../models/hr_expense.py | 22 + .../readme/CONFIGURE.rst | 5 + .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 6 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 449 ++++++++++++++++++ .../tests/__init__.py | 1 + ...st_hr_expense_employee_analytic_default.py | 92 ++++ 15 files changed, 768 insertions(+) create mode 100644 hr_expense_employee_analytic_default/README.rst create mode 100644 hr_expense_employee_analytic_default/__init__.py create mode 100644 hr_expense_employee_analytic_default/__manifest__.py create mode 100644 hr_expense_employee_analytic_default/i18n/hr_expense_employee_analytic_default.pot create mode 100644 hr_expense_employee_analytic_default/models/__init__.py create mode 100644 hr_expense_employee_analytic_default/models/account_analytic_default.py create mode 100644 hr_expense_employee_analytic_default/models/hr_expense.py create mode 100644 hr_expense_employee_analytic_default/readme/CONFIGURE.rst create mode 100644 hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst create mode 100644 hr_expense_employee_analytic_default/readme/DESCRIPTION.rst create mode 100644 hr_expense_employee_analytic_default/readme/USAGE.rst create mode 100644 hr_expense_employee_analytic_default/static/description/icon.png create mode 100644 hr_expense_employee_analytic_default/static/description/index.html create mode 100644 hr_expense_employee_analytic_default/tests/__init__.py create mode 100644 hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py diff --git a/hr_expense_employee_analytic_default/README.rst b/hr_expense_employee_analytic_default/README.rst new file mode 100644 index 00000000..75d4b420 --- /dev/null +++ b/hr_expense_employee_analytic_default/README.rst @@ -0,0 +1,107 @@ +================================= +Expense Employee Analytic Default +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:7ca70fd00344e3819c9e4182d3d93d46aaa252b6e7e0df780f5cab1bb48db091 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr--expense-lightgray.png?logo=github + :target: https://github.com/OCA/hr-expense/tree/15.0/hr_expense_employee_analytic_default + :alt: OCA/hr-expense +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/hr-expense-15-0/hr-expense-15-0-hr_expense_employee_analytic_default + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/hr-expense&target_branch=15.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to create Analytic Defaults Rules for employees to be applied to +expenses. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +#. Go to an employee (or create a new one) and set a work address +#. Go to *Invocing > Configuration > Analytic default rules* and create a rule that + has as partner the employee's work address. + +Usage +===== + +To use this module, you need to: + +#. Go to *Expenses* and create a new one. +#. The analytical account and analytical tags will be set according to the rule. +#. When changing the employee, the analytical account and analytical tags will + be updated. + +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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tecnativa + +Contributors +~~~~~~~~~~~~ + +* `Tecnativa `_: + + * Víctor Martínez + * Pedro M. Baeza + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :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. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/hr-expense `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_expense_employee_analytic_default/__init__.py b/hr_expense_employee_analytic_default/__init__.py new file mode 100644 index 00000000..4b76c7b2 --- /dev/null +++ b/hr_expense_employee_analytic_default/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/hr_expense_employee_analytic_default/__manifest__.py b/hr_expense_employee_analytic_default/__manifest__.py new file mode 100644 index 00000000..1a702f76 --- /dev/null +++ b/hr_expense_employee_analytic_default/__manifest__.py @@ -0,0 +1,14 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Expense Employee Analytic Default", + "version": "15.0.1.0.0", + "category": "Human Resources", + "website": "https://github.com/OCA/hr-expense", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["hr_expense"], + "installable": True, + "data": [], + "maintainers": ["victoralmau"], +} diff --git a/hr_expense_employee_analytic_default/i18n/hr_expense_employee_analytic_default.pot b/hr_expense_employee_analytic_default/i18n/hr_expense_employee_analytic_default.pot new file mode 100644 index 00000000..3669c168 --- /dev/null +++ b/hr_expense_employee_analytic_default/i18n/hr_expense_employee_analytic_default.pot @@ -0,0 +1,24 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_expense_employee_analytic_default +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_expense_employee_analytic_default +#: model:ir.model,name:hr_expense_employee_analytic_default.model_account_analytic_default +msgid "Analytic Distribution" +msgstr "" + +#. module: hr_expense_employee_analytic_default +#: model:ir.model,name:hr_expense_employee_analytic_default.model_hr_expense +msgid "Expense" +msgstr "" diff --git a/hr_expense_employee_analytic_default/models/__init__.py b/hr_expense_employee_analytic_default/models/__init__.py new file mode 100644 index 00000000..e28d2a87 --- /dev/null +++ b/hr_expense_employee_analytic_default/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_analytic_default +from . import hr_expense diff --git a/hr_expense_employee_analytic_default/models/account_analytic_default.py b/hr_expense_employee_analytic_default/models/account_analytic_default.py new file mode 100644 index 00000000..da16a947 --- /dev/null +++ b/hr_expense_employee_analytic_default/models/account_analytic_default.py @@ -0,0 +1,35 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class AccountAnalyticDefault(models.Model): + _inherit = "account.analytic.default" + + @api.model + def account_get( + self, + product_id=None, + partner_id=None, + account_id=None, + user_id=None, + date=None, + company_id=None, + ): + """If custom context is set, change partner to user partner of the employee + to get the correct value.""" + if self.env.context.get("hr_expense_employee_id"): + employee = self.env["hr.employee"].browse( + self.env.context.get("hr_expense_employee_id") + ) + if employee.address_id: + partner_id = employee.address_id.id + return super().account_get( + product_id=product_id, + partner_id=partner_id, + account_id=account_id, + user_id=user_id, + date=date, + company_id=company_id, + ) diff --git a/hr_expense_employee_analytic_default/models/hr_expense.py b/hr_expense_employee_analytic_default/models/hr_expense.py new file mode 100644 index 00000000..4e30666d --- /dev/null +++ b/hr_expense_employee_analytic_default/models/hr_expense.py @@ -0,0 +1,22 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class HrExpense(models.Model): + _inherit = "hr.expense" + + @api.onchange("product_id", "date", "account_id") + def _onchange_product_id_date_account_id(self): + """Set a specific context with the employee of the expense.""" + self = self.with_context(hr_expense_employee_id=self.employee_id.id) + return super()._onchange_product_id_date_account_id() + + @api.onchange("employee_id") + def _onchange_employee_id(self): + """If the employee is changed, change the account by calling the existing + onchange and emptying the existing data.""" + self.analytic_account_id = False + self.analytic_tag_ids = [(5, 0)] + self._onchange_product_id_date_account_id() diff --git a/hr_expense_employee_analytic_default/readme/CONFIGURE.rst b/hr_expense_employee_analytic_default/readme/CONFIGURE.rst new file mode 100644 index 00000000..a43d7839 --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/CONFIGURE.rst @@ -0,0 +1,5 @@ +To configure this module, you need to: + +#. Go to an employee (or create a new one) and set a work address +#. Go to *Invocing > Configuration > Analytic default rules* and create a rule that + has as partner the employee's work address. diff --git a/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst b/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..5fb71305 --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Tecnativa `_: + + * Víctor Martínez + * Pedro M. Baeza diff --git a/hr_expense_employee_analytic_default/readme/DESCRIPTION.rst b/hr_expense_employee_analytic_default/readme/DESCRIPTION.rst new file mode 100644 index 00000000..def8f9b0 --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module allows to create Analytic Defaults Rules for employees to be applied to +expenses. diff --git a/hr_expense_employee_analytic_default/readme/USAGE.rst b/hr_expense_employee_analytic_default/readme/USAGE.rst new file mode 100644 index 00000000..fc7e7397 --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/USAGE.rst @@ -0,0 +1,6 @@ +To use this module, you need to: + +#. Go to *Expenses* and create a new one. +#. The analytical account and analytical tags will be set according to the rule. +#. When changing the employee, the analytical account and analytical tags will + be updated. diff --git a/hr_expense_employee_analytic_default/static/description/icon.png b/hr_expense_employee_analytic_default/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/hr_expense_employee_analytic_default/static/description/index.html b/hr_expense_employee_analytic_default/static/description/index.html new file mode 100644 index 00000000..9ee9678a --- /dev/null +++ b/hr_expense_employee_analytic_default/static/description/index.html @@ -0,0 +1,449 @@ + + + + + + +Expense Employee Analytic Default + + + +
+

Expense Employee Analytic Default

+ + +

Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

+

This module allows to create Analytic Defaults Rules for employees to be applied to +expenses.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

+
    +
  1. Go to an employee (or create a new one) and set a work address
  2. +
  3. Go to Invocing > Configuration > Analytic default rules and create a rule that +has as partner the employee’s work address.
  4. +
+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Expenses and create a new one.
  2. +
  3. The analytical account and analytical tags will be set according to the rule.
  4. +
  5. When changing the employee, the analytical account and analytical tags will +be updated.
  6. +
+
+
+

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 to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Víctor Martínez
    • +
    • Pedro M. Baeza
    • +
    +
  • +
+
+
+

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.

+

Current maintainer:

+

victoralmau

+

This module is part of the OCA/hr-expense project on GitHub.

+

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

+
+
+
+ + diff --git a/hr_expense_employee_analytic_default/tests/__init__.py b/hr_expense_employee_analytic_default/tests/__init__.py new file mode 100644 index 00000000..fc1b183f --- /dev/null +++ b/hr_expense_employee_analytic_default/tests/__init__.py @@ -0,0 +1 @@ +from . import test_hr_expense_employee_analytic_default diff --git a/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py b/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py new file mode 100644 index 00000000..4a4c7568 --- /dev/null +++ b/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py @@ -0,0 +1,92 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests import Form, common, new_test_user + + +class TestHrExpenseEmployeeAnalyticDefault(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env( + context=dict( + cls.env.context, + mail_create_nolog=True, + mail_create_nosubscribe=True, + mail_notrack=True, + no_reset_password=True, + tracking_disable=True, + ) + ) + cls.user1 = new_test_user( + cls.env, + login="test_user_1", + ) + cls.user1.action_create_employee() + cls.work_address = cls.env["res.partner"].create( + { + "name": "Work address", + } + ) + cls.user1.employee_ids.address_id = cls.work_address + cls.user2 = new_test_user( + cls.env, + login="test_user_2", + ) + cls.user2.action_create_employee() + cls.analytic_account = cls.env["account.analytic.account"].create( + { + "name": "Test analytic account", + } + ) + cls.analytic_tag = cls.env["account.analytic.tag"].create( + {"name": "Test analytic tag"} + ) + cls.default_rule = cls.env["account.analytic.default"].create( + { + "analytic_id": cls.analytic_account.id, + "analytic_tag_ids": [(4, cls.analytic_tag.id)], + "partner_id": cls.work_address.id, + "date_start": "2023-01-01", + } + ) + cls.product = cls.env["product.product"].create( + { + "name": "Test expense product", + "can_be_expensed": True, + } + ) + + def test_hr_employee_1(self): + """Create expense for employee 1 + change to employee 2.""" + expense_form = Form( + self.env["hr.expense"].with_context( + default_employee_id=self.user1.employee_ids.id + ) + ) + expense_form.product_id = self.product + expense_form.name = "Test" + expense = expense_form.save() + self.assertEqual(expense.analytic_account_id, self.analytic_account) + self.assertIn(self.analytic_tag, expense.analytic_tag_ids) + expense_form.employee_id = self.user2.employee_ids + expense = expense_form.save() + self.assertFalse(expense.analytic_account_id) + self.assertNotIn(self.analytic_tag, expense.analytic_tag_ids) + + def test_hr_employee_2(self): + """Create expense for employee 2 + change to employee 1.""" + expense_form = Form( + self.env["hr.expense"].with_context( + default_employee_id=self.user2.employee_ids.id + ) + ) + expense_form.product_id = self.product + expense_form.name = "Test" + expense = expense_form.save() + self.assertFalse(expense.analytic_account_id) + self.assertNotIn(self.analytic_tag, expense.analytic_tag_ids) + expense_form.employee_id = self.user1.employee_ids + expense = expense_form.save() + self.assertEqual(expense.analytic_account_id, self.analytic_account) + self.assertIn(self.analytic_tag, expense.analytic_tag_ids) From bc07ec7f5552fc5a30e47f4217e95181d3678df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Fri, 27 Sep 2024 09:10:53 +0200 Subject: [PATCH 2/3] [IMP] hr_expense_employee_analytic_default: pre-commit auto fixes --- .../README.rst | 41 ++++++++++--------- .../pyproject.toml | 3 ++ .../readme/CONFIGURE.md | 5 +++ .../readme/CONFIGURE.rst | 5 --- .../readme/CONTRIBUTORS.md | 3 ++ .../readme/CONTRIBUTORS.rst | 4 -- .../{DESCRIPTION.rst => DESCRIPTION.md} | 4 +- .../readme/USAGE.md | 7 ++++ .../readme/USAGE.rst | 6 --- .../static/description/index.html | 33 ++++++++------- 10 files changed, 59 insertions(+), 52 deletions(-) create mode 100644 hr_expense_employee_analytic_default/pyproject.toml create mode 100644 hr_expense_employee_analytic_default/readme/CONFIGURE.md delete mode 100644 hr_expense_employee_analytic_default/readme/CONFIGURE.rst create mode 100644 hr_expense_employee_analytic_default/readme/CONTRIBUTORS.md delete mode 100644 hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst rename hr_expense_employee_analytic_default/readme/{DESCRIPTION.rst => DESCRIPTION.md} (68%) create mode 100644 hr_expense_employee_analytic_default/readme/USAGE.md delete mode 100644 hr_expense_employee_analytic_default/readme/USAGE.rst diff --git a/hr_expense_employee_analytic_default/README.rst b/hr_expense_employee_analytic_default/README.rst index 75d4b420..4a5a61e3 100644 --- a/hr_expense_employee_analytic_default/README.rst +++ b/hr_expense_employee_analytic_default/README.rst @@ -17,19 +17,19 @@ Expense Employee Analytic Default :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fhr--expense-lightgray.png?logo=github - :target: https://github.com/OCA/hr-expense/tree/15.0/hr_expense_employee_analytic_default + :target: https://github.com/OCA/hr-expense/tree/17.0/hr_expense_employee_analytic_default :alt: OCA/hr-expense .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/hr-expense-15-0/hr-expense-15-0-hr_expense_employee_analytic_default + :target: https://translation.odoo-community.org/projects/hr-expense-17-0/hr-expense-17-0-hr_expense_employee_analytic_default :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/hr-expense&target_branch=15.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/hr-expense&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows to create Analytic Defaults Rules for employees to be applied to -expenses. +This module allows to create Analytic Defaults Rules for employees to be +applied to expenses. **Table of contents** @@ -41,19 +41,20 @@ Configuration To configure this module, you need to: -#. Go to an employee (or create a new one) and set a work address -#. Go to *Invocing > Configuration > Analytic default rules* and create a rule that - has as partner the employee's work address. +1. Go to an employee (or create a new one) and set a work address +2. Go to *Invocing > Configuration > Analytic default rules* and create + a rule that has as partner the employee's work address. Usage ===== To use this module, you need to: -#. Go to *Expenses* and create a new one. -#. The analytical account and analytical tags will be set according to the rule. -#. When changing the employee, the analytical account and analytical tags will - be updated. +1. Go to *Expenses* and create a new one. +2. The analytical account and analytical tags will be set according to + the rule. +3. When changing the employee, the analytical account and analytical + tags will be updated. Bug Tracker =========== @@ -61,7 +62,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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -69,20 +70,20 @@ Credits ======= Authors -~~~~~~~ +------- * Tecnativa Contributors -~~~~~~~~~~~~ +------------ -* `Tecnativa `_: +- `Tecnativa `__: - * Víctor Martínez - * Pedro M. Baeza + - Víctor Martínez + - Pedro M. Baeza Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -102,6 +103,6 @@ Current `maintainer `__: |maintainer-victoralmau| -This module is part of the `OCA/hr-expense `_ project on GitHub. +This module is part of the `OCA/hr-expense `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_expense_employee_analytic_default/pyproject.toml b/hr_expense_employee_analytic_default/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/hr_expense_employee_analytic_default/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/hr_expense_employee_analytic_default/readme/CONFIGURE.md b/hr_expense_employee_analytic_default/readme/CONFIGURE.md new file mode 100644 index 00000000..791ef9a6 --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/CONFIGURE.md @@ -0,0 +1,5 @@ +To configure this module, you need to: + +1. Go to an employee (or create a new one) and set a work address +2. Go to *Invocing \> Configuration \> Analytic default rules* and + create a rule that has as partner the employee's work address. diff --git a/hr_expense_employee_analytic_default/readme/CONFIGURE.rst b/hr_expense_employee_analytic_default/readme/CONFIGURE.rst deleted file mode 100644 index a43d7839..00000000 --- a/hr_expense_employee_analytic_default/readme/CONFIGURE.rst +++ /dev/null @@ -1,5 +0,0 @@ -To configure this module, you need to: - -#. Go to an employee (or create a new one) and set a work address -#. Go to *Invocing > Configuration > Analytic default rules* and create a rule that - has as partner the employee's work address. diff --git a/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.md b/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..5fee3904 --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst b/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst deleted file mode 100644 index 5fb71305..00000000 --- a/hr_expense_employee_analytic_default/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,4 +0,0 @@ -* `Tecnativa `_: - - * Víctor Martínez - * Pedro M. Baeza diff --git a/hr_expense_employee_analytic_default/readme/DESCRIPTION.rst b/hr_expense_employee_analytic_default/readme/DESCRIPTION.md similarity index 68% rename from hr_expense_employee_analytic_default/readme/DESCRIPTION.rst rename to hr_expense_employee_analytic_default/readme/DESCRIPTION.md index def8f9b0..62789b48 100644 --- a/hr_expense_employee_analytic_default/readme/DESCRIPTION.rst +++ b/hr_expense_employee_analytic_default/readme/DESCRIPTION.md @@ -1,2 +1,2 @@ -This module allows to create Analytic Defaults Rules for employees to be applied to -expenses. +This module allows to create Analytic Defaults Rules for employees to be +applied to expenses. diff --git a/hr_expense_employee_analytic_default/readme/USAGE.md b/hr_expense_employee_analytic_default/readme/USAGE.md new file mode 100644 index 00000000..18ee57cb --- /dev/null +++ b/hr_expense_employee_analytic_default/readme/USAGE.md @@ -0,0 +1,7 @@ +To use this module, you need to: + +1. Go to *Expenses* and create a new one. +2. The analytical account and analytical tags will be set according to + the rule. +3. When changing the employee, the analytical account and analytical + tags will be updated. diff --git a/hr_expense_employee_analytic_default/readme/USAGE.rst b/hr_expense_employee_analytic_default/readme/USAGE.rst deleted file mode 100644 index fc7e7397..00000000 --- a/hr_expense_employee_analytic_default/readme/USAGE.rst +++ /dev/null @@ -1,6 +0,0 @@ -To use this module, you need to: - -#. Go to *Expenses* and create a new one. -#. The analytical account and analytical tags will be set according to the rule. -#. When changing the employee, the analytical account and analytical tags will - be updated. diff --git a/hr_expense_employee_analytic_default/static/description/index.html b/hr_expense_employee_analytic_default/static/description/index.html index 9ee9678a..d01cb097 100644 --- a/hr_expense_employee_analytic_default/static/description/index.html +++ b/hr_expense_employee_analytic_default/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,9 +369,9 @@

Expense Employee Analytic Default

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:7ca70fd00344e3819c9e4182d3d93d46aaa252b6e7e0df780f5cab1bb48db091 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

-

This module allows to create Analytic Defaults Rules for employees to be applied to -expenses.

+

Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

+

This module allows to create Analytic Defaults Rules for employees to be +applied to expenses.

Table of contents

    @@ -391,8 +391,8 @@

    Configuration

    To configure this module, you need to:

    1. Go to an employee (or create a new one) and set a work address
    2. -
    3. Go to Invocing > Configuration > Analytic default rules and create a rule that -has as partner the employee’s work address.
    4. +
    5. Go to Invocing > Configuration > Analytic default rules and create +a rule that has as partner the employee’s work address.
@@ -400,9 +400,10 @@

Usage

To use this module, you need to:

  1. Go to Expenses and create a new one.
  2. -
  3. The analytical account and analytical tags will be set according to the rule.
  4. -
  5. When changing the employee, the analytical account and analytical tags will -be updated.
  6. +
  7. The analytical account and analytical tags will be set according to +the rule.
  8. +
  9. When changing the employee, the analytical account and analytical +tags will be updated.
@@ -410,7 +411,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 to smash it by providing a detailed and welcomed -feedback.

+feedback.

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

@@ -434,13 +435,15 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +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.

Current maintainer:

victoralmau

-

This module is part of the OCA/hr-expense project on GitHub.

+

This module is part of the OCA/hr-expense project on GitHub.

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

From d884526923f0248e525806c981d7a581a87a4a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Mart=C3=ADnez?= Date: Fri, 27 Sep 2024 09:42:38 +0200 Subject: [PATCH 3/3] [MIG] hr_expense_employee_analytic_default: Migration to 17.0 TT50068 --- .../README.rst | 20 +++--- .../__manifest__.py | 3 +- .../models/__init__.py | 2 +- .../models/account_analytic_default.py | 35 --------- .../account_analytic_distribution_model.py | 20 ++++++ .../models/hr_expense.py | 14 +--- .../readme/CONFIGURE.md | 8 ++- .../readme/DESCRIPTION.md | 2 +- .../readme/USAGE.md | 8 +-- .../static/description/index.html | 18 ++--- ...st_hr_expense_employee_analytic_default.py | 72 ++++++++----------- 11 files changed, 84 insertions(+), 118 deletions(-) delete mode 100644 hr_expense_employee_analytic_default/models/account_analytic_default.py create mode 100644 hr_expense_employee_analytic_default/models/account_analytic_distribution_model.py diff --git a/hr_expense_employee_analytic_default/README.rst b/hr_expense_employee_analytic_default/README.rst index 4a5a61e3..bfcfa2d2 100644 --- a/hr_expense_employee_analytic_default/README.rst +++ b/hr_expense_employee_analytic_default/README.rst @@ -28,8 +28,8 @@ Expense Employee Analytic Default |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows to create Analytic Defaults Rules for employees to be -applied to expenses. +This module allows to create Analytic Distribution Models for employees +to be applied to expenses. **Table of contents** @@ -41,9 +41,11 @@ Configuration To configure this module, you need to: -1. Go to an employee (or create a new one) and set a work address -2. Go to *Invocing > Configuration > Analytic default rules* and create - a rule that has as partner the employee's work address. +1. Enable the “Analytic Accounting” permission on the user +2. Go to an employee (or create a new one) and set a work address +3. Go to *Invocing > Configuration > Analytic Accounting \|> Analytic + Distribution Models* and create a record that has as partner the + employee's work address. Usage ===== @@ -51,10 +53,10 @@ Usage To use this module, you need to: 1. Go to *Expenses* and create a new one. -2. The analytical account and analytical tags will be set according to - the rule. -3. When changing the employee, the analytical account and analytical - tags will be updated. +2. The analytical distribution will be set according to the analytic + distribution model. +3. When changing the employee, the analytical distribution will be + updated. Bug Tracker =========== diff --git a/hr_expense_employee_analytic_default/__manifest__.py b/hr_expense_employee_analytic_default/__manifest__.py index 1a702f76..a4aad710 100644 --- a/hr_expense_employee_analytic_default/__manifest__.py +++ b/hr_expense_employee_analytic_default/__manifest__.py @@ -2,13 +2,12 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Expense Employee Analytic Default", - "version": "15.0.1.0.0", + "version": "17.0.1.0.0", "category": "Human Resources", "website": "https://github.com/OCA/hr-expense", "author": "Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", "depends": ["hr_expense"], "installable": True, - "data": [], "maintainers": ["victoralmau"], } diff --git a/hr_expense_employee_analytic_default/models/__init__.py b/hr_expense_employee_analytic_default/models/__init__.py index e28d2a87..86fa7c5e 100644 --- a/hr_expense_employee_analytic_default/models/__init__.py +++ b/hr_expense_employee_analytic_default/models/__init__.py @@ -1,4 +1,4 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from . import account_analytic_default +from . import account_analytic_distribution_model from . import hr_expense diff --git a/hr_expense_employee_analytic_default/models/account_analytic_default.py b/hr_expense_employee_analytic_default/models/account_analytic_default.py deleted file mode 100644 index da16a947..00000000 --- a/hr_expense_employee_analytic_default/models/account_analytic_default.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2024 Tecnativa - Víctor Martínez -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -from odoo import api, models - - -class AccountAnalyticDefault(models.Model): - _inherit = "account.analytic.default" - - @api.model - def account_get( - self, - product_id=None, - partner_id=None, - account_id=None, - user_id=None, - date=None, - company_id=None, - ): - """If custom context is set, change partner to user partner of the employee - to get the correct value.""" - if self.env.context.get("hr_expense_employee_id"): - employee = self.env["hr.employee"].browse( - self.env.context.get("hr_expense_employee_id") - ) - if employee.address_id: - partner_id = employee.address_id.id - return super().account_get( - product_id=product_id, - partner_id=partner_id, - account_id=account_id, - user_id=user_id, - date=date, - company_id=company_id, - ) diff --git a/hr_expense_employee_analytic_default/models/account_analytic_distribution_model.py b/hr_expense_employee_analytic_default/models/account_analytic_distribution_model.py new file mode 100644 index 00000000..9d695f43 --- /dev/null +++ b/hr_expense_employee_analytic_default/models/account_analytic_distribution_model.py @@ -0,0 +1,20 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, models + + +class AccountAnalyticDistributionModel(models.Model): + _inherit = "account.analytic.distribution.model" + + @api.model + def _get_distribution(self, vals): + """If custom context is set, change partner to user partner of the employee + to get the correct distribution.""" + if self.env.context.get("hr_expense_employee_id"): + employee = self.env["hr.employee"].browse( + self.env.context.get("hr_expense_employee_id") + ) + if employee.address_id: + vals.update(partner_id=employee.address_id.id) + return super()._get_distribution(vals) diff --git a/hr_expense_employee_analytic_default/models/hr_expense.py b/hr_expense_employee_analytic_default/models/hr_expense.py index 4e30666d..b0d0447a 100644 --- a/hr_expense_employee_analytic_default/models/hr_expense.py +++ b/hr_expense_employee_analytic_default/models/hr_expense.py @@ -7,16 +7,8 @@ class HrExpense(models.Model): _inherit = "hr.expense" - @api.onchange("product_id", "date", "account_id") - def _onchange_product_id_date_account_id(self): + @api.depends("employee_id") + def _compute_analytic_distribution(self): """Set a specific context with the employee of the expense.""" self = self.with_context(hr_expense_employee_id=self.employee_id.id) - return super()._onchange_product_id_date_account_id() - - @api.onchange("employee_id") - def _onchange_employee_id(self): - """If the employee is changed, change the account by calling the existing - onchange and emptying the existing data.""" - self.analytic_account_id = False - self.analytic_tag_ids = [(5, 0)] - self._onchange_product_id_date_account_id() + return super()._compute_analytic_distribution() diff --git a/hr_expense_employee_analytic_default/readme/CONFIGURE.md b/hr_expense_employee_analytic_default/readme/CONFIGURE.md index 791ef9a6..5859843a 100644 --- a/hr_expense_employee_analytic_default/readme/CONFIGURE.md +++ b/hr_expense_employee_analytic_default/readme/CONFIGURE.md @@ -1,5 +1,7 @@ To configure this module, you need to: -1. Go to an employee (or create a new one) and set a work address -2. Go to *Invocing \> Configuration \> Analytic default rules* and - create a rule that has as partner the employee's work address. +1. Enable the “Analytic Accounting” permission on the user +2. Go to an employee (or create a new one) and set a work address +3. Go to *Invocing \> Configuration \> Analytic Accounting |> + Analytic Distribution Models* and create a record that has as partner + the employee's work address. diff --git a/hr_expense_employee_analytic_default/readme/DESCRIPTION.md b/hr_expense_employee_analytic_default/readme/DESCRIPTION.md index 62789b48..de58d15f 100644 --- a/hr_expense_employee_analytic_default/readme/DESCRIPTION.md +++ b/hr_expense_employee_analytic_default/readme/DESCRIPTION.md @@ -1,2 +1,2 @@ -This module allows to create Analytic Defaults Rules for employees to be +This module allows to create Analytic Distribution Models for employees to be applied to expenses. diff --git a/hr_expense_employee_analytic_default/readme/USAGE.md b/hr_expense_employee_analytic_default/readme/USAGE.md index 18ee57cb..15e4a0fc 100644 --- a/hr_expense_employee_analytic_default/readme/USAGE.md +++ b/hr_expense_employee_analytic_default/readme/USAGE.md @@ -1,7 +1,7 @@ To use this module, you need to: 1. Go to *Expenses* and create a new one. -2. The analytical account and analytical tags will be set according to - the rule. -3. When changing the employee, the analytical account and analytical - tags will be updated. +2. The analytical distribution will be set according to + the analytic distribution model. +3. When changing the employee, the analytical distribution will + be updated. diff --git a/hr_expense_employee_analytic_default/static/description/index.html b/hr_expense_employee_analytic_default/static/description/index.html index d01cb097..f6a8c6ef 100644 --- a/hr_expense_employee_analytic_default/static/description/index.html +++ b/hr_expense_employee_analytic_default/static/description/index.html @@ -370,8 +370,8 @@

Expense Employee Analytic Default

!! source digest: sha256:7ca70fd00344e3819c9e4182d3d93d46aaa252b6e7e0df780f5cab1bb48db091 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/hr-expense Translate me on Weblate Try me on Runboat

-

This module allows to create Analytic Defaults Rules for employees to be -applied to expenses.

+

This module allows to create Analytic Distribution Models for employees +to be applied to expenses.

Table of contents

    @@ -390,9 +390,11 @@

    Expense Employee Analytic Default

    Configuration

    To configure this module, you need to:

      +
    1. Enable the “Analytic Accounting” permission on the user
    2. Go to an employee (or create a new one) and set a work address
    3. -
    4. Go to Invocing > Configuration > Analytic default rules and create -a rule that has as partner the employee’s work address.
    5. +
    6. Go to Invocing > Configuration > Analytic Accounting |> Analytic +Distribution Models and create a record that has as partner the +employee’s work address.
@@ -400,10 +402,10 @@

Usage

To use this module, you need to:

  1. Go to Expenses and create a new one.
  2. -
  3. The analytical account and analytical tags will be set according to -the rule.
  4. -
  5. When changing the employee, the analytical account and analytical -tags will be updated.
  6. +
  7. The analytical distribution will be set according to the analytic +distribution model.
  8. +
  9. When changing the employee, the analytical distribution will be +updated.
diff --git a/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py b/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py index 4a4c7568..5a2efeae 100644 --- a/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py +++ b/hr_expense_employee_analytic_default/tests/test_hr_expense_employee_analytic_default.py @@ -1,53 +1,26 @@ # Copyright 2024 Tecnativa - Víctor Martínez # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo.tests import Form, common, new_test_user +from odoo.tests import Form, new_test_user +from odoo.addons.base.tests.common import BaseCommon -class TestHrExpenseEmployeeAnalyticDefault(common.TransactionCase): + +class TestHrExpenseEmployeeAnalyticDefault(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() - cls.env = cls.env( - context=dict( - cls.env.context, - mail_create_nolog=True, - mail_create_nosubscribe=True, - mail_notrack=True, - no_reset_password=True, - tracking_disable=True, - ) - ) - cls.user1 = new_test_user( - cls.env, - login="test_user_1", - ) + cls.user1 = new_test_user(cls.env, login="test_user_1") cls.user1.action_create_employee() - cls.work_address = cls.env["res.partner"].create( - { - "name": "Work address", - } - ) + cls.work_address = cls.env["res.partner"].create({"name": "Work address"}) cls.user1.employee_ids.address_id = cls.work_address - cls.user2 = new_test_user( - cls.env, - login="test_user_2", - ) + cls.user2 = new_test_user(cls.env, login="test_user_2") cls.user2.action_create_employee() + cls.plan = cls.env["account.analytic.plan"].create({"name": "Test plan"}) cls.analytic_account = cls.env["account.analytic.account"].create( { "name": "Test analytic account", - } - ) - cls.analytic_tag = cls.env["account.analytic.tag"].create( - {"name": "Test analytic tag"} - ) - cls.default_rule = cls.env["account.analytic.default"].create( - { - "analytic_id": cls.analytic_account.id, - "analytic_tag_ids": [(4, cls.analytic_tag.id)], - "partner_id": cls.work_address.id, - "date_start": "2023-01-01", + "plan_id": cls.plan.id, } ) cls.product = cls.env["product.product"].create( @@ -56,6 +29,13 @@ def setUpClass(cls): "can_be_expensed": True, } ) + cls.distribution = cls.env["account.analytic.distribution.model"].create( + { + "product_id": cls.product.id, + "partner_id": cls.work_address.id, + "analytic_distribution": {str(cls.analytic_account.id): 100.0}, + } + ) def test_hr_employee_1(self): """Create expense for employee 1 + change to employee 2.""" @@ -67,12 +47,16 @@ def test_hr_employee_1(self): expense_form.product_id = self.product expense_form.name = "Test" expense = expense_form.save() - self.assertEqual(expense.analytic_account_id, self.analytic_account) - self.assertIn(self.analytic_tag, expense.analytic_tag_ids) + self.assertEqual( + expense.analytic_distribution, self.distribution.analytic_distribution + ) + # As defined in _compute_analytic_distribution() of hr.expense, we need to + # leave the value empty because if there is no analytic distribution to apply, + # leave the value it had (maybe it is somewhat questionable). + expense.analytic_distribution = False expense_form.employee_id = self.user2.employee_ids expense = expense_form.save() - self.assertFalse(expense.analytic_account_id) - self.assertNotIn(self.analytic_tag, expense.analytic_tag_ids) + self.assertFalse(expense.analytic_distribution) def test_hr_employee_2(self): """Create expense for employee 2 + change to employee 1.""" @@ -84,9 +68,9 @@ def test_hr_employee_2(self): expense_form.product_id = self.product expense_form.name = "Test" expense = expense_form.save() - self.assertFalse(expense.analytic_account_id) - self.assertNotIn(self.analytic_tag, expense.analytic_tag_ids) + self.assertFalse(expense.analytic_distribution) expense_form.employee_id = self.user1.employee_ids expense = expense_form.save() - self.assertEqual(expense.analytic_account_id, self.analytic_account) - self.assertIn(self.analytic_tag, expense.analytic_tag_ids) + self.assertEqual( + expense.analytic_distribution, self.distribution.analytic_distribution + )