[MIG] account_asset_management: Migration to 13.0

This commit is contained in:
ernestotejeda
2020-01-29 12:37:08 -05:00
committed by Pedro M. Baeza
parent ebe0b9f152
commit b7637cbe45
35 changed files with 385 additions and 1328 deletions

View File

@@ -9,4 +9,4 @@ line_length=88
known_odoo=odoo
known_odoo_addons=odoo.addons
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
known_third_party=dateutil,openupgradelib,psycopg2,setuptools
known_third_party=dateutil,setuptools

View File

@@ -14,13 +14,13 @@ Assets Management
: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/12.0/account_asset_management
:target: https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management
: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-12-0/account-financial-tools-12-0-account_asset_management
:target: https://translation.odoo-community.org/projects/account-financial-tools-13-0/account-financial-tools-13-0-account_asset_management
: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/12.0
:target: https://runbot.odoo-community.org/runbot/92/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -44,12 +44,6 @@ the standard account_asset module from Odoo.
.. contents::
:local:
Configuration
=============
It is recommended to configure your Purchase Journal with "Group Invoice Lines" to avoid the
creation of separate assets per Supplier Invoice Line.
Usage
=====
@@ -58,6 +52,23 @@ The module in NOT compatible with the standard account_asset module.
Changelog
=========
13.0.1.0.0 (2019-10-21)
~~~~~~~~~~~~~~~~~~~~~~~
* Python code and views were adapted to be compatible with v13.
* When assets are created through accounting journal items,
they are created when the journal items is posted.
* When a Bill Invoice is created or modified, at the time it is saved,
for each line that has an Asset profile and Quantity 'N'
greater than 1, it will be replaced by 'N' lines identical to it but
with quantity 1. This was done to maintain the same behavior as in
the previous version, in which for each asset created there is a
Journal Item. In addition, this solution does not change the data
model which does not cause migration scripts.
* The configuration option was removed so the only function of that is to
allow the module to be uninstalled by unchecking that configuration option.
* Tests were adapted.
12.0.2.1.0 (2019-10-21)
~~~~~~~~~~~~~~~~~~~~~~~
@@ -75,7 +86,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/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 <https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
`feedback <https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
@@ -90,17 +101,21 @@ Authors
Contributors
~~~~~~~~~~~~
- OpenERP SA
- Luc De Meyer (Noviat)
- Frédéric Clementi (camptocamp)
- Florian Dacosta (Akretion)
- Stéphane Bidoul (Acsone)
- Adrien Peiffer (Acsone)
- Akim Juillerat <akim.juillerat@camptocamp.com>
- Henrik Norlin (Apps2GROW)
- Maxence Groine <mgroine@fiefmanage.ch>
- Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
- Saran Lim. <saranl@ecosoft.co.th>
* OpenERP SA
* Luc De Meyer (Noviat)
* Frédéric Clementi (camptocamp)
* Florian Dacosta (Akretion)
* Stéphane Bidoul (Acsone)
* Adrien Peiffer (Acsone)
* Akim Juillerat <akim.juillerat@camptocamp.com>
* Henrik Norlin (Apps2GROW)
* Maxence Groine <mgroine@fiefmanage.ch>
* Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
* Saran Lim. <saranl@ecosoft.co.th>
* `Tecnativa <https://www.tecnativa.com>`_:
* Ernesto Tejeda
* Pedro M. Baeza
Maintainers
~~~~~~~~~~~
@@ -115,6 +130,6 @@ 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.
This module is part of the `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/12.0/account_asset_management>`_ project on GitHub.
This module is part of the `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -4,11 +4,12 @@
{
"name": "Assets Management",
"version": "12.0.2.1.3",
"version": "13.0.1.0.0",
"license": "AGPL-3",
"depends": ["account"],
"excludes": ["account_asset"],
"author": "Noviat,Odoo Community Association (OCA)",
"external_dependencies": {"python": ["python-dateutil"]},
"author": "Noviat, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/account-financial-tools",
"category": "Accounting & Finance",
"data": [
@@ -20,9 +21,6 @@
"views/account_asset.xml",
"views/account_asset_group.xml",
"views/account_asset_profile.xml",
"views/res_config_settings.xml",
"views/account_invoice.xml",
"views/account_invoice_line.xml",
"views/account_move.xml",
"views/account_move_line.xml",
"views/menuitem.xml",

View File

@@ -1,157 +0,0 @@
Done after the analysis:
NEW model account.asset.group
NEW field account.asset group_id
NEW field account.asset.profile group_id
account.asset date_start required
account.asset profile_id required
---Fields in module 'account_asset_management'---
account_asset / account.asset.asset / category_id (many2one) : DEL relation: account.asset.category, required
account_asset / account.asset.asset / currency_id (many2one) : DEL relation: res.currency, required, req_default: function
account_asset / account.asset.asset / date (date) : DEL required, req_default: function
account_asset / account.asset.asset / depreciation_line_ids (one2many): relation is now 'account.asset.line' ('account.asset.depreciation.line') [nothing to do]
account_asset / account.asset.asset / invoice_id (many2one) : DEL relation: account.invoice
account_asset / account.asset.asset / message_follower_ids (one2many): DEL relation: mail.followers
account_asset / account.asset.asset / message_ids (one2many) : DEL relation: mail.message
account_asset / account.asset.asset / message_last_post (datetime) : DEL
account_asset / account.asset.asset / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']')
account_asset / account.asset.asset / method_period (integer) : selection_keys is now 'function' ('False')
account_asset / account.asset.asset / method_period (integer) : type is now 'selection' ('integer')
account_asset / account.asset.asset / method_time (selection) : selection_keys is now 'function' ('['end', 'number']')
account_asset / account.asset.asset / state (selection) : selection_keys is now '['close', 'draft', 'open', 'removed']' ('['close', 'draft', 'open']')
account_asset / account.asset.asset / type (selection) : DEL required
account_asset / account.asset.asset / value (float) : DEL required
account_asset / account.asset.asset / value_residual (float) : is now stored
account_asset / account.asset.asset / website_message_ids (one2many): DEL relation: mail.message
account_asset / account.asset.category / account_depreciation_expense_id (many2one): DEL relation: account.account, required
account_asset / account.asset.category / group_entries (boolean) : DEL
account_asset / account.asset.category / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']')
account_asset / account.asset.category / method_end (date) : DEL
account_asset / account.asset.category / method_period (integer) : selection_keys is now 'function' ('False')
account_asset / account.asset.category / method_period (integer) : type is now 'selection' ('integer')
account_asset / account.asset.category / method_time (selection) : selection_keys is now 'function' ('['end', 'number']')
account_asset / account.asset.category / type (selection) : DEL required, selection_keys: ['purchase', 'sale'], req_default: function
account_asset / account.asset.depreciation.line / asset_id (many2one) : relation is now 'account.asset' ('account.asset.asset') [nothing to do]
account_asset / account.asset.depreciation.line / depreciated_value (float) : now a function
account_asset / account.asset.depreciation.line / depreciation_date (date) : DEL
account_asset / account.asset.depreciation.line / move_posted_check (boolean) : DEL
account_asset / account.asset.depreciation.line / remaining_value (float) : now a function
account_asset / account.asset.depreciation.line / sequence (integer) : DEL required
account_asset / account.invoice.line / asset_category_id (many2one) : DEL relation: account.asset.category
account_asset / account.invoice.line / asset_end_date (date) : DEL
account_asset / account.invoice.line / asset_mrr (float) : DEL
account_asset / account.invoice.line / asset_start_date (date) : DEL
account_asset / account.move / asset_depreciation_ids (one2many): DEL relation: account.asset.depreciation.line
account_asset / product.template / asset_category_id (many2one) : DEL relation: account.asset.category
account_asset / product.template / deferred_revenue_category_id (many2one): DEL relation: account.asset.category
account_asset_management / account.account / asset_profile_id (many2one) : NEW relation: account.asset.profile
account_asset_management / account.asset / account_analytic_id (many2one): NEW relation: account.analytic.account
account_asset_management / account.asset / account_move_line_ids (one2many): NEW relation: account.move.line
account_asset_management / account.asset / company_currency_id (many2one): NEW relation: res.currency, isrelated: related, stored
account_asset_management / account.asset / date_remove (date) : NEW
account_asset_management / account.asset / date_start (date) : NEW
account_asset_management / account.asset / depreciation_base (float) : NEW isfunction: function, stored
account_asset_management / account.asset / profile_id (many2one) : NEW relation: account.asset.profile
account_asset_management / account.asset / purchase_value (float) : NEW required
account_asset_management / account.asset / value_depreciated (float) : NEW isfunction: function, stored
account_asset_management / account.asset.line / init_entry (boolean) : NEW
account_asset_management / account.asset.line / line_date (date) : NEW required
account_asset_management / account.asset.line / previous_id (many2one) : NEW relation: account.asset.line
account_asset_management / account.asset.line / type (selection) : NEW selection_keys: ['create', 'depreciate', 'remove'], hasdefault
account_asset_management / account.asset.profile / account_expense_depreciation_id (many2one): NEW relation: account.account, required
account_asset_management / account.asset.profile / account_min_value_id (many2one): NEW relation: account.account
account_asset_management / account.asset.profile / account_plus_value_id (many2one): NEW relation: account.account
account_asset_management / account.asset.profile / account_residual_value_id (many2one): NEW relation: account.account
account_asset_management / account.asset.profile / asset_product_item (boolean) : NEW
account_asset_management / account.asset.profile / note (text) : NEW
account_asset_management / account.asset.recompute.trigger / company_id (many2one) : NEW relation: res.company, required
account_asset_management / account.asset.recompute.trigger / date_completed (datetime) : NEW
account_asset_management / account.asset.recompute.trigger / date_trigger (datetime) : NEW
account_asset_management / account.asset.recompute.trigger / reason (char) : NEW required
account_asset_management / account.asset.recompute.trigger / state (selection) : NEW selection_keys: ['done', 'open'], hasdefault
account_asset_management / account.invoice.line / asset_id (many2one) : NEW relation: account.asset
account_asset_management / account.invoice.line / asset_profile_id (many2one) : NEW relation: account.asset.profile
account_asset_management / account.move.line / asset_id (many2one) : NEW relation: account.asset
account_asset_management / account.move.line / asset_profile_id (many2one) : NEW relation: account.asset.profile
---XML records in module 'account_asset_management'---
NEW ir.actions.act_window: account_asset_management.account_asset_action
NEW ir.actions.act_window: account_asset_management.account_asset_compute_action
NEW ir.actions.act_window: account_asset_management.account_asset_profile_action
NEW ir.actions.act_window: account_asset_management.act_entries_open
DEL ir.actions.act_window: account_asset.action_account_asset_asset_form
DEL ir.actions.act_window: account_asset.action_account_asset_asset_list_normal_purchase
DEL ir.actions.act_window: account_asset.action_asset_asset_report
DEL ir.actions.act_window: account_asset.action_asset_depreciation_confirmation_wizard
DEL ir.actions.act_window: account_asset.action_asset_modify
DEL ir.cron: account_asset.account_asset_cron
NEW ir.model.access: account_asset_management.access_account_asset_invoice
NEW ir.model.access: account_asset_management.access_account_asset_line_invoice
NEW ir.model.access: account_asset_management.access_account_asset_line_manager
NEW ir.model.access: account_asset_management.access_account_asset_line_user
NEW ir.model.access: account_asset_management.access_account_asset_manager
NEW ir.model.access: account_asset_management.access_account_asset_profile_invoice
NEW ir.model.access: account_asset_management.access_account_asset_profile_manager
NEW ir.model.access: account_asset_management.access_account_asset_profile_user
NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_manager
NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_user
NEW ir.model.access: account_asset_management.access_account_asset_user
DEL ir.model.access: account_asset.access_account_asset_asset
DEL ir.model.access: account_asset.access_account_asset_asset_invoicing_payment
DEL ir.model.access: account_asset.access_account_asset_asset_manager
DEL ir.model.access: account_asset.access_account_asset_category
DEL ir.model.access: account_asset.access_account_asset_category_invoicing_payment
DEL ir.model.access: account_asset.access_account_asset_category_manager
DEL ir.model.access: account_asset.access_account_asset_depreciation_line
DEL ir.model.access: account_asset.access_account_asset_depreciation_line_invoicing_payment
DEL ir.model.access: account_asset.access_account_asset_depreciation_line_manager
DEL ir.model.access: account_asset.access_asset_asset_report
DEL ir.model.access: account_asset.access_asset_asset_report_manager
NEW ir.rule: account_asset_management.account_asset_multi_company_rule (noupdate)
NEW ir.rule: account_asset_management.account_asset_profile_multi_company_rule (noupdate)
DEL ir.rule: account_asset.account_asset_asset_multi_company_rule (noupdate)
DEL ir.rule: account_asset.account_asset_category_multi_company_rule (noupdate)
NEW ir.ui.menu: account_asset_management.account_asset_compute_menu
NEW ir.ui.menu: account_asset_management.account_asset_menu
NEW ir.ui.menu: account_asset_management.account_asset_profile_menu
NEW ir.ui.menu: account_asset_management.menu_finance_assets
NEW ir.ui.menu: account_asset_management.menu_finance_config_assets
DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_form
DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_list_normal_purchase
DEL ir.ui.menu: account_asset.menu_action_asset_asset_report
DEL ir.ui.menu: account_asset.menu_asset_depreciation_confirmation_wizard
DEL ir.ui.menu: account_asset.menu_finance_config_assets
NEW ir.ui.view: account_asset_management.account_asset_compute_view_form
NEW ir.ui.view: account_asset_management.account_asset_compute_view_form_result
NEW ir.ui.view: account_asset_management.account_asset_profile_view_form
NEW ir.ui.view: account_asset_management.account_asset_profile_view_search
NEW ir.ui.view: account_asset_management.account_asset_profile_view_tree
NEW ir.ui.view: account_asset_management.account_asset_remove_view_form
NEW ir.ui.view: account_asset_management.account_asset_view_form
NEW ir.ui.view: account_asset_management.account_asset_view_search
NEW ir.ui.view: account_asset_management.account_asset_view_tree
NEW ir.ui.view: account_asset_management.invoice_form
NEW ir.ui.view: account_asset_management.invoice_supplier_form
NEW ir.ui.view: account_asset_management.res_config_settings_view_form
NEW ir.ui.view: account_asset_management.view_account_form
NEW ir.ui.view: account_asset_management.view_account_move_line_filter
NEW ir.ui.view: account_asset_management.view_invoice_line_form
NEW ir.ui.view: account_asset_management.view_move_form
NEW ir.ui.view: account_asset_management.view_move_line_form
DEL ir.ui.view: account_asset.action_account_asset_report_graph
DEL ir.ui.view: account_asset.action_account_asset_report_pivot
DEL ir.ui.view: account_asset.asset_modify_form
DEL ir.ui.view: account_asset.assets_backend
DEL ir.ui.view: account_asset.qunit_suite
DEL ir.ui.view: account_asset.res_config_settings_view_form
DEL ir.ui.view: account_asset.view_account_asset_asset_category_kanban
DEL ir.ui.view: account_asset.view_account_asset_asset_form
DEL ir.ui.view: account_asset.view_account_asset_asset_kanban
DEL ir.ui.view: account_asset.view_account_asset_asset_purchase_tree
DEL ir.ui.view: account_asset.view_account_asset_category_form
DEL ir.ui.view: account_asset.view_account_asset_category_search
DEL ir.ui.view: account_asset.view_account_asset_category_tree
DEL ir.ui.view: account_asset.view_account_asset_search
DEL ir.ui.view: account_asset.view_asset_asset_report_search
DEL ir.ui.view: account_asset.view_asset_depreciation_confirmation_wizard
DEL ir.ui.view: account_asset.view_invoice_asset_category
DEL ir.ui.view: account_asset.view_product_template_form_inherit

View File

@@ -1,201 +0,0 @@
Done after the analysis:
NEW model account.asset.group
NEW field account.asset group_id
NEW field account.asset.profile group_id
account.asset date_start required
account.asset profile_id required
# TODO: account.asset of type 'view' (archived): set date_start & profile_id
---Fields in module 'account_asset_management'---
account_asset / account.asset.asset / category_id (many2one) : DEL relation: account.asset.category, required
# renamed to profile_id
account_asset / account.asset.asset / currency_id (many2one) : DEL relation: res.currency, required, req_default: function
# renamed to company_currency_id
account_asset / account.asset.asset / date (date) : DEL required, req_default: function
# renamed to date_start
account_asset / account.asset.asset / depreciation_line_ids (one2many): relation is now 'account.asset.line' ('account.asset.depreciation.line') [nothing to do]
account_asset / account.asset.asset / invoice_id (many2one) : DEL relation: account.invoice
# DEL
account_asset / account.asset.asset / message_follower_ids (one2many): DEL relation: mail.followers
# DEL
account_asset / account.asset.asset / message_ids (one2many) : DEL relation: mail.message
# DEL
account_asset / account.asset.asset / message_last_post (datetime) : DEL
# DEL
account_asset / account.asset.asset / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']')
# TODO: LOG WARNING IF METHOD IS NOT linear OR degressive
account_asset / account.asset.asset / method_period (integer) : selection_keys is now 'function' ('False')
account_asset / account.asset.asset / method_period (integer) : type is now 'selection' ('integer')
# renamed method_number to method_number_11 (11.0: Number of depreciations, 12.0: Number of years)
# renamed method_period to method_period_11 (11.0: Number of months in a period, 12.0: Period Length: year/quarter/month)
# TODO: LOG WARNING IF method_period_11 is other than (1, 3, 12)
account_asset / account.asset.asset / method_time (selection) : selection_keys is now 'function' ('['end', 'number']')
account_asset / account.asset.asset / state (selection) : selection_keys is now '['close', 'draft', 'open', 'removed']' ('['close', 'draft', 'open']')
account_asset / account.asset.asset / type (selection) : DEL required
# DEL
account_asset / account.asset.asset / value (float) : DEL required
# renamed to purchase_value
account_asset / account.asset.asset / value_residual (float) : is now stored
account_asset / account.asset.asset / website_message_ids (one2many): DEL relation: mail.message
# DEL
account_asset / account.asset.category / account_depreciation_expense_id (many2one): DEL relation: account.account, required
# renamed to account_expense_depreciation_id
account_asset / account.asset.category / group_entries (boolean) : DEL
# DEL
account_asset / account.asset.category / method (selection) : selection_keys is now 'function' ('['degressive', 'linear']')
# TODO: LOG WARNING IF METHOD IS NOT linear OR degressive
account_asset / account.asset.category / method_end (date) : DEL
# DEL
account_asset / account.asset.category / method_period (integer) : selection_keys is now 'function' ('False')
account_asset / account.asset.category / method_period (integer) : type is now 'selection' ('integer')
# renamed method_number to method_number_11 (11.0: Number of depreciations, 12.0: Number of years)
# renamed method_period to method_period_11 (11.0: Number of months in a period, 12.0: Period Length: year/quarter/month)
# TODO: LOG WARNING IF method_period_11 is other than (1, 3, 12)
account_asset / account.asset.category / method_time (selection) : selection_keys is now 'function' ('['end', 'number']')
account_asset / account.asset.category / type (selection) : DEL required, selection_keys: ['purchase', 'sale'], req_default: function
# DEL
account_asset / account.asset.depreciation.line / asset_id (many2one) : relation is now 'account.asset' ('account.asset.asset') [nothing to do]
account_asset / account.asset.depreciation.line / depreciated_value (float) : now a function
account_asset / account.asset.depreciation.line / depreciation_date (date) : DEL
# renamed to line_date
account_asset / account.asset.depreciation.line / move_posted_check (boolean) : DEL
# DEL
account_asset / account.asset.depreciation.line / remaining_value (float) : now a function
account_asset / account.asset.depreciation.line / sequence (integer) : DEL required
# DEL
account_asset / account.invoice.line / asset_category_id (many2one) : DEL relation: account.asset.category
# renamed to asset_profile_id
account_asset / account.invoice.line / asset_end_date (date) : DEL
# DEL
account_asset / account.invoice.line / asset_mrr (float) : DEL
# DEL
account_asset / account.invoice.line / asset_start_date (date) : DEL
# DEL
account_asset / account.move / asset_depreciation_ids (one2many): DEL relation: account.asset.depreciation.line
# DEL
account_asset / product.template / asset_category_id (many2one) : DEL relation: account.asset.category
# DEL
account_asset / product.template / deferred_revenue_category_id (many2one): DEL relation: account.asset.category
# DEL
account_asset_management / account.account / asset_profile_id (many2one) : NEW relation: account.asset.profile
account_asset_management / account.asset / account_analytic_id (many2one): NEW relation: account.analytic.account
# get from profile_id.account_analytic_id
account_asset_management / account.asset / account_move_line_ids (one2many): NEW relation: account.move.line
account_asset_management / account.asset / child_ids (one2many) : NEW relation: account.asset
account_asset_management / account.asset / company_currency_id (many2one): NEW relation: res.currency, isrelated: related, stored
# renamed from currency_id
account_asset_management / account.asset / date_remove (date) : NEW
account_asset_management / account.asset / date_start (date) : NEW
# renamed from date
account_asset_management / account.asset / depreciation_base (float) : NEW isfunction: function, stored
account_asset_management / account.asset / profile_id (many2one) : NEW relation: account.asset.profile
# renamed from category_id
account_asset_management / account.asset / purchase_value (float) : NEW required
# renamed from value
account_asset_management / account.asset / value_depreciated (float) : NEW isfunction: function, stored
account_asset_management / account.asset.line / init_entry (boolean) : NEW
account_asset_management / account.asset.line / line_date (date) : NEW required
# renamed from depreciation_date
account_asset_management / account.asset.line / previous_id (many2one) : NEW relation: account.asset.line
account_asset_management / account.asset.line / type (selection) : NEW selection_keys: ['create', 'depreciate', 'remove'], hasdefault
account_asset_management / account.asset.profile / account_expense_depreciation_id (many2one): NEW relation: account.account, required
# renamed from account_depreciation_expense_id
account_asset_management / account.asset.profile / account_min_value_id (many2one): NEW relation: account.account
account_asset_management / account.asset.profile / account_plus_value_id (many2one): NEW relation: account.account
account_asset_management / account.asset.profile / account_residual_value_id (many2one): NEW relation: account.account
account_asset_management / account.asset.profile / asset_product_item (boolean) : NEW
account_asset_management / account.asset.profile / note (text) : NEW
account_asset_management / account.asset.recompute.trigger / company_id (many2one) : NEW relation: res.company, required
account_asset_management / account.asset.recompute.trigger / date_completed (datetime) : NEW
account_asset_management / account.asset.recompute.trigger / date_trigger (datetime) : NEW
account_asset_management / account.asset.recompute.trigger / reason (char) : NEW required
account_asset_management / account.asset.recompute.trigger / state (selection) : NEW selection_keys: ['done', 'open'], hasdefault
account_asset_management / account.invoice.line / asset_id (many2one) : NEW relation: account.asset
account_asset_management / account.invoice.line / asset_profile_id (many2one) : NEW relation: account.asset.profile
# renamed from asset_category_id
account_asset_management / account.move.line / asset_id (many2one) : NEW relation: account.asset
# get from account.asset.line (asset_id, move_id)
account_asset_management / account.move.line / asset_profile_id (many2one) : NEW relation: account.asset.profile
# get from account.asset.line (asset_id, move_id, profile_id)
---XML records in module 'account_asset_management'---
NEW ir.actions.act_window: account_asset_management.account_asset_action
NEW ir.actions.act_window: account_asset_management.account_asset_compute_action
NEW ir.actions.act_window: account_asset_management.account_asset_profile_action
NEW ir.actions.act_window: account_asset_management.act_entries_open
DEL ir.actions.act_window: account_asset.action_account_asset_asset_form
DEL ir.actions.act_window: account_asset.action_account_asset_asset_list_normal_purchase
DEL ir.actions.act_window: account_asset.action_asset_asset_report
DEL ir.actions.act_window: account_asset.action_asset_depreciation_confirmation_wizard
DEL ir.actions.act_window: account_asset.action_asset_modify
DEL ir.cron: account_asset.account_asset_cron
NEW ir.model.access: account_asset_management.access_account_asset_invoice
NEW ir.model.access: account_asset_management.access_account_asset_line_invoice
NEW ir.model.access: account_asset_management.access_account_asset_line_manager
NEW ir.model.access: account_asset_management.access_account_asset_line_user
NEW ir.model.access: account_asset_management.access_account_asset_manager
NEW ir.model.access: account_asset_management.access_account_asset_profile_invoice
NEW ir.model.access: account_asset_management.access_account_asset_profile_manager
NEW ir.model.access: account_asset_management.access_account_asset_profile_user
NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_manager
NEW ir.model.access: account_asset_management.access_account_asset_recompute_trigger_user
NEW ir.model.access: account_asset_management.access_account_asset_user
DEL ir.model.access: account_asset.access_account_asset_asset
DEL ir.model.access: account_asset.access_account_asset_asset_invoicing_payment
DEL ir.model.access: account_asset.access_account_asset_asset_manager
DEL ir.model.access: account_asset.access_account_asset_category
DEL ir.model.access: account_asset.access_account_asset_category_invoicing_payment
DEL ir.model.access: account_asset.access_account_asset_category_manager
DEL ir.model.access: account_asset.access_account_asset_depreciation_line
DEL ir.model.access: account_asset.access_account_asset_depreciation_line_invoicing_payment
DEL ir.model.access: account_asset.access_account_asset_depreciation_line_manager
DEL ir.model.access: account_asset.access_asset_asset_report
DEL ir.model.access: account_asset.access_asset_asset_report_manager
NEW ir.rule: account_asset_management.account_asset_multi_company_rule (noupdate)
NEW ir.rule: account_asset_management.account_asset_profile_multi_company_rule (noupdate)
DEL ir.rule: account_asset.account_asset_asset_multi_company_rule (noupdate)
DEL ir.rule: account_asset.account_asset_category_multi_company_rule (noupdate)
NEW ir.ui.menu: account_asset_management.account_asset_compute_menu
NEW ir.ui.menu: account_asset_management.account_asset_menu
NEW ir.ui.menu: account_asset_management.account_asset_profile_menu
NEW ir.ui.menu: account_asset_management.menu_finance_assets
NEW ir.ui.menu: account_asset_management.menu_finance_config_assets
DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_form
DEL ir.ui.menu: account_asset.menu_action_account_asset_asset_list_normal_purchase
DEL ir.ui.menu: account_asset.menu_action_asset_asset_report
DEL ir.ui.menu: account_asset.menu_asset_depreciation_confirmation_wizard
DEL ir.ui.menu: account_asset.menu_finance_config_assets
NEW ir.ui.view: account_asset_management.account_asset_compute_view_form
NEW ir.ui.view: account_asset_management.account_asset_compute_view_form_result
NEW ir.ui.view: account_asset_management.account_asset_profile_view_form
NEW ir.ui.view: account_asset_management.account_asset_profile_view_search
NEW ir.ui.view: account_asset_management.account_asset_profile_view_tree
NEW ir.ui.view: account_asset_management.account_asset_remove_view_form
NEW ir.ui.view: account_asset_management.account_asset_view_form
NEW ir.ui.view: account_asset_management.account_asset_view_search
NEW ir.ui.view: account_asset_management.account_asset_view_tree
NEW ir.ui.view: account_asset_management.invoice_form
NEW ir.ui.view: account_asset_management.invoice_supplier_form
NEW ir.ui.view: account_asset_management.res_config_settings_view_form
NEW ir.ui.view: account_asset_management.view_account_form
NEW ir.ui.view: account_asset_management.view_account_move_line_filter
NEW ir.ui.view: account_asset_management.view_invoice_line_form
NEW ir.ui.view: account_asset_management.view_move_form
NEW ir.ui.view: account_asset_management.view_move_line_form
DEL ir.ui.view: account_asset.action_account_asset_report_graph
DEL ir.ui.view: account_asset.action_account_asset_report_pivot
DEL ir.ui.view: account_asset.asset_modify_form
DEL ir.ui.view: account_asset.assets_backend
DEL ir.ui.view: account_asset.qunit_suite
DEL ir.ui.view: account_asset.res_config_settings_view_form
DEL ir.ui.view: account_asset.view_account_asset_asset_category_kanban
DEL ir.ui.view: account_asset.view_account_asset_asset_form
DEL ir.ui.view: account_asset.view_account_asset_asset_kanban
DEL ir.ui.view: account_asset.view_account_asset_asset_purchase_tree
DEL ir.ui.view: account_asset.view_account_asset_category_form
DEL ir.ui.view: account_asset.view_account_asset_category_search
DEL ir.ui.view: account_asset.view_account_asset_category_tree
DEL ir.ui.view: account_asset.view_account_asset_search
DEL ir.ui.view: account_asset.view_asset_asset_report_search
DEL ir.ui.view: account_asset.view_asset_depreciation_confirmation_wizard
DEL ir.ui.view: account_asset.view_invoice_asset_category
DEL ir.ui.view: account_asset.view_product_template_form_inherit

View File

@@ -1,104 +0,0 @@
# Copyright 2019 Apps2GROW - Henrik Norlin
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openupgradelib import openupgrade
from psycopg2 import sql
from odoo.tools import float_is_zero
def adjust_asset_values(env):
"""Avoid method_time != 'year' when possible + adjust other values
in assets and asset profiles.
"""
# Copy analytic account value
openupgrade.logged_query(
env.cr,
"""
UPDATE account_asset aa
SET account_analytic_id = aap.account_analytic_id
FROm account_asset_profile aap
WHERE aa.profile_id = aap.id""",
)
# Adjust method_time, method_number and method_period
number = sql.Identifier(openupgrade.get_legacy_name("method_number"))
period = sql.Identifier(openupgrade.get_legacy_name("method_period"))
for table in ["account_asset_profile", "account_asset"]:
table = sql.Identifier(table)
openupgrade.logged_query(
env.cr,
sql.SQL(
"""
UPDATE {table}
SET method_time = 'year',
method_number = ({number} * {period}) / 12
WHERE MOD({number} * {period}, 12) = 0
"""
).format(number=number, period=period, table=table),
)
openupgrade.logged_query(
env.cr,
sql.SQL(
"""
UPDATE {table}
SET method_period = (CASE
WHEN {period} = 1 THEN 'month'
WHEN {period} = 3 THEN 'quarter'
WHEN {period} = 12 THEN 'year'
END)
WHERE {period} IN (1, 3, 12)
"""
).format(period=period, table=table),
)
def adjust_aml_values(env):
openupgrade.logged_query(
env.cr,
"""
UPDATE account_move_line aml
SET asset_id = aa.id,
asset_profile_id = aa.profile_id
FROM account_asset aa,
account_asset_line aal
WHERE aal.move_id = aml.move_id
AND aa.id = aal.asset_id""",
)
def handle_account_asset_disposal_migration(env):
"""Take care of potentially installed `account_asset_disposal` module.
In this phase we set the last asset line to the type remove on the
corresponding assets.
"""
column_name = openupgrade.get_legacy_name("disposal_move_id")
if not openupgrade.column_exists(env.cr, "account_asset", column_name):
return
env.cr.execute(
sql.SQL("SELECT id FROM account_asset WHERE {col} IS NOT NULL").format(
col=sql.Identifier(column_name)
)
)
assets = (
env["account.asset"]
.with_context(allow_asset_line_update=True)
.browse(x[0] for x in env.cr.fetchall())
)
assets.mapped("depreciation_line_ids").filtered(
lambda x: float_is_zero(
x.remaining_value,
precision_rounding=x.asset_id.company_currency_id.rounding,
)
).write({"type": "remove"})
@openupgrade.migrate()
def migrate(env, version):
copied_column = openupgrade.get_legacy_name("method_time")
if not openupgrade.column_exists(env.cr, "account_asset", copied_column):
# We avoid this migration if `account_asset` was not installed in v11
return
adjust_asset_values(env)
adjust_aml_values(env)
handle_account_asset_disposal_migration(env)

View File

@@ -1,109 +0,0 @@
# Copyright 2019 Apps2GROW - Henrik Norlin
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openupgradelib import openupgrade
_model_renames = [
("account.asset.category", "account.asset.profile"),
("account.asset.depreciation.line", "account.asset.line"),
("account.asset.asset", "account.asset"),
]
_table_renames = [
(old.replace(".", "_"), new.replace(".", "_")) for (old, new) in _model_renames
]
_column_copies = {
"account_asset": [("method_number", None, None), ("method_time", None, None)],
"account_asset_profile": [
("method_number", None, None),
("method_time", None, None),
],
}
_column_renames = {
"account_asset": [("method_period", None)],
"account_asset_profile": [("method_period", None)],
}
_field_renames = [
("account.asset", "account_asset", "category_id", "profile_id"),
("account.asset", "account_asset", "currency_id", "company_currency_id"),
("account.asset", "account_asset", "date", "date_start"),
("account.asset", "account_asset", "value", "purchase_value"),
("account.asset.line", "account_asset_line", "depreciation_date", "line_date"),
(
"account.asset.profile",
"account_asset_profile",
"account_depreciation_expense_id",
"account_expense_depreciation_id",
),
(
"account.invoice.line",
"account_invoice_line",
"asset_category_id",
"asset_profile_id",
),
]
def handle_account_asset_disposal_migration(env):
"""Take care of potentially installed `account_asset_disposal` module.
In this phase we rename stuff for adapting to the new data structure.
"""
cr = env.cr
if not openupgrade.column_exists(cr, "account_asset", "disposal_move_id"):
return
openupgrade.copy_columns(cr, {"account_asset": [("state", None, None)]})
openupgrade.rename_columns(cr, {"account_asset": [("disposal_move_id", None)]})
openupgrade.map_values(
cr,
openupgrade.get_legacy_name("state"),
"state",
[("disposed", "removed")],
table="account_asset",
)
openupgrade.rename_fields(
env,
[
("account.asset", "account_asset", "disposal_date", "date_remove"),
(
"account.asset.profile",
"account_asset_profile",
"account_loss_id",
"account_residual_value_id",
),
],
)
@openupgrade.migrate()
def migrate(env, version):
cr = env.cr
if openupgrade.table_exists(cr, "account_asset_asset"):
# `account_asset` module was installed in v11
if openupgrade.table_exists(cr, "account_asset"):
# `account_asset_management` module also installed in v11
# TODO: Merge in existing tables assets if both module installed
pass
else:
openupgrade.rename_models(cr, _model_renames)
openupgrade.rename_tables(cr, _table_renames)
openupgrade.copy_columns(cr, _column_copies)
openupgrade.rename_columns(cr, _column_renames)
openupgrade.rename_fields(env, _field_renames)
handle_account_asset_disposal_migration(env)
if openupgrade.column_exists(cr, "account_asset", "analytic_account_id"):
# account_asset_analytic module in OCA/account_analytic
openupgrade.rename_fields(
env,
[
(
"account.asset",
"account_asset",
"analytic_account_id",
"account_analytic_id",
)
],
)

View File

@@ -1,81 +0,0 @@
# Copyright 2019 Apps2GROW - Henrik Norlin
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openupgradelib import openupgrade
from psycopg2 import sql
def create_asset_groups(cr):
# Add a supporting column for indicating the source asset view
origin_column = sql.Identifier(openupgrade.get_legacy_name("view_asset_id"))
openupgrade.logged_query(
cr, sql.SQL("ALTER TABLE account_asset_group ADD {} int4").format(origin_column)
)
# Now fill new table recursively attending parents
parent_column = sql.Identifier(openupgrade.get_legacy_name("parent_id"))
parent_group_ids = ("NULL",)
query_sql = sql.SQL(
"""
INSERT INTO account_asset_group (
name, code, company_id, parent_id, create_uid,
create_date, write_date, write_uid, {origin_column}
)
SELECT va.name, va.code, va.company_id, aag2.id, va.create_uid,
va.create_date, va.write_date, va.write_uid, va.id
FROM {table} va
LEFT JOIN account_asset_group aag2
ON aag2.{origin_column} = va.{parent_column}
WHERE {parent_column} {rest_sql}
RETURNING id
"""
)
isnull = sql.SQL("IS NULL")
inids = sql.SQL("IN %(ids)s")
while parent_group_ids:
query = query_sql.format(
origin_column=origin_column,
table=sql.Identifier(openupgrade.get_legacy_name("account_asset_view")),
parent_column=parent_column,
rest_sql=isnull if parent_group_ids == ("NULL",) else inids,
)
openupgrade.logged_query(cr, query, {"ids": parent_group_ids})
parent_group_ids = tuple(x[0] for x in cr.fetchall())
def update_asset_group_links(cr):
parent_column = sql.Identifier(openupgrade.get_legacy_name("parent_id"))
origin_column = sql.Identifier(openupgrade.get_legacy_name("view_asset_id"))
openupgrade.logged_query(
cr,
sql.SQL(
"""
INSERT INTO account_asset_profile_group_rel
(profile_id, group_id)
SELECT aap.id, aag.id
FROM account_asset_profile aap
JOIN account_asset_group aag
ON aag.{origin_column} = aap.{parent_column}"""
).format(parent_column=parent_column, origin_column=origin_column),
)
openupgrade.logged_query(
cr,
sql.SQL(
"""
INSERT INTO account_asset_group_rel
(asset_id, group_id)
SELECT aa.id, aag.id
FROM account_asset aa
JOIN account_asset_group aag
ON aag.{origin_column} = aa.{parent_column}"""
).format(parent_column=parent_column, origin_column=origin_column),
)
@openupgrade.migrate()
def migrate(env, version):
column = openupgrade.get_legacy_name("parent_id")
if openupgrade.column_exists(env.cr, "account_asset", column):
# if migrating directly from v11 `account_asset` module, there are no
# view assets nor parents
create_asset_groups(env.cr)
update_asset_group_links(env.cr)

View File

@@ -1,48 +0,0 @@
# Copyright 2019 Tecnativa - Pedro M. Baeza
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openupgradelib import openupgrade
from psycopg2 import sql
_column_renames = {
"account_asset_profile": [("parent_id", None)],
"account_asset": [("parent_id", None)],
}
def move_view_assets(cr):
"""Copy view assets to other table for preserving them, but outside of the
main table, so remove them from there.
"""
temp_table = sql.Identifier(openupgrade.get_legacy_name("account_asset_view"))
openupgrade.logged_query(
cr,
sql.SQL(
"""
CREATE TABLE {} AS (
SELECT * FROM account_asset
WHERE type='view'
)"""
).format(temp_table),
)
openupgrade.logged_query(cr, "DELETE FROM account_asset WHERE type='view'")
@openupgrade.migrate()
def migrate(env, version):
if openupgrade.column_exists(env.cr, "account_asset", "parent_id"):
# if migrating directly from v11 `account_asset` module, there are no
# view assets nor parents
openupgrade.rename_columns(env.cr, _column_renames)
openupgrade.logged_query(
env.cr,
"""
ALTER TABLE account_asset
DROP CONSTRAINT account_asset_parent_id_fkey""",
)
openupgrade.logged_query(
env.cr,
"""
ALTER TABLE account_asset_profile
DROP CONSTRAINT account_asset_profile_parent_id_fkey""",
)
move_view_assets(env.cr)

View File

@@ -5,6 +5,4 @@ from . import account_asset_profile
from . import account_asset_line
from . import account_asset_recompute_trigger
from . import account_fiscal_year
from . import account_invoice
from . import account_move
from . import res_config_settings

View File

@@ -14,7 +14,6 @@ class AccountAccount(models.Model):
help="Default Asset Profile when creating invoice lines " "with this account.",
)
@api.multi
@api.constrains("asset_profile_id")
def _check_asset_profile(self):
for account in self:

View File

@@ -15,8 +15,6 @@ from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.osv import expression
import odoo.addons.decimal_precision as dp
_logger = logging.getLogger(__name__)
@@ -43,7 +41,6 @@ class AccountAsset(models.Model):
)
name = fields.Char(
string="Asset Name",
size=64,
required=True,
readonly=True,
states={"draft": [("readonly", False)]},
@@ -65,7 +62,7 @@ class AccountAsset(models.Model):
)
salvage_value = fields.Float(
string="Salvage Value",
digits=dp.get_precision("Account"),
digits="Account",
readonly=True,
states={"draft": [("readonly", False)]},
help="The estimated value that an asset will realize upon "
@@ -74,7 +71,7 @@ class AccountAsset(models.Model):
)
depreciation_base = fields.Float(
compute="_compute_depreciation_base",
digits=dp.get_precision("Account"),
digits="Account",
string="Depreciation Base",
store=True,
help="This amount represent the depreciation base "
@@ -82,13 +79,13 @@ class AccountAsset(models.Model):
)
value_residual = fields.Float(
compute="_compute_depreciation",
digits=dp.get_precision("Account"),
digits="Account",
string="Residual Value",
store=True,
)
value_depreciated = fields.Float(
compute="_compute_depreciation",
digits=dp.get_precision("Account"),
digits="Account",
string="Depreciated Value",
store=True,
)
@@ -261,18 +258,18 @@ class AccountAsset(models.Model):
@api.model
def _default_company_id(self):
return self.env["res.company"]._company_default_get("account.asset")
return self.env.company
@api.multi
def _compute_move_line_check(self):
for asset in self:
move_line_check = False
for line in asset.depreciation_line_ids:
if line.move_id:
asset.move_line_check = True
move_line_check = True
break
asset.move_line_check = move_line_check
@api.depends("purchase_value", "salvage_value", "method")
@api.multi
def _compute_depreciation_base(self):
for asset in self:
if asset.method in ["linear-limit", "degr-limit"]:
@@ -280,7 +277,6 @@ class AccountAsset(models.Model):
else:
asset.depreciation_base = asset.purchase_value - asset.salvage_value
@api.multi
@api.depends(
"depreciation_base",
"depreciation_line_ids.type",
@@ -300,7 +296,6 @@ class AccountAsset(models.Model):
depreciated = value_depreciated
asset.update({"value_residual": residual, "value_depreciated": depreciated})
@api.multi
@api.constrains("method", "method_time")
def _check_method(self):
for asset in self:
@@ -309,7 +304,6 @@ class AccountAsset(models.Model):
_("Degressive-Linear is only supported for Time Method = " "Year.")
)
@api.multi
@api.constrains("date_start", "method_end", "method_time")
def _check_dates(self):
for asset in self:
@@ -386,7 +380,6 @@ class AccountAsset(models.Model):
asset._create_first_asset_line()
return asset
@api.multi
def write(self, vals):
if vals.get("method_time"):
if vals["method_time"] != "year" and not vals.get("prorata"):
@@ -421,7 +414,6 @@ class AccountAsset(models.Model):
if self.env.context.get("create_asset_from_move_line"):
asset_line.move_id = self.env.context["move_id"]
@api.multi
def unlink(self):
for asset in self:
if asset.state != "draft":
@@ -453,7 +445,6 @@ class AccountAsset(models.Model):
assets = self.search(domain + args, limit=limit)
return assets.name_get()
@api.multi
@api.depends("name", "code")
def name_get(self):
result = []
@@ -464,7 +455,6 @@ class AccountAsset(models.Model):
result.append((asset.id, name))
return result
@api.multi
def validate(self):
for asset in self:
if asset.company_currency_id.is_zero(asset.value_residual):
@@ -473,7 +463,6 @@ class AccountAsset(models.Model):
asset.state = "open"
return True
@api.multi
def remove(self):
self.ensure_one()
ctx = dict(self.env.context, active_ids=self.ids, active_id=self.id)
@@ -489,7 +478,6 @@ class AccountAsset(models.Model):
return {
"name": _("Generate Asset Removal entries"),
"view_type": "form",
"view_mode": "form",
"res_model": "account.asset.remove",
"target": "new",
@@ -497,11 +485,9 @@ class AccountAsset(models.Model):
"context": ctx,
}
@api.multi
def set_to_draft(self):
return self.write({"state": "draft"})
@api.multi
def open_entries(self):
self.ensure_one()
amls = self.env["account.move.line"].search(
@@ -510,7 +496,6 @@ class AccountAsset(models.Model):
am_ids = [l.move_id.id for l in amls]
return {
"name": _("Journal Entries"),
"view_type": "form",
"view_mode": "tree,form",
"res_model": "account.move",
"view_id": False,
@@ -519,12 +504,74 @@ class AccountAsset(models.Model):
"domain": [("id", "in", am_ids)],
}
@api.multi
def compute_depreciation_board(self):
def _group_lines(self, table):
"""group lines prior to depreciation start period."""
def group_lines(x, y):
y.update({"amount": x["amount"] + y["amount"]})
return y
depreciation_start_date = self.date_start
lines = table[0]["lines"]
lines1 = []
lines2 = []
flag = lines[0]["date"] < depreciation_start_date
for line in lines:
if flag:
lines1.append(line)
if line["date"] >= depreciation_start_date:
flag = False
else:
lines2.append(line)
if lines1:
lines1 = [reduce(group_lines, lines1)]
lines1[0]["depreciated_value"] = 0.0
table[0]["lines"] = lines1 + lines2
def _compute_depreciation_line(
self,
depreciated_value_posted,
table_i_start,
line_i_start,
table,
last_line,
posted_lines,
):
digits = self.env["decimal.precision"].precision_get("Account")
seq = len(posted_lines)
depr_line = last_line
last_date = table[-1]["lines"][-1]["date"]
depreciated_value = depreciated_value_posted
for entry in table[table_i_start:]:
for line in entry["lines"][line_i_start:]:
seq += 1
name = self._get_depreciation_entry_name(seq)
amount = line["amount"]
if line["date"] == last_date:
# ensure that the last entry of the table always
# depreciates the remaining value
amount = self.depreciation_base - depreciated_value
if self.method in ["linear-limit", "degr-limit"]:
amount -= self.salvage_value
if amount:
vals = {
"previous_id": depr_line.id,
"amount": round(amount, digits),
"asset_id": self.id,
"name": name,
"line_date": line["date"],
"line_days": line["days"],
"init_entry": entry["init"],
}
depreciated_value += round(amount, digits)
depr_line = self.env["account.asset.line"].create(vals)
else:
seq -= 1
line_i_start = 0
def compute_depreciation_board(self):
line_obj = self.env["account.asset.line"]
digits = self.env["decimal.precision"].precision_get("Account")
@@ -557,23 +604,7 @@ class AccountAsset(models.Model):
if not table:
continue
# group lines prior to depreciation start period
depreciation_start_date = asset.date_start
lines = table[0]["lines"]
lines1 = []
lines2 = []
flag = lines[0]["date"] < depreciation_start_date
for line in lines:
if flag:
lines1.append(line)
if line["date"] >= depreciation_start_date:
flag = False
else:
lines2.append(line)
if lines1:
lines1 = [reduce(group_lines, lines1)]
lines1[0]["depreciated_value"] = 0.0
table[0]["lines"] = lines1 + lines2
asset._group_lines(table)
# check table with posted entries and
# recompute in case of deviation
@@ -589,7 +620,7 @@ class AccountAsset(models.Model):
)
)
for table_i, entry in enumerate(table):
for _table_i, entry in enumerate(table):
residual_amount_table = entry["lines"][-1]["remaining_value"]
if (
entry["date_start"]
@@ -597,21 +628,22 @@ class AccountAsset(models.Model):
<= entry["date_stop"]
):
break
if entry["date_stop"] == last_depreciation_date:
table_i += 1
line_i = 0
_table_i += 1
_line_i = 0
else:
entry = table[table_i]
entry = table[_table_i]
date_min = entry["date_start"]
for line_i, line in enumerate(entry["lines"]):
for _line_i, line in enumerate(entry["lines"]):
residual_amount_table = line["remaining_value"]
if date_min <= last_depreciation_date <= line["date"]:
break
date_min = line["date"]
if line["date"] == last_depreciation_date:
line_i += 1
table_i_start = table_i
line_i_start = line_i
_line_i += 1
table_i_start = _table_i
line_i_start = _line_i
# check if residual value corresponds with table
# and adjust table when needed
@@ -630,40 +662,14 @@ class AccountAsset(models.Model):
table_i_start = 0
line_i_start = 0
seq = len(posted_lines)
depr_line = last_line
last_date = table[-1]["lines"][-1]["date"]
depreciated_value = depreciated_value_posted
for entry in table[table_i_start:]:
for line in entry["lines"][line_i_start:]:
seq += 1
name = asset._get_depreciation_entry_name(seq)
if line["date"] == last_date:
# ensure that the last entry of the table always
# depreciates the remaining value
if asset.method in ["linear-limit", "degr-limit"]:
depr_max = asset.depreciation_base - asset.salvage_value
else:
depr_max = asset.depreciation_base
amount = depr_max - depreciated_value
else:
amount = line["amount"]
if amount:
vals = {
"previous_id": depr_line.id,
"amount": round(amount, digits),
"asset_id": asset.id,
"name": name,
"line_date": line["date"],
"line_days": line["days"],
"init_entry": entry["init"],
}
depreciated_value += round(amount, digits)
depr_line = line_obj.create(vals)
else:
seq -= 1
line_i_start = 0
asset._compute_depreciation_line(
depreciated_value_posted,
table_i_start,
line_i_start,
table,
last_line,
posted_lines,
)
return True
def _get_fy_duration(self, fy, option="days"):
@@ -1031,7 +1037,7 @@ class AccountAsset(models.Model):
entry["lines"] = lines
line_dates = line_dates[li:]
for i, entry in enumerate(table):
for entry in table:
if not entry["fy_amount"]:
entry["fy_amount"] = sum([l["amount"] for l in entry["lines"]])
@@ -1097,7 +1103,6 @@ class AccountAsset(models.Model):
""" use this method to customise the name of the accounting entry """
return (self.code or str(self.id)) + "/" + str(seq)
@api.multi
def _compute_entries(self, date_end, check_triggers=False):
# TODO : add ir_cron job calling this method to
# generate periodical accounting entries
@@ -1106,11 +1111,11 @@ class AccountAsset(models.Model):
if check_triggers:
recompute_obj = self.env["account.asset.recompute.trigger"]
recomputes = recompute_obj.sudo().search([("state", "=", "open")])
if check_triggers and recomputes:
trigger_companies = recomputes.mapped("company_id")
for asset in self:
if asset.company_id.id in trigger_companies.ids:
asset.compute_depreciation_board()
if recomputes:
trigger_companies = recomputes.mapped("company_id")
for asset in self:
if asset.company_id.id in trigger_companies.ids:
asset.compute_depreciation_board()
depreciations = self.env["account.asset.line"].search(
[

View File

@@ -28,4 +28,4 @@ class AccountAssetGroup(models.Model):
@api.model
def _default_company_id(self):
return self.env["res.company"]._company_default_get("account.asset")
return self.env.company

View File

@@ -4,8 +4,6 @@
from odoo import _, api, fields, models
from odoo.exceptions import UserError
import odoo.addons.decimal_precision as dp
class AccountAssetLine(models.Model):
_name = "account.asset.line"
@@ -27,18 +25,16 @@ class AccountAssetLine(models.Model):
depreciation_base = fields.Float(
related="asset_id.depreciation_base", string="Depreciation Base", readonly=True
)
amount = fields.Float(
string="Amount", digits=dp.get_precision("Account"), required=True
)
amount = fields.Float(string="Amount", digits="Account", required=True)
remaining_value = fields.Float(
compute="_compute_values",
digits=dp.get_precision("Account"),
digits="Account",
string="Next Period Depreciation",
store=True,
)
depreciated_value = fields.Float(
compute="_compute_values",
digits=dp.get_precision("Account"),
digits="Account",
string="Amount Already Depreciated",
store=True,
)
@@ -66,7 +62,6 @@ class AccountAssetLine(models.Model):
)
@api.depends("amount", "previous_id", "type")
@api.multi
def _compute_values(self):
dlines = self
if self.env.context.get("no_compute_asset_line_ids"):
@@ -96,7 +91,6 @@ class AccountAssetLine(models.Model):
dl.remaining_value = remaining_value
@api.depends("move_id")
@api.multi
def _compute_move_check(self):
for line in self:
line.move_check = bool(line.move_id)
@@ -108,7 +102,6 @@ class AccountAssetLine(models.Model):
self.depreciation_base - self.depreciated_value - self.amount
)
@api.multi
def write(self, vals):
for dl in self:
line_date = vals.get("line_date") or dl.line_date
@@ -163,9 +156,9 @@ class AccountAssetLine(models.Model):
)
else:
check = asset_lines.filtered(
lambda l: l != dl
and (l.init_entry or l.move_check)
and l.line_date > fields.Date.to_date(vals["line_date"])
lambda al: al != dl
and (al.init_entry or al.move_check)
and al.line_date > fields.Date.to_date(vals["line_date"])
)
if check:
raise UserError(
@@ -176,7 +169,6 @@ class AccountAssetLine(models.Model):
)
return super().write(vals)
@api.multi
def unlink(self):
for dl in self:
if dl.type == "create" and dl.amount:
@@ -203,9 +195,8 @@ class AccountAssetLine(models.Model):
def _setup_move_data(self, depreciation_date):
asset = self.asset_id
move_data = {
"name": asset.name,
"date": depreciation_date,
"ref": self.name,
"ref": "{} - {}".format(asset.name, self.name),
"journal_id": asset.profile_id.journal_id.id,
}
return move_data
@@ -236,7 +227,6 @@ class AccountAssetLine(models.Model):
}
return move_line_data
@api.multi
def create_move(self):
created_move_ids = []
asset_ids = set()
@@ -266,12 +256,10 @@ class AccountAssetLine(models.Model):
asset.state = "close"
return created_move_ids
@api.multi
def open_move(self):
self.ensure_one()
return {
"name": _("Journal Entry"),
"view_type": "form",
"view_mode": "tree,form",
"res_model": "account.move",
"view_id": False,
@@ -280,13 +268,10 @@ class AccountAssetLine(models.Model):
"domain": [("id", "=", self.move_id.id)],
}
@api.multi
def unlink_move(self):
for line in self:
move = line.move_id
if move.state == "posted":
move.button_cancel()
move.with_context(unlink_from_asset=True).unlink()
move.with_context(force_delete=True, unlink_from_asset=True).unlink()
# trigger store function
line.with_context(unlink_from_asset=True).write({"move_id": False})
if line.parent_state == "close":

View File

@@ -149,7 +149,7 @@ class AccountAssetProfile(models.Model):
@api.model
def _default_company_id(self):
return self.env["res.company"]._company_default_get("account.asset")
return self.env.company
@api.model
def _selection_method(self):
@@ -173,7 +173,6 @@ class AccountAssetProfile(models.Model):
"""
return [("year", _("Number of Years or end date"))]
@api.multi
@api.constrains("method")
def _check_method(self):
for profile in self:
@@ -199,7 +198,6 @@ class AccountAssetProfile(models.Model):
account.write({"asset_profile_id": profile.id})
return profile
@api.multi
def write(self, vals):
if vals.get("method_time"):
if vals["method_time"] != "year" and not vals.get("prorata"):

View File

@@ -13,7 +13,7 @@ class AccountAssetRecomputeTrigger(models.Model):
date_trigger = fields.Datetime(
"Trigger Date",
readonly=True,
help="Date of the event triggering the need to " "recompute the Asset Tables.",
help="Date of the event triggering the need to recompute the Asset Tables.",
)
date_completed = fields.Datetime("Completion Date", readonly=True)
state = fields.Selection(

View File

@@ -30,7 +30,6 @@ class AccountFiscalYear(models.Model):
self.env["account.asset.recompute.trigger"].sudo().create(recompute_vals)
return super().create(vals)
@api.multi
def write(self, vals):
if vals.get("date_from") or vals.get("date_to"):
for fy in self:

View File

@@ -1,150 +0,0 @@
# Copyright 2009-2018 Noviat
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import copy
from odoo import api, fields, models
class AccountInvoice(models.Model):
_inherit = "account.invoice"
@api.multi
def finalize_invoice_move_lines(self, move_lines):
move_lines = super().finalize_invoice_move_lines(move_lines)
new_lines = []
for line_tuple in move_lines:
line = line_tuple[2]
dp = self.env["decimal.precision"]
if line.get("asset_profile_id") and line.get("quantity", 0.0) > 1.0:
profile = self.env["account.asset.profile"].browse(
[line.get("asset_profile_id")]
)
if profile.asset_product_item:
origin_line = copy.deepcopy(line)
line_qty = line.get("quantity")
line["quantity"] = round(
line["quantity"] / line_qty, dp.precision_get("Account")
)
line["debit"] = round(
line["debit"] / line_qty, dp.precision_get("Account")
)
line["credit"] = round(
line["credit"] / line_qty, dp.precision_get("Account")
)
for analytic_line_tuple in line["analytic_line_ids"]:
analytic_line = analytic_line_tuple[2]
analytic_line["amount"] = round(
analytic_line["amount"] / line_qty,
dp.precision_get("Account"),
)
analytic_line["unit_amount"] = round(
analytic_line["unit_amount"] / line_qty, 2
)
line_to_create = line_qty
while line_to_create > 1:
line_to_create -= 1
new_line = copy.deepcopy(line_tuple)
new_lines.append(new_line)
# Compute rounding difference and apply it on the first
# line
line["quantity"] += round(
origin_line["quantity"] - line["quantity"] * line_qty, 2
)
line["debit"] += round(
origin_line["debit"] - line["debit"] * line_qty,
dp.precision_get("Account"),
)
line["credit"] += round(
origin_line["credit"] - line["credit"] * line_qty,
dp.precision_get("Account"),
)
i = 0
for analytic_line_tuple in line["analytic_line_ids"]:
analytic_line = analytic_line_tuple[2]
origin_analytic_line = origin_line["analytic_line_ids"][i][2]
analytic_line["amount"] += round(
origin_analytic_line["amount"]
- analytic_line["amount"] * line_qty,
dp.precision_get("Account"),
)
analytic_line["unit_amount"] += round(
origin_analytic_line["unit_amount"]
- analytic_line["unit_amount"] * line_qty,
dp.precision_get("Account"),
)
i += 1
move_lines.extend(new_lines)
return move_lines
@api.multi
def action_move_create(self):
res = super().action_move_create()
for inv in self:
assets = inv.move_id.line_ids.mapped("asset_id")
for asset in assets:
asset.code = inv.move_name
asset_line_name = asset._get_depreciation_entry_name(0)
asset.depreciation_line_ids[0].with_context(
{"allow_asset_line_update": True}
).name = asset_line_name
return res
@api.multi
def action_cancel(self):
assets = self.env["account.asset"]
for inv in self:
move = inv.move_id
assets |= move.line_ids.mapped("asset_id")
super().action_cancel()
if assets:
assets.unlink()
return True
@api.model
def line_get_convert(self, line, part):
res = super().line_get_convert(line, part)
if line.get("asset_profile_id"):
# skip empty debit/credit
if res.get("debit") or res.get("credit"):
res["asset_profile_id"] = line["asset_profile_id"]
return res
@api.model
def inv_line_characteristic_hashcode(self, invoice_line):
res = super().inv_line_characteristic_hashcode(invoice_line)
res += "-%s" % invoice_line.get("asset_profile_id", "False")
return res
@api.model
def invoice_line_move_line_get(self):
res = super().invoice_line_move_line_get()
invoice_line_obj = self.env["account.invoice.line"]
for vals in res:
if vals.get("invl_id"):
invline = invoice_line_obj.browse(vals["invl_id"])
if invline.asset_profile_id:
vals["asset_profile_id"] = invline.asset_profile_id.id
return res
class AccountInvoiceLine(models.Model):
_inherit = "account.invoice.line"
asset_profile_id = fields.Many2one(
comodel_name="account.asset.profile", string="Asset Profile"
)
asset_id = fields.Many2one(
comodel_name="account.asset",
string="Asset",
domain=[("state", "in", ["open", "close"])],
help="Complete this field when selling an asset "
"in order to facilitate the creation of the "
"asset removal accounting entries via the "
"asset 'Removal' button",
)
@api.onchange("account_id")
def _onchange_account_id(self):
self.asset_profile_id = self.account_id.asset_profile_id.id
return super()._onchange_account_id()

View File

@@ -14,20 +14,19 @@ FIELDS_AFFECTS_ASSET_MOVE = {"journal_id", "date"}
# List of move line's fields that can't be modified if move is linked
# with a depreciation line
FIELDS_AFFECTS_ASSET_MOVE_LINE = {
"credit",
"debit",
"account_id",
"journal_id",
"date",
"asset_profile_id",
"asset_id",
"credit",
"debit",
"account_id",
"journal_id",
"date",
"asset_profile_id",
"asset_id",
}
class AccountMove(models.Model):
_inherit = "account.move"
@api.multi
def unlink(self):
# for move in self:
deprs = self.env["account.asset.line"].search(
@@ -45,7 +44,6 @@ class AccountMove(models.Model):
deprs.write({"move_id": False})
return super().unlink()
@api.multi
def write(self, vals):
if set(vals).intersection(FIELDS_AFFECTS_ASSET_MOVE):
deprs = self.env["account.asset.line"].search(
@@ -60,6 +58,45 @@ class AccountMove(models.Model):
)
return super().write(vals)
def post(self):
for move in self:
for aml in move.line_ids.filtered("asset_profile_id"):
depreciation_base = aml.debit or -aml.credit
vals = {
"name": aml.name,
"code": move.name,
"profile_id": aml.asset_profile_id.id,
"purchase_value": depreciation_base,
"partner_id": aml.partner_id.id,
"date_start": move.date,
"account_analytic_id": aml.analytic_account_id.id,
}
if self.env.context.get("company_id"):
vals["company_id"] = self.env.context["company_id"]
asset = (
self.env["account.asset"]
.with_context(create_asset_from_move_line=True, move_id=move.id)
.create(vals)
)
aml.with_context(allow_asset=True).asset_id = asset.id
super().post()
def button_draft(self):
invoices = self.filtered(lambda r: not r.is_sale_document())
if invoices:
invoices.line_ids.asset_id.unlink()
super().button_draft()
def _reverse_move_vals(self, default_values, cancel=True):
move_vals = super()._reverse_move_vals(default_values, cancel)
if move_vals["type"] not in ("out_invoice", "out_refund"):
for line_command in move_vals.get("line_ids", []):
line_vals = line_command[2] # (0, 0, {...})
asset = self.env["account.asset"].browse(line_vals["asset_id"])
asset.unlink()
line_vals.update(asset_profile_id=False, asset_id=False)
return move_vals
class AccountMoveLine(models.Model):
_inherit = "account.move.line"
@@ -74,61 +111,26 @@ class AccountMoveLine(models.Model):
@api.onchange("account_id")
def _onchange_account_id(self):
self.asset_profile_id = self.account_id.asset_profile_id
super()._onchange_account_id()
@api.model
def create(self, vals):
if vals.get("asset_id") and not self.env.context.get("allow_asset"):
raise UserError(
_(
"You are not allowed to link "
"an accounting entry to an asset."
"\nYou should generate such entries from the asset."
)
)
if vals.get("asset_profile_id"):
# create asset
asset_obj = self.env["account.asset"]
move = self.env["account.move"].browse(vals["move_id"])
depreciation_base = vals["debit"] or -vals["credit"]
temp_vals = {
"name": vals["name"],
"profile_id": vals["asset_profile_id"],
"purchase_value": depreciation_base,
"partner_id": vals["partner_id"],
"date_start": move.date,
}
if self.env.context.get("company_id"):
temp_vals["company_id"] = self.env.context["company_id"]
temp_asset = asset_obj.new(temp_vals)
temp_asset._onchange_profile_id()
asset_vals = temp_asset._convert_to_write(temp_asset._cache)
self._get_asset_analytic_values(vals, asset_vals)
asset = asset_obj.with_context(
create_asset_from_move_line=True, move_id=vals["move_id"]
).create(asset_vals)
vals["asset_id"] = asset.id
return super().create(vals)
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
move = self.env["account.move"].browse(vals.get("move_id"))
if not move.is_sale_document():
if vals.get("asset_id") and not self.env.context.get("allow_asset"):
raise UserError(
_(
"You are not allowed to link "
"an accounting entry to an asset."
"\nYou should generate such entries from the asset."
)
)
records = super().create(vals_list)
for record in records:
record._expand_asset_line()
return records
@api.multi
def _prepare_asset_create(self, vals):
self.ensure_one()
debit = "debit" in vals and vals.get("debit", 0.0) or self.debit
credit = "credit" in vals and vals.get("credit", 0.0) or self.credit
depreciation_base = debit - credit
partner_id = (
"partner" in vals and vals.get("partner", False) or self.partner_id.id
)
date_start = "date" in vals and vals.get("date", False) or self.date
return {
"name": vals.get("name") or self.name,
"profile_id": vals["asset_profile_id"],
"purchase_value": depreciation_base,
"partner_id": partner_id,
"date_start": date_start,
"company_id": vals.get("company_id") or self.company_id.id,
}
@api.multi
def write(self, vals):
if set(vals).intersection(FIELDS_AFFECTS_ASSET_MOVE_LINE) and not (
self.env.context.get("allow_asset_removal")
@@ -136,8 +138,8 @@ class AccountMoveLine(models.Model):
):
# Check if at least one asset is linked to a move
linked_asset = False
for move in self:
linked_asset = move.asset_id
for move_line in self.filtered(lambda r: not r.move_id.is_sale_document()):
linked_asset = move_line.asset_id
if linked_asset:
raise UserError(
_(
@@ -145,7 +147,12 @@ class AccountMoveLine(models.Model):
"linked to an asset depreciation line."
)
)
if vals.get("asset_id"):
if (
self.filtered(lambda r: not r.move_id.is_sale_document())
and vals.get("asset_id")
and not self.env.context.get("allow_asset")
):
raise UserError(
_(
"You are not allowed to link "
@@ -153,36 +160,22 @@ class AccountMoveLine(models.Model):
"\nYou should generate such entries from the asset."
)
)
if vals.get("asset_profile_id"):
if len(self) == 1:
raise AssertionError(
_("This option should only be used for a single id at a " "time.")
)
asset_obj = self.env["account.asset"]
for aml in self:
if vals["asset_profile_id"] == aml.asset_profile_id.id:
continue
# create asset
asset_vals = aml._prepare_asset_create(vals)
self._play_onchange_profile_id(asset_vals)
self._get_asset_analytic_values(vals, asset_vals)
asset = asset_obj.with_context(
create_asset_from_move_line=True, move_id=aml.move_id.id
).create(asset_vals)
vals["asset_id"] = asset.id
return super().write(vals)
super().write(vals)
if "quantity" in vals or "asset_profile_id" in vals:
for record in self:
record._expand_asset_line()
return True
@api.model
def _get_asset_analytic_values(self, vals, asset_vals):
asset_vals["account_analytic_id"] = vals.get("analytic_account_id", False)
@api.model
def _play_onchange_profile_id(self, vals):
asset_obj = self.env["account.asset"]
asset_temp = asset_obj.new(vals)
asset_temp._onchange_profile_id()
for field in asset_temp._fields:
if field not in vals and asset_temp[field]:
vals[field] = asset_temp._fields[field].convert_to_write(
asset_temp[field], asset_temp
)
def _expand_asset_line(self):
self.ensure_one()
if self.asset_profile_id and self.quantity > 1.0:
profile = self.asset_profile_id
if profile.asset_product_item:
aml = self.with_context(check_move_validity=False)
qty = self.quantity
name = self.name
aml.write({"quantity": 1, "name": "{} {}".format(name, 1)})
aml._onchange_price_subtotal()
for i in range(1, int(qty)):
aml.copy({"name": "{} {}".format(name, i + 1)})
aml.move_id._onchange_invoice_line_ids()

View File

@@ -1,17 +0,0 @@
# Copyright (c) 2014 ACSONE SA/NV (http://acsone.eu).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import fields, models
class Config(models.TransientModel):
_inherit = "res.config.settings"
module_account_asset_management = fields.Boolean(
string="Assets management (OCA)",
help="""This allows you to manage the assets owned by a company
or a person. It keeps track of the depreciation occurred
on those assets, and creates account move for those
depreciation lines.
This installs the module account_asset_management.""",
)

View File

@@ -1,2 +0,0 @@
It is recommended to configure your Purchase Journal with "Group Invoice Lines" to avoid the
creation of separate assets per Supplier Invoice Line.

View File

@@ -1,11 +1,15 @@
- OpenERP SA
- Luc De Meyer (Noviat)
- Frédéric Clementi (camptocamp)
- Florian Dacosta (Akretion)
- Stéphane Bidoul (Acsone)
- Adrien Peiffer (Acsone)
- Akim Juillerat <akim.juillerat@camptocamp.com>
- Henrik Norlin (Apps2GROW)
- Maxence Groine <mgroine@fiefmanage.ch>
- Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
- Saran Lim. <saranl@ecosoft.co.th>
* OpenERP SA
* Luc De Meyer (Noviat)
* Frédéric Clementi (camptocamp)
* Florian Dacosta (Akretion)
* Stéphane Bidoul (Acsone)
* Adrien Peiffer (Acsone)
* Akim Juillerat <akim.juillerat@camptocamp.com>
* Henrik Norlin (Apps2GROW)
* Maxence Groine <mgroine@fiefmanage.ch>
* Kitti Upariphutthiphong <kittiu@ecosoft.co.th>
* Saran Lim. <saranl@ecosoft.co.th>
* `Tecnativa <https://www.tecnativa.com>`_:
* Ernesto Tejeda
* Pedro M. Baeza

