From 3d0e2a9ffb02de76d216cd0c62399ee39996e58e Mon Sep 17 00:00:00 2001 From: Kitti U Date: Wed, 8 Sep 2021 16:06:00 +0700 Subject: [PATCH 1/4] [14.0][ADD] account_asset_low_value --- account_asset_low_value/README.rst | 96 ++++ account_asset_low_value/__init__.py | 4 + account_asset_low_value/__manifest__.py | 19 + account_asset_low_value/models/__init__.py | 3 + .../models/account_asset.py | 76 +++ .../readme/CONTRIBUTORS.rst | 4 + .../readme/DESCRIPTION.rst | 8 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 438 ++++++++++++++++++ account_asset_low_value/tests/__init__.py | 3 + .../tests/test_asset_low_value.py | 81 ++++ .../views/account_asset_views.xml | 41 ++ account_asset_low_value/wizard/__init__.py | 1 + .../wizard/account_asset_remove.py | 17 + .../wizard/account_asset_remove.xml | 28 ++ 15 files changed, 819 insertions(+) create mode 100644 account_asset_low_value/README.rst create mode 100644 account_asset_low_value/__init__.py create mode 100644 account_asset_low_value/__manifest__.py create mode 100644 account_asset_low_value/models/__init__.py create mode 100644 account_asset_low_value/models/account_asset.py create mode 100644 account_asset_low_value/readme/CONTRIBUTORS.rst create mode 100644 account_asset_low_value/readme/DESCRIPTION.rst create mode 100644 account_asset_low_value/static/description/icon.png create mode 100644 account_asset_low_value/static/description/index.html create mode 100644 account_asset_low_value/tests/__init__.py create mode 100644 account_asset_low_value/tests/test_asset_low_value.py create mode 100644 account_asset_low_value/views/account_asset_views.xml create mode 100644 account_asset_low_value/wizard/__init__.py create mode 100644 account_asset_low_value/wizard/account_asset_remove.py create mode 100644 account_asset_low_value/wizard/account_asset_remove.xml diff --git a/account_asset_low_value/README.rst b/account_asset_low_value/README.rst new file mode 100644 index 000000000..a97dfbff0 --- /dev/null +++ b/account_asset_low_value/README.rst @@ -0,0 +1,96 @@ +=================================== +Assets Management - Low Value Asset +=================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |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%2Faccount--financial--tools-lightgray.png?logo=github + :target: https://github.com/OCA/account-financial-tools/tree/14.0/account_asset_low_value + :alt: OCA/account-financial-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-financial-tools-14-0/account-financial-tools-14-0-account_asset_low_value + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/92/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Low-Value Asset (LVA) are typically asset with low values and was booked as expense on vendor bill. +In essence, the low value asset is not really and asset but an expense need to tracke as asset. +As such, it has no residual value, run no depreciation. And when removed, only status is changed (no accounting entry). + +To create low value asset, use the Asset Profile with following setting, + +1. Asset Account = Expense (low value asset) +2. Number of Years = 0 + +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Ecosoft + +Contributors +~~~~~~~~~~~~ + +* `Ecosoft `__: + + * Kitti U. + * Pimolnat Suntian + +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-kittiu| image:: https://github.com/kittiu.png?size=40px + :target: https://github.com/kittiu + :alt: kittiu + +Current `maintainer `__: + +|maintainer-kittiu| + +This module is part of the `OCA/account-financial-tools `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_asset_low_value/__init__.py b/account_asset_low_value/__init__.py new file mode 100644 index 000000000..4d7a49b5e --- /dev/null +++ b/account_asset_low_value/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import models +from . import wizard diff --git a/account_asset_low_value/__manifest__.py b/account_asset_low_value/__manifest__.py new file mode 100644 index 000000000..d2deab5c3 --- /dev/null +++ b/account_asset_low_value/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Assets Management - Low Value Asset", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Ecosoft, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/account-financial-tools", + "category": "Accounting & Finance", + "depends": ["account_asset_management"], + "data": [ + "wizard/account_asset_remove.xml", + "views/account_asset_views.xml", + ], + "installable": True, + "maintainers": ["kittiu"], + "development_status": "Alpha", +} diff --git a/account_asset_low_value/models/__init__.py b/account_asset_low_value/models/__init__.py new file mode 100644 index 000000000..ecfd41418 --- /dev/null +++ b/account_asset_low_value/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import account_asset diff --git a/account_asset_low_value/models/account_asset.py b/account_asset_low_value/models/account_asset.py new file mode 100644 index 000000000..05551870c --- /dev/null +++ b/account_asset_low_value/models/account_asset.py @@ -0,0 +1,76 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models + + +class AccountAsset(models.Model): + _inherit = "account.asset" + + low_value = fields.Boolean( + string="Low Value Asset", + compute="_compute_low_value", + search="_search_low_value", + help="Low-Value Asset (LVA) is true when the asset profile set\n" + "1. Asset Account = Expense (low value asset)\n" + "2. Number of Years = 0 years\n" + "In essense, the low value asset is not really and asset but an expense " + "tracked as asset, as such, it has no residual value. And when removed, " + "only status is changed (no accounting entry).", + ) + + @api.depends("profile_id", "method_number") + def _compute_low_value(self): + expense_account = self.env.ref("account.data_account_type_expenses") + for asset in self: + asset.low_value = ( + asset.profile_id.account_asset_id.user_type_id == expense_account + and asset.method_number == 0 + ) + + @api.model + def _search_low_value(self, operator, value): + expense_account = self.env.ref("account.data_account_type_expenses") + if operator == "=": + return [ + ("profile_id.account_asset_id.user_type_id", "=", expense_account.id), + ("method_number", "=", 0), + ] + if operator == "!=": + return [ + "|", + ("profile_id.account_asset_id.user_type_id", "!=", expense_account.id), + ("method_number", "!=", 0), + ] + + def _compute_depreciation(self): + super()._compute_depreciation() + # For low value asset, there is no depreciation + for asset in self: + if asset.low_value: + asset.value_residual = 0 + + def validate(self): + res = super().validate() + # For low value asset, state = "open" even value_residual = 0 + for asset in self: + if asset.low_value: + asset.state = "open" + return res + + def remove(self): + self.ensure_one() + ctx = dict(self.env.context, active_ids=self.ids, active_id=self.id) + # Removing low value asset, use different wizard + if self.low_value: + view = self.env.ref("account_asset_low_value.asset_low_value_remove_form") + return { + "name": _("Remove Low Value Asset"), + "view_mode": "form", + "res_model": "account.asset.remove", + "view_id": view.id, + "target": "new", + "type": "ir.actions.act_window", + "context": ctx, + } + return super().remove() diff --git a/account_asset_low_value/readme/CONTRIBUTORS.rst b/account_asset_low_value/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..b64335f20 --- /dev/null +++ b/account_asset_low_value/readme/CONTRIBUTORS.rst @@ -0,0 +1,4 @@ +* `Ecosoft `__: + + * Kitti U. + * Pimolnat Suntian diff --git a/account_asset_low_value/readme/DESCRIPTION.rst b/account_asset_low_value/readme/DESCRIPTION.rst new file mode 100644 index 000000000..f9ecf423e --- /dev/null +++ b/account_asset_low_value/readme/DESCRIPTION.rst @@ -0,0 +1,8 @@ +Low-Value Asset (LVA) are typically asset with low values and was booked as expense on vendor bill. +In essence, the low value asset is not really and asset but an expense need to tracke as asset. +As such, it has no residual value, run no depreciation. And when removed, only status is changed (no accounting entry). + +To create low value asset, use the Asset Profile with following setting, + +1. Asset Account = Expense (low value asset) +2. Number of Years = 0 diff --git a/account_asset_low_value/static/description/icon.png b/account_asset_low_value/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_asset_low_value/static/description/index.html b/account_asset_low_value/static/description/index.html new file mode 100644 index 000000000..e73fecb49 --- /dev/null +++ b/account_asset_low_value/static/description/index.html @@ -0,0 +1,438 @@ + + + + + + +Assets Management - Low Value Asset + + + +
+

