diff --git a/account_asset_management/__manifest__.py b/account_asset_management/__manifest__.py
index 81942d81f..32d504301 100644
--- a/account_asset_management/__manifest__.py
+++ b/account_asset_management/__manifest__.py
@@ -4,7 +4,7 @@
{
'name': 'Assets Management',
- 'version': '12.0.1.1.2',
+ 'version': '12.0.2.0.0',
'license': 'AGPL-3',
'depends': [
'account',
@@ -20,6 +20,7 @@
'wizard/account_asset_remove.xml',
'views/account_account.xml',
'views/account_asset.xml',
+ 'views/account_asset_group.xml',
'views/account_asset_profile.xml',
'views/res_config_settings.xml',
'views/account_invoice.xml',
diff --git a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt
new file mode 100644
index 000000000..eb8fb2cef
--- /dev/null
+++ b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt
@@ -0,0 +1,157 @@
+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
\ No newline at end of file
diff --git a/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt
new file mode 100644
index 000000000..1f6b39c46
--- /dev/null
+++ b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt
@@ -0,0 +1,201 @@
+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
diff --git a/account_asset_management/migrations/12.0.1.0.0/post-migration.py b/account_asset_management/migrations/12.0.1.0.0/post-migration.py
new file mode 100644
index 000000000..a3facbad1
--- /dev/null
+++ b/account_asset_management/migrations/12.0.1.0.0/post-migration.py
@@ -0,0 +1,73 @@
+# 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 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""",
+ )
+
+
+@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)
diff --git a/account_asset_management/migrations/12.0.1.0.0/pre-migration.py b/account_asset_management/migrations/12.0.1.0.0/pre-migration.py
new file mode 100644
index 000000000..61ef3ce31
--- /dev/null
+++ b/account_asset_management/migrations/12.0.1.0.0/pre-migration.py
@@ -0,0 +1,65 @@
+# 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'),
+]
+
+
+@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)
diff --git a/account_asset_management/migrations/12.0.2.0.0/post-migration.py b/account_asset_management/migrations/12.0.2.0.0/post-migration.py
new file mode 100644
index 000000000..be01f6e8b
--- /dev/null
+++ b/account_asset_management/migrations/12.0.2.0.0/post-migration.py
@@ -0,0 +1,85 @@
+# 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)
diff --git a/account_asset_management/migrations/12.0.2.0.0/pre-migration.py b/account_asset_management/migrations/12.0.2.0.0/pre-migration.py
new file mode 100644
index 000000000..91cbb1593
--- /dev/null
+++ b/account_asset_management/migrations/12.0.2.0.0/pre-migration.py
@@ -0,0 +1,49 @@
+# 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)
diff --git a/account_asset_management/models/__init__.py b/account_asset_management/models/__init__.py
index 1c6674458..d7cde7086 100644
--- a/account_asset_management/models/__init__.py
+++ b/account_asset_management/models/__init__.py
@@ -1,5 +1,6 @@
from . import account_account
from . import account_asset
+from . import account_asset_group
from . import account_asset_profile
from . import account_asset_line
from . import account_asset_recompute_trigger
diff --git a/account_asset_management/models/account_asset.py b/account_asset_management/models/account_asset.py
index 9903a391f..c2ef18192 100644
--- a/account_asset_management/models/account_asset.py
+++ b/account_asset_management/models/account_asset.py
@@ -28,7 +28,6 @@ class AccountAsset(models.Model):
_name = 'account.asset'
_description = 'Asset'
_order = 'date_start desc, code, name'
- _parent_store = True
account_move_line_ids = fields.One2many(
comodel_name='account.move.line',
@@ -77,23 +76,20 @@ class AccountAsset(models.Model):
profile_id = fields.Many2one(
comodel_name='account.asset.profile',
string='Asset Profile',
- change_default=True, readonly=True,
+ change_default=True,
+ readonly=True,
+ required=True,
states={'draft': [('readonly', False)]})
- parent_id = fields.Many2one(
- comodel_name='account.asset',
- string='Parent Asset', readonly=True,
- states={'draft': [('readonly', False)]},
- domain=[('type', '=', 'view')],
- ondelete='restrict',
- index=True,
- )
- parent_path = fields.Char(index=True)
- child_ids = fields.One2many(
- comodel_name='account.asset',
- inverse_name='parent_id',
- string='Child Assets')
+ group_ids = fields.Many2many(
+ comodel_name='account.asset.group',
+ relation="account_asset_group_rel",
+ column1="asset_id",
+ column2="group_id",
+ string='Asset Groups')
date_start = fields.Date(
- string='Asset Start Date', readonly=True,
+ string='Asset Start Date',
+ readonly=True,
+ required=True,
states={'draft': [('readonly', False)]},
help="You should manually add depreciation lines "
"with the depreciations of previous fiscal years "
@@ -177,12 +173,6 @@ class AccountAsset(models.Model):
inverse_name='asset_id',
string='Depreciation Lines', copy=False,
readonly=True, states={'draft': [('readonly', False)]})
- type = fields.Selection(
- selection=[('view', 'View'),
- ('normal', 'Normal')],
- string='Type',
- required=True, readonly=True, default='normal',
- states={'draft': [('readonly', False)]})
company_id = fields.Many2one(
comodel_name='res.company',
string='Company', required=True, readonly=True,
@@ -208,20 +198,18 @@ class AccountAsset(models.Model):
asset.move_line_check = True
break
- @api.depends('purchase_value', 'salvage_value', 'type', 'method')
+ @api.depends('purchase_value', 'salvage_value', 'method')
@api.multi
def _compute_depreciation_base(self):
for asset in self:
- if asset.type == 'view':
- asset.depreciation_base = 0.0
- elif asset.method in ['linear-limit', 'degr-limit']:
+ if asset.method in ['linear-limit', 'degr-limit']:
asset.depreciation_base = asset.purchase_value
else:
asset.depreciation_base = \
asset.purchase_value - asset.salvage_value
@api.multi
- @api.depends('type', 'depreciation_base',
+ @api.depends('depreciation_base',
'depreciation_line_ids.type',
'depreciation_line_ids.amount',
'depreciation_line_ids.previous_id',
@@ -229,30 +217,17 @@ class AccountAsset(models.Model):
'depreciation_line_ids.move_check',)
def _compute_depreciation(self):
for asset in self:
- if asset.type == 'normal':
- lines = asset.depreciation_line_ids.filtered(
- lambda l: l.type in ('depreciate', 'remove') and
- (l.init_entry or l.move_check))
- value_depreciated = sum([l.amount for l in lines])
- residual = asset.depreciation_base - value_depreciated
- depreciated = value_depreciated
- else:
- residual = 0.0
- depreciated = 0.0
+ lines = asset.depreciation_line_ids.filtered(
+ lambda l: l.type in ('depreciate', 'remove') and
+ (l.init_entry or l.move_check))
+ value_depreciated = sum([l.amount for l in lines])
+ residual = asset.depreciation_base - value_depreciated
+ depreciated = value_depreciated
asset.update({
'value_residual': residual,
'value_depreciated': depreciated
})
- @api.multi
- @api.constrains('parent_id')
- def _check_recursion(self, parent=None):
- res = super()._check_recursion(parent=parent)
- if not res:
- raise UserError(
- _("Error ! You can not create recursive assets."))
- return res
-
@api.multi
@api.constrains('method', 'method_time')
def _check_method(self):
@@ -297,7 +272,6 @@ class AccountAsset(models.Model):
profile = self.profile_id
if profile:
self.update({
- 'parent_id': profile.parent_id,
'method': profile.method,
'method_number': profile.method_number,
'method_time': profile.method_time,
@@ -305,6 +279,7 @@ class AccountAsset(models.Model):
'method_progress_factor': profile.method_progress_factor,
'prorata': profile.prorata,
'account_analytic_id': profile.account_analytic_id,
+ 'group_ids': profile.group_ids,
})
@api.onchange('method_time')
@@ -312,30 +287,15 @@ class AccountAsset(models.Model):
if self.method_time != 'year':
self.prorata = True
- @api.onchange('type')
- def _onchange_type(self):
- if self.type == 'view':
- self.update({
- 'date_start': False,
- 'profile_id': False,
- 'purchase_value': False,
- 'salvage_value': False,
- })
- if self.depreciation_line_ids:
- self.depreciation_line_ids.unlink()
-
@api.model
def create(self, vals):
if vals.get('method_time') != 'year' and not vals.get('prorata'):
vals['prorata'] = True
- if vals.get('type') == 'view':
- vals['date_start'] = False
asset = super().create(vals)
if self.env.context.get('create_asset_from_move_line'):
# Trigger compute of depreciation_base
asset.salvage_value = 0.0
- if asset.type == 'normal':
- asset._create_first_asset_line()
+ asset._create_first_asset_line()
return asset
@api.multi
@@ -345,9 +305,7 @@ class AccountAsset(models.Model):
vals['prorata'] = True
res = super().write(vals)
for asset in self:
- asset_type = vals.get('type') or asset.type
- if asset_type == 'view' or \
- self.env.context.get('asset_validate_from_write'):
+ if self.env.context.get('asset_validate_from_write'):
continue
asset._create_first_asset_line()
if asset.profile_id.open_asset and \
@@ -387,7 +345,7 @@ class AccountAsset(models.Model):
"posted depreciation lines."))
# update accounting entries linked to lines of type 'create'
amls = self.with_context(
- allow_asset_removal=True, from_parent_object=True
+ allow_asset_removal=True
).mapped('account_move_line_ids')
amls.write({'asset_id': False})
return super().unlink()
@@ -419,8 +377,7 @@ class AccountAsset(models.Model):
@api.multi
def validate(self):
for asset in self:
- if asset.type == 'normal' and asset.company_currency_id.is_zero(
- asset.value_residual):
+ if asset.company_currency_id.is_zero(asset.value_residual):
asset.state = 'close'
else:
asset.state = 'open'
diff --git a/account_asset_management/models/account_asset_group.py b/account_asset_management/models/account_asset_group.py
new file mode 100644
index 000000000..d05870ce1
--- /dev/null
+++ b/account_asset_management/models/account_asset_group.py
@@ -0,0 +1,29 @@
+# Copyright 2009-2018 Noviat
+# Copyright 2019 Tecnativa - Pedro M. Baeza
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import api, fields, models
+
+
+class AccountAssetGroup(models.Model):
+ _name = 'account.asset.group'
+ _description = 'Asset Group'
+ _order = 'name'
+ _parent_store = True
+
+ name = fields.Char(string='Name', size=64, required=True, index=True)
+ code = fields.Char(index=True)
+ parent_path = fields.Char(index=True)
+ company_id = fields.Many2one(
+ comodel_name='res.company',
+ string='Company',
+ required=True,
+ default=lambda self: self._default_company_id())
+ parent_id = fields.Many2one(
+ comodel_name='account.asset.group',
+ string='Parent Asset Group',
+ ondelete='restrict')
+
+ @api.model
+ def _default_company_id(self):
+ return self.env['res.company']._company_default_get('account.asset')
diff --git a/account_asset_management/models/account_asset_profile.py b/account_asset_management/models/account_asset_profile.py
index 7b377a72c..f2f03fa17 100644
--- a/account_asset_management/models/account_asset_profile.py
+++ b/account_asset_management/models/account_asset_profile.py
@@ -47,10 +47,12 @@ class AccountAssetProfile(models.Model):
comodel_name='res.company',
string='Company', required=True,
default=lambda self: self._default_company_id())
- parent_id = fields.Many2one(
- comodel_name='account.asset',
- string='Parent Asset',
- domain=[('type', '=', 'view')])
+ group_ids = fields.Many2many(
+ comodel_name='account.asset.group',
+ relation="account_asset_profile_group_rel",
+ column1="profile_id",
+ column2="group_id",
+ string='Asset Groups')
method = fields.Selection(
selection=lambda self: self._selection_method(),
string='Computation Method',
diff --git a/account_asset_management/models/account_invoice.py b/account_asset_management/models/account_invoice.py
index 188bbe1fb..f5229f1be 100644
--- a/account_asset_management/models/account_invoice.py
+++ b/account_asset_management/models/account_invoice.py
@@ -131,8 +131,7 @@ class AccountInvoiceLine(models.Model):
asset_id = fields.Many2one(
comodel_name='account.asset',
string='Asset',
- domain=[('type', '=', 'normal'),
- ('state', 'in', ['open', 'close'])],
+ 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 "
diff --git a/account_asset_management/security/account_asset_security.xml b/account_asset_management/security/account_asset_security.xml
index 637848751..7b1587643 100644
--- a/account_asset_management/security/account_asset_security.xml
+++ b/account_asset_management/security/account_asset_security.xml
@@ -16,5 +16,12 @@
['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]
+
+ Account Asset Group multi-company
+
+
+ ['|', ('company_id', '=', False), ('company_id', 'child_of', [user.company_id.id])]
+
+
diff --git a/account_asset_management/security/ir.model.access.csv b/account_asset_management/security/ir.model.access.csv
index 4cee0e2e0..9ea3d8171 100644
--- a/account_asset_management/security/ir.model.access.csv
+++ b/account_asset_management/security/ir.model.access.csv
@@ -10,4 +10,6 @@ access_account_asset_line_user,account.asset.line,model_account_asset_line,accou
access_account_asset_line_manager,account.asset.line,model_account_asset_line,account.group_account_manager,1,1,1,1
access_account_asset_recompute_trigger_user,account.asset.recompute.trigger,model_account_asset_recompute_trigger,account.group_account_user,1,1,1,1
access_account_asset_recompute_trigger_manager,account.asset.recompute.trigger,model_account_asset_recompute_trigger,account.group_account_manager,1,1,1,1
-
+access_account_asset_group_invoice,account.asset.group,model_account_asset_group,account.group_account_invoice,1,0,0,0
+access_account_asset_group_user,account.asset.group,model_account_asset_group,account.group_account_user,1,0,0,0
+access_account_asset_group_manager,account.asset.group,model_account_asset_group,account.group_account_manager,1,1,1,1
diff --git a/account_asset_management/tests/account_asset_test_data.xml b/account_asset_management/tests/account_asset_test_data.xml
index e65a276da..c6883f166 100644
--- a/account_asset_management/tests/account_asset_test_data.xml
+++ b/account_asset_management/tests/account_asset_test_data.xml
@@ -16,35 +16,9 @@
-
-
-
- view
- open
- Financial Assets
-
-
-
-
- view
- open
- ICT
-
-
-
-
-
- view
- open
- Vehicles
-
-
-
-
-
@@ -56,7 +30,6 @@
-
@@ -70,7 +43,6 @@
-
draft
year
@@ -83,7 +55,6 @@
-
draft
year
diff --git a/account_asset_management/views/account_asset.xml b/account_asset_management/views/account_asset.xml
index 6840a97bb..8c28fe939 100644
--- a/account_asset_management/views/account_asset.xml
+++ b/account_asset_management/views/account_asset.xml
@@ -8,19 +8,17 @@