View File

@@ -1,3 +1,20 @@
13.0.1.0.0 (2019-10-21)
~~~~~~~~~~~~~~~~~~~~~~~
* Python code and views were adapted to be compatible with v13.
* When assets are created through accounting journal items,
they are created when the journal items is posted.
* When a Bill Invoice is created or modified, at the time it is saved,
for each line that has an Asset profile and Quantity 'N'
greater than 1, it will be replaced by 'N' lines identical to it but
with quantity 1. This was done to maintain the same behavior as in
the previous version, in which for each asset created there is a
Journal Item. In addition, this solution does not change the data
model which does not cause migration scripts.
* The configuration option was removed so the only function of that is to
allow the module to be uninstalled by unchecking that configuration option.
* Tests were adapted.
12.0.2.1.0 (2019-10-21)
~~~~~~~~~~~~~~~~~~~~~~~

View File

@@ -367,7 +367,7 @@ ul.auto-toc {
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/12.0/account_asset_management"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-tools-12-0/account-financial-tools-12-0-account_asset_management"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/92/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/account-financial-tools-13-0/account-financial-tools-13-0-account_asset_management"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/92/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This Module manages the assets owned by a company. It will keep
track of depreciations occurred on those assets. And it allows to create
accounting entries from the depreciation lines.</p>
@@ -380,27 +380,22 @@ the standard account_asset module from Odoo.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="id3">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="id4">Usage</a></li>
<li><a class="reference internal" href="#changelog" id="id5">Changelog</a><ul>
<li><a class="reference internal" href="#id1" id="id6">12.0.2.1.0 (2019-10-21)</a></li>
<li><a class="reference internal" href="#id2" id="id7">12.0.1.0.0 (2019-01-13)</a></li>
<li><a class="reference internal" href="#id1" id="id6">13.0.1.0.0 (2019-10-21)</a></li>
<li><a class="reference internal" href="#id2" id="id7">12.0.2.1.0 (2019-10-21)</a></li>
<li><a class="reference internal" href="#id3" id="id8">12.0.1.0.0 (2019-01-13)</a></li>
</ul>
</li>
<li><a class="reference internal" href="#bug-tracker" id="id8">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id9">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id10">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id11">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id12">Maintainers</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id9">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id10">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id11">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id12">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id13">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h1><a class="toc-backref" href="#id3">Configuration</a></h1>
<p>It is recommended to configure your Purchase Journal with “Group Invoice Lines” to avoid the
creation of separate assets per Supplier Invoice Line.</p>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#id4">Usage</a></h1>
<p>The module in NOT compatible with the standard account_asset module.</p>
@@ -408,13 +403,31 @@ creation of separate assets per Supplier Invoice Line.</p>
<div class="section" id="changelog">
<h1><a class="toc-backref" href="#id5">Changelog</a></h1>
<div class="section" id="id1">
<h2><a class="toc-backref" href="#id6">12.0.2.1.0 (2019-10-21)</a></h2>
<h2><a class="toc-backref" href="#id6">13.0.1.0.0 (2019-10-21)</a></h2>
<ul class="simple">
<li>Python code and views were adapted to be compatible with v13.</li>
<li>When assets are created through accounting journal items,
they are created when the journal items is posted.</li>
<li>When a Bill Invoice is created or modified, at the time it is saved,
for each line that has an Asset profile and Quantity N
greater than 1, it will be replaced by N lines identical to it but
with quantity 1. This was done to maintain the same behavior as in
the previous version, in which for each asset created there is a
Journal Item. In addition, this solution does not change the data
model which does not cause migration scripts.</li>
<li>The configuration option was removed so the only function of that is to
allow the module to be uninstalled by unchecking that configuration option.</li>
<li>Tests were adapted.</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">12.0.2.1.0 (2019-10-21)</a></h2>
<ul class="simple">
<li>[IMP] Add option to calculate depreciation table by days</li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id7">12.0.1.0.0 (2019-01-13)</a></h2>
<div class="section" id="id3">
<h2><a class="toc-backref" href="#id8">12.0.1.0.0 (2019-01-13)</a></h2>
<ul class="simple">
<li>[BREAKING] account.asset: parent_path has replaced parent_left &amp; parent_right (TODO: migration script)</li>
<li>[BREAKING] account.asset.recompute.trigger: depends on date_range.py (TODO: re-implement in account_fiscal_year.py)</li>
@@ -422,23 +435,23 @@ creation of separate assets per Supplier Invoice Line.</p>
</div>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id8">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id9">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-tools/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<a class="reference external" href="https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_asset_management%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id9">Credits</a></h1>
<h1><a class="toc-backref" href="#id10">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id10">Authors</a></h2>
<h2><a class="toc-backref" href="#id11">Authors</a></h2>
<ul class="simple">
<li>Noviat</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id11">Contributors</a></h2>
<h2><a class="toc-backref" href="#id12">Contributors</a></h2>
<ul class="simple">
<li>OpenERP SA</li>
<li>Luc De Meyer (Noviat)</li>
@@ -451,16 +464,21 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<li>Maxence Groine &lt;<a class="reference external" href="mailto:mgroine&#64;fiefmanage.ch">mgroine&#64;fiefmanage.ch</a>&gt;</li>
<li>Kitti Upariphutthiphong &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</li>
<li>Saran Lim. &lt;<a class="reference external" href="mailto:saranl&#64;ecosoft.co.th">saranl&#64;ecosoft.co.th</a>&gt;</li>
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>Ernesto Tejeda</li>
<li>Pedro M. Baeza</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id12">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id13">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/12.0/account_asset_management">OCA/account-financial-tools</a> project on GitHub.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/13.0/account_asset_management">OCA/account-financial-tools</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>

View File

@@ -8,7 +8,7 @@ from datetime import date, datetime
from odoo import tools
from odoo.modules.module import get_resource_path
from odoo.tests.common import SavepointCase
from odoo.tests.common import Form, SavepointCase
class TestAssetManagement(SavepointCase):
@@ -36,45 +36,17 @@ class TestAssetManagement(SavepointCase):
cls.asset_model = cls.env["account.asset"]
cls.dl_model = cls.env["account.asset.line"]
cls.remove_model = cls.env["account.asset.remove"]
cls.account_invoice = cls.env["account.invoice"]
cls.account_invoice = cls.env["account.move"]
cls.account_move_line = cls.env["account.move.line"]
cls.account_account = cls.env["account.account"]
cls.account_journal = cls.env["account.journal"]
cls.account_invoice_line = cls.env["account.invoice.line"]
cls.account_invoice_line = cls.env["account.move.line"]
# INSTANCES
# Instance: company
cls.company = cls.env.ref("base.main_company")
# Instance: account type (receivable)
cls.type_recv = cls.env.ref("account.data_account_type_receivable")
# Instance: account type (payable)
cls.type_payable = cls.env.ref("account.data_account_type_payable")
# Instance: account (receivable)
cls.account_recv = cls.account_account.create(
{
"name": "test_account_receivable",
"code": "123",
"user_type_id": cls.type_recv.id,
"company_id": cls.company.id,
"reconcile": True,
}
)
# Instance: account (payable)
cls.account_payable = cls.account_account.create(
{
"name": "test_account_payable",
"code": "321",
"user_type_id": cls.type_payable.id,
"company_id": cls.company.id,
"reconcile": True,
}
)
# Instance: partner
cls.partner = cls.env.ref("base.res_partner_2")
@@ -84,57 +56,38 @@ class TestAssetManagement(SavepointCase):
# Instance: product
cls.product = cls.env.ref("product.product_product_4")
# Instance: invoice line
cls.invoice_line = cls.account_invoice_line.create(
{
"name": "test",
"account_id": cls.account_payable.id,
"price_unit": 2000.00,
"quantity": 1,
"product_id": cls.product.id,
}
move_form = Form(
cls.env["account.move"].with_context(
default_type="in_invoice", check_move_validity=False
)
)
move_form.partner_id = cls.partner
move_form.journal_id = cls.journal
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()
# Instance: invoice
cls.invoice = cls.account_invoice.create(
{
"partner_id": cls.partner.id,
"account_id": cls.account_recv.id,
"journal_id": cls.journal.id,
"invoice_line_ids": [(4, cls.invoice_line.id)],
}
)
cls.invoice_line_2 = cls.account_invoice_line.create(
{
"name": "test 2",
"account_id": cls.account_payable.id,
"price_unit": 10000.00,
"quantity": 1,
"product_id": cls.product.id,
}
)
cls.invoice_line_3 = cls.account_invoice_line.create(
{
"name": "test 3",
"account_id": cls.account_payable.id,
"price_unit": 20000.00,
"quantity": 1,
"product_id": cls.product.id,
}
)
cls.invoice_2 = cls.account_invoice.create(
{
"partner_id": cls.partner.id,
"account_id": cls.account_recv.id,
"journal_id": cls.journal.id,
"invoice_line_ids": [
(4, cls.invoice_line_2.id),
(4, cls.invoice_line_3.id),
],
}
move_form = Form(
cls.env["account.move"].with_context(
default_type="in_invoice", check_move_validity=False
)
)
move_form.partner_id = cls.partner
move_form.journal_id = cls.journal
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "test 2"
line_form.product_id = cls.product
line_form.price_unit = 10000.00
line_form.quantity = 1
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "test 3"
line_form.product_id = cls.product
line_form.price_unit = 20000.00
line_form.quantity = 1
cls.invoice_2 = move_form.save()
def test_01_nonprorata_basic(self):
"""Basic tests of depreciation board computations and postings."""
@@ -494,7 +447,7 @@ class TestAssetManagement(SavepointCase):
self.assertTrue(line.price_unit > 0.0)
line.quantity = 2
line.asset_profile_id = asset_profile
invoice.action_invoice_open()
invoice.post()
# I get all asset after invoice validation
current_asset = self.env["account.asset"].search([])
# I get the new asset
@@ -503,7 +456,7 @@ class TestAssetManagement(SavepointCase):
self.assertEqual(len(new_asset), 1)
# I check that the new asset has the correct purchase value
self.assertAlmostEqual(
new_asset.purchase_value, -line.price_unit * line.quantity, places=2
new_asset.purchase_value, line.price_unit * line.quantity, places=2
)
def test_10_asset_from_invoice_product_item(self):
@@ -518,20 +471,23 @@ class TestAssetManagement(SavepointCase):
self.assertTrue(line.price_unit > 0.0)
line.quantity = 2
line.asset_profile_id = asset_profile
invoice.action_invoice_open()
self.assertEqual(len(invoice.invoice_line_ids), 2)
invoice.post()
# I get all asset after invoice validation
current_asset = self.env["account.asset"].search([])
# I get the new asset
new_asset = current_asset - all_asset
# I check that a new asset is created
self.assertEqual(len(new_asset), line.quantity)
self.assertEqual(len(new_asset), 2)
for asset in new_asset:
# I check that the new asset has the correct purchase value
self.assertAlmostEqual(asset.purchase_value, -line.price_unit, places=2)
self.assertAlmostEqual(asset.purchase_value, line.price_unit, places=2)
def test_11_assets_from_invoice(self):
all_assets = self.env["account.asset"].search([])
invoice = self.invoice_2
ctx = dict(self.invoice_2._context)
del ctx["default_type"]
invoice = self.invoice_2.with_context(ctx)
asset_profile = self.env.ref(
"account_asset_management.account_asset_profile_car_5Y"
)
@@ -543,7 +499,7 @@ class TestAssetManagement(SavepointCase):
invoice.invoice_line_ids.write(
{"quantity": 1, "asset_profile_id": asset_profile.id}
)
invoice.action_invoice_open()
invoice.post()
# Retrieve all assets after invoice validation
current_assets = self.env["account.asset"].search([])
# What are the new assets?
@@ -644,7 +600,7 @@ class TestAssetManagement(SavepointCase):
)
asset.compute_depreciation_board()
asset.refresh()
for i in range(1, 11):
for _i in range(1, 11):
self.assertAlmostEqual(
asset.depreciation_line_ids[1].amount, 166.67, places=2
)

View File

@@ -82,7 +82,7 @@
<page string="Depreciation Board">
<div>
<button type="object" name="compute_depreciation_board"
string=" Compute" icon="fa-gears"
string="Compute" icon="fa-gears"
attrs="{'invisible': [('state', 'in', ['close', 'removed'])]}"/>
</div>
<field name="depreciation_line_ids" mode="tree" options="{'reload_on_button': true}">
@@ -209,15 +209,15 @@
<record id="account_asset_action" model="ir.actions.act_window">
<field name="name">Assets</field>
<field name="res_model">account.asset</field>
<field name="view_type">form</field>
<field name="view_id" ref="account_asset_view_tree"/>
<field name="search_view_id" ref="account_asset_view_search"/>
</record>
<act_window id="act_entries_open"
name="Journal Items"
src_model="account.asset"
res_model="account.move.line"
domain="['|',('asset_id','in',context.get('active_ids')),('asset_id','=','active_id')]"/>
name="Journal Items"
binding_model="account.asset"
binding_views="form"
res_model="account.move.line"
domain="['|',('asset_id','in',context.get('active_ids')),('asset_id','=','active_id')]"/>
</odoo>

View File

@@ -47,7 +47,6 @@
<record id="account_asset_group_action" model="ir.actions.act_window">
<field name="name">Asset Groups</field>
<field name="res_model">account.asset.group</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>

View File

@@ -75,7 +75,6 @@
<record id="account_asset_profile_action" model="ir.actions.act_window">
<field name="name">Asset Profiles</field>
<field name="res_model">account.asset.profile</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>

View File

@@ -1,26 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="invoice_supplier_form" model="ir.ui.view">
<field name="name">account.invoice.supplier.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_supplier_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='quantity']" position="before">
<field name="asset_profile_id"/>
</xpath>
</field>
</record>
<record id="invoice_form" model="ir.ui.view">
<field name="name">account.invoice.customer.form</field>
<field name="model">account.invoice</field>
<field name="inherit_id" ref="account.invoice_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='quantity']" position="before">
<field name="asset_id" groups="account.group_account_manager"/>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_invoice_line_form" model="ir.ui.view">
<field name="name">account.invoice.form.add.asset_profile</field>
<field name="model">account.invoice.line</field>
<field name="inherit_id" ref="account.view_invoice_line_form"/>
<field name="arch" type="xml">
<field name="account_id" position="before">
<field name="asset_id" groups="account.group_account_manager"/>
<field name="asset_profile_id" invisible="context.get('type') not in ['in_invoice', 'in_refund']"/>
</field>
</field>
</record>
</odoo>

View File

@@ -2,13 +2,20 @@
<odoo>
<record id="view_move_form" model="ir.ui.view">
<field name="name">account.move.form</field>
<field name="name">account.move.form.account.asset.management</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='invoice_line_ids']/tree/field[@name='quantity']" position="before">
<field name="asset_profile_id" attrs="{'invisible': [('parent.type', 'not in', ('in_invoice', 'in_refund'))]}"/>
<field name="asset_id"
attrs="{'invisible': [('parent.type', 'not in', ('out_invoice', 'out_refund'))]}"
groups="account.group_account_manager"/>
</xpath>
<xpath expr="//notebook//field[@name='line_ids']/tree/field[@name='date_maturity']" position="after">
<field name="asset_profile_id"/>
<field name="asset_id"/>
<field name="asset_id"
groups="account.group_account_manager"/>
</xpath>
</field>
</record>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.account</field>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="model">res.config.settings</field>
<field name="priority" eval="100"/>
<field name="arch" type="xml">
<field name="module_account_asset" position="replace">
<field name="module_account_asset_management" class="oe_inline"/>
</field>
<xpath expr="//label[@for='module_account_asset']" position="replace">
<label for="module_account_asset_management"/>
</xpath>
<xpath expr="//div[@id='msg_account_asset']" position="attributes">
<attribute name="attrs">{'invisible': [('module_account_asset_management', '=', False)]}</attribute>
</xpath>
</field>
</record>
</odoo>