Assets Management - Low Value Asset

+ + +

Alpha License: AGPL-3 OCA/account-financial-tools Translate me on Weblate Try me on Runbot

+

Low-Value Asset (LVA) are typically asset with low values and was booked as expense on vendor bill. +In essence, the low value asset is not really and asset but an expense need to tracke as asset. +As such, it has no residual value, run no depreciation. And when removed, only status is changed (no accounting entry).

+

To create low value asset, use the Asset Profile with following setting,

+
    +
  1. Asset Account = Expense (low value asset)
  2. +
  3. Number of Years = 0
  4. +
+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Ecosoft
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

kittiu

+

This module is part of the OCA/account-financial-tools project on GitHub.

+

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

+
+
+
+ + diff --git a/account_asset_low_value/tests/__init__.py b/account_asset_low_value/tests/__init__.py new file mode 100644 index 000000000..544e8be16 --- /dev/null +++ b/account_asset_low_value/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import test_asset_low_value diff --git a/account_asset_low_value/tests/test_asset_low_value.py b/account_asset_low_value/tests/test_asset_low_value.py new file mode 100644 index 000000000..6295a5123 --- /dev/null +++ b/account_asset_low_value/tests/test_asset_low_value.py @@ -0,0 +1,81 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields +from odoo.tests import tagged +from odoo.tests.common import Form + +from odoo.addons.account.tests.common import AccountTestInvoicingCommon + + +@tagged("post_install", "-at_install") +class TestAssetLowValue(AccountTestInvoicingCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.asset_model = cls.env["account.asset"] + cls.asset_profile_model = cls.env["account.asset.profile"] + cls.remove_model = cls.env["account.asset.remove"] + # Low value asset profile + expense_account = cls.company_data["default_account_expense"] + cls.profile_low_value = cls.asset_profile_model.create( + { + "account_expense_depreciation_id": expense_account.id, + "account_asset_id": expense_account.id, + "account_depreciation_id": expense_account.id, + "account_residual_value_id": expense_account.id, + "journal_id": cls.company_data["default_journal_purchase"].id, + "name": "Asset Low Value", + "method_time": "year", + "method_number": 0, + "method_period": "year", + } + ) + + # Invoice + cls.partner = cls.env["res.partner"].create({"name": "Test Partner"}) + cls.product = cls.env["product.product"].create( + {"name": "Test", "standard_price": 500.0} + ) + move_form = Form( + cls.env["account.move"].with_context( + default_move_type="in_invoice", check_move_validity=False + ) + ) + move_form.invoice_date = fields.Date.context_today(cls.env.user) + move_form.partner_id = cls.partner + with move_form.invoice_line_ids.new() as line_form: + line_form.name = "test" + line_form.product_id = cls.product + line_form.price_unit = 2000.00 + line_form.quantity = 1 + cls.invoice = move_form.save() + + def test_01_asset_low_value(self): + invoice = self.invoice + move_form = Form(invoice) + with move_form.invoice_line_ids.edit(0) as line_form: + line_form.asset_profile_id = self.profile_low_value + invoice = move_form.save() + invoice.action_post() + asset = invoice.invoice_line_ids.mapped("asset_id") + move_count = len(asset.account_move_line_ids) + self.assertTrue(asset.low_value) + asset.validate() + + self.assertEqual(asset.value_residual, 0) + self.assertEqual(asset.state, "open") + asset.remove() + remove_model = self.env["account.asset.remove"].with_context(active_id=asset.id) + with Form(remove_model) as f: + f.posting_regime = "residual_value" + remove = f.save() + remove.remove() + self.assertEqual(asset.state, "removed") + self.assertEqual( + len(asset.account_move_line_ids), move_count + ) # no new account moves + # Search test + low_value_assets = self.asset_model.search([("low_value", "=", True)]) + self.assertIn(asset, low_value_assets) + normal_assets = self.asset_model.search([("low_value", "!=", True)]) + self.assertNotIn(asset, normal_assets) diff --git a/account_asset_low_value/views/account_asset_views.xml b/account_asset_low_value/views/account_asset_views.xml new file mode 100644 index 000000000..beb0e83a4 --- /dev/null +++ b/account_asset_low_value/views/account_asset_views.xml @@ -0,0 +1,41 @@ + + + account.asset.form + account.asset + + + + + + + + + account.asset.search + account.asset + + + + + + + + + + diff --git a/account_asset_low_value/wizard/__init__.py b/account_asset_low_value/wizard/__init__.py new file mode 100644 index 000000000..5b4df2eb4 --- /dev/null +++ b/account_asset_low_value/wizard/__init__.py @@ -0,0 +1 @@ +from . import account_asset_remove diff --git a/account_asset_low_value/wizard/account_asset_remove.py b/account_asset_low_value/wizard/account_asset_remove.py new file mode 100644 index 000000000..51dfd6251 --- /dev/null +++ b/account_asset_low_value/wizard/account_asset_remove.py @@ -0,0 +1,17 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AccountAssetRemove(models.TransientModel): + _inherit = "account.asset.remove" + + def remove(self): + self.ensure_one() + asset_id = self.env.context.get("active_id") + asset = self.env["account.asset"].browse(asset_id) + if asset.low_value: + asset.write({"state": "removed", "date_remove": self.date_remove}) + return True + return super().remove() diff --git a/account_asset_low_value/wizard/account_asset_remove.xml b/account_asset_low_value/wizard/account_asset_remove.xml new file mode 100644 index 000000000..ab16e3387 --- /dev/null +++ b/account_asset_low_value/wizard/account_asset_remove.xml @@ -0,0 +1,28 @@ + + + asset.low.value.remove.form + account.asset.remove + + +
+ + + + + + + + +
+
+
+
+
+
From 53954b7dac45d88fd4c8b98a009b7a2d34f5f6ad Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 19 Oct 2022 05:23:31 +0000 Subject: [PATCH 2/4] [UPD] Update account_asset_low_value.pot --- .../i18n/account_asset_low_value.pot | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 account_asset_low_value/i18n/account_asset_low_value.pot diff --git a/account_asset_low_value/i18n/account_asset_low_value.pot b/account_asset_low_value/i18n/account_asset_low_value.pot new file mode 100644 index 000000000..319f140de --- /dev/null +++ b/account_asset_low_value/i18n/account_asset_low_value.pot @@ -0,0 +1,74 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_asset_low_value +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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: account_asset_low_value +#: model:ir.model,name:account_asset_low_value.model_account_asset +msgid "Asset" +msgstr "" + +#. module: account_asset_low_value +#: model_terms:ir.ui.view,arch_db:account_asset_low_value.asset_low_value_remove_form +msgid "Cancel" +msgstr "" + +#. module: account_asset_low_value +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset__display_name +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset_remove__display_name +msgid "Display Name" +msgstr "" + +#. module: account_asset_low_value +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset__id +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset_remove__id +msgid "ID" +msgstr "" + +#. module: account_asset_low_value +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset____last_update +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset_remove____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_asset_low_value +#: model:ir.model.fields,field_description:account_asset_low_value.field_account_asset__low_value +#: model_terms:ir.ui.view,arch_db:account_asset_low_value.account_asset_view_search +msgid "Low Value Asset" +msgstr "" + +#. module: account_asset_low_value +#: model:ir.model.fields,help:account_asset_low_value.field_account_asset__low_value +msgid "" +"Low-Value Asset (LVA) is true when the asset profile set\n" +"1. Asset Account = Expense (low value asset)\n" +"2. Number of Years = 0 years\n" +"In essense, the low value asset is not really and asset but an expense tracked as asset, as such, it has no residual value. And when removed, only status is changed (no accounting entry)." +msgstr "" + +#. module: account_asset_low_value +#: model_terms:ir.ui.view,arch_db:account_asset_low_value.account_asset_view_search +msgid "Normal Asset" +msgstr "" + +#. module: account_asset_low_value +#: model:ir.model,name:account_asset_low_value.model_account_asset_remove +#: model_terms:ir.ui.view,arch_db:account_asset_low_value.asset_low_value_remove_form +msgid "Remove Asset" +msgstr "" + +#. module: account_asset_low_value +#: code:addons/account_asset_low_value/models/account_asset.py:0 +#, python-format +msgid "Remove Low Value Asset" +msgstr "" From 22a3336ca88c6f0f2cb5ffe52d2c4de103c629ca Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 19 Oct 2022 05:31:48 +0000 Subject: [PATCH 3/4] [UPD] README.rst --- account_asset_low_value/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/account_asset_low_value/static/description/index.html b/account_asset_low_value/static/description/index.html index e73fecb49..c3b425564 100644 --- a/account_asset_low_value/static/description/index.html +++ b/account_asset_low_value/static/description/index.html @@ -3,7 +3,7 @@ - + Assets Management - Low Value Asset