View File

@@ -1,7 +1,7 @@
# Copyright 2009-2018 Noviat
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import _, api, fields, models
from odoo import _, fields, models
class AccountAssetCompute(models.TransientModel):
@@ -17,7 +17,6 @@ class AccountAssetCompute(models.TransientModel):
)
note = fields.Text()
@api.multi
def asset_compute(self):
assets = self.env["account.asset"].search([("state", "=", "open")])
created_move_ids, error_log = assets._compute_entries(
@@ -26,12 +25,13 @@ class AccountAssetCompute(models.TransientModel):
if error_log:
module = __name__.split("addons.")[1].split(".")[0]
result_view = self.env.ref("{}.{}_view_form_result".format(module, self._table))
result_view = self.env.ref(
"{}.{}_view_form_result".format(module, self._table)
)
self.note = _("Compute Assets errors") + ":\n" + error_log
return {
"name": _("Compute Assets result"),
"res_id": self.id,
"view_type": "form",
"view_mode": "form",
"res_model": "account.asset.compute",
"view_id": result_view.id,
@@ -42,7 +42,6 @@ class AccountAssetCompute(models.TransientModel):
return {
"name": _("Created Asset Moves"),
"view_type": "form",
"view_mode": "tree,form",
"res_model": "account.move",
"view_id": False,
@@ -50,13 +49,11 @@ class AccountAssetCompute(models.TransientModel):
"type": "ir.actions.act_window",
}
@api.multi
def view_asset_moves(self):
self.ensure_one()
domain = [("id", "in", self.env.context.get("asset_move_ids", []))]
return {
"name": _("Created Asset Moves"),
"view_type": "form",
"view_mode": "tree,form",
"res_model": "account.move",
"view_id": False,

View File

@@ -36,7 +36,6 @@
<record id="account_asset_compute_action" model="ir.actions.act_window">
<field name="name">Compute Assets</field>
<field name="res_model">account.asset.compute</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="account_asset_compute_view_form"/>
<field name="target">new</field>

View File

@@ -80,14 +80,20 @@ class AccountAssetRemove(models.TransientModel):
asset_id = self.env.context.get("active_id")
sale_value = 0.0
account_sale_id = False
inv_lines = self.env["account.invoice.line"].search(
[("asset_id", "=", asset_id)]
inv_lines = self.env["account.move.line"].search(
[
("asset_id", "=", asset_id),
("move_id.type", "in", ("out_invoice", "out_refund")),
]
)
for line in inv_lines:
inv = line.invoice_id
comp_curr = inv.company_id.currency_id
inv = line.move_id
comp_curr = inv.company_currency_id
inv_curr = inv.currency_id
if line.invoice_id.state in ["open", "paid"]:
if (
line.move_id.invoice_payment_state == "paid"
or line.parent_state == "draft"
):
account_sale_id = line.account_id.id
amount = line.price_subtotal
if inv_curr != comp_curr:
@@ -133,7 +139,6 @@ class AccountAssetRemove(models.TransientModel):
def _residual_value_regime_countries(self):
return ["FR"]
@api.multi
def remove(self):
self.ensure_one()
asset_line_obj = self.env["account.asset.line"]
@@ -201,7 +206,6 @@ class AccountAssetRemove(models.TransientModel):
return {
"name": _("Asset '%s' Removal Journal Entry") % asset_ref,
"view_type": "form",
"view_mode": "tree,form",
"res_model": "account.move",
"view_id": False,