diff --git a/account_asset_management/__manifest__.py b/account_asset_management/__manifest__.py
index aec81acc3..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.2.0',
+ 'version': '12.0.2.0.0',
'license': 'AGPL-3',
'depends': [
'account',
diff --git a/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt
similarity index 100%
rename from account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis.txt
rename to account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis.txt
diff --git a/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt
similarity index 99%
rename from account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt
rename to account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt
index a633337c9..1f6b39c46 100644
--- a/account_asset_management/migrations/12.0.1.2.0/openupgrade_analysis_work.txt
+++ b/account_asset_management/migrations/12.0.1.0.0/openupgrade_analysis_work.txt
@@ -198,4 +198,4 @@ 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
+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.1.2.0/post-migration.py b/account_asset_management/migrations/12.0.1.2.0/post-migration.py
deleted file mode 100644
index 6f11df513..000000000
--- a/account_asset_management/migrations/12.0.1.2.0/post-migration.py
+++ /dev/null
@@ -1,125 +0,0 @@
-# Copyright 2019 Apps2GROW - Henrik Norlin
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-from openupgradelib import openupgrade
-import logging
-logger = logging.getLogger('OpenUpgrade')
-
-
-def create_asset_group(cr):
- view_to_group = {}
- cr.execute('''SELECT id, name, parent_id, company_id
- FROM account_asset WHERE type = 'view';''')
- for view in cr.fetchall():
- sql = '''INSERT INTO account_asset_group (name, parent_id, company_id)
- VALUES ('%s', %s, %s) returning id;''' % \
- (view[1], view[2] or 'NULL', view[3])
- cr.execute(sql)
- view_id = view[0]
- group_id = cr.fetchone()[0]
- view_to_group[view_id] = group_id
- return view_to_group
-
-
-def update_asset_and_asset_profile(cr, view_to_group):
- cr.execute('''UPDATE account_asset
- SET active = false
- WHERE type = 'view';''')
-
- for view_id, group_id in view_to_group.items():
- cr.execute('''UPDATE account_asset
- SET group_id = %s
- WHERE parent_id = %s;''' % (group_id, view_id))
-
- cr.execute('''UPDATE account_asset_profile
- SET group_id = %s
- WHERE parent_id = %s;''' % (group_id, view_id))
-
-
-def update_asset(cr):
- cr.execute('''SELECT a.id,
- a.openupgrade_legacy_12_0_method_number,
- a.openupgrade_legacy_12_0_method_period,
- p.account_analytic_id,
- a.company_id
- FROM account_asset a
- LEFT JOIN account_asset_profile p ON a.profile_id = p.id;
- ''')
- for asset in cr.fetchall():
- no_of_entries = asset[1]
- months_between_entries = asset[2]
-
- values = {}
- # Analytic account
- values['account_analytic_id'] = asset[3] or 'NULL'
- # Number of years
- values['method_number'] = \
- int(no_of_entries * months_between_entries / 12)
- # Period: month / quarter / year (default: year)
- if months_between_entries == 3:
- values['method_period'] = "'quarter'"
- elif months_between_entries == 1:
- values['method_period'] = "'month'"
-
- vals = ['%s = %s' % (key, value) for key, value in values.items()]
- sql = "UPDATE account_asset SET %s WHERE id = %s" % \
- (', '.join(vals), asset[0])
- logger.debug('update_asset: %s' % sql)
- cr.execute(sql)
-
-
-def update_asset_profile(cr):
- cr.execute('''SELECT id,
- openupgrade_legacy_12_0_method_number,
- openupgrade_legacy_12_0_method_period,
- company_id FROM account_asset_profile;''')
- for profile in cr.fetchall():
-
- no_of_entries = profile[1]
- months_between_entries = profile[2]
-
- values = {}
- # Number of years
- values['method_number'] = \
- int(no_of_entries * months_between_entries / 12)
- # Period: month / quarter / year (default: year)
- if months_between_entries == 3:
- values['method_period'] = "'quarter'"
- elif months_between_entries == 1:
- values['method_period'] = "'month'"
-
- vals = ['{} = {}'.format(key, value) for key, value in values.items()]
- sql = """UPDATE account_asset_profile
- SET %s WHERE id = %s""" % (', '.join(vals), profile[0])
- logger.debug('update_asset_profile: %s' % sql)
- cr.execute(sql)
-
-
-def update_move_line(cr):
- cr.execute("""SELECT l.move_id, l.asset_id, a.profile_id
- FROM account_asset_line l
- LEFT JOIN account_asset a ON l.asset_id = a.id
- WHERE l.move_id IS NOT NULL;""")
- for line in cr.fetchall():
- sql = """UPDATE account_move_line
- SET asset_id = %s, asset_profile_id = %s
- WHERE move_id = %s""" % (line[1], line[2], line[0])
- logger.debug('update_move_line: %s' % sql)
- cr.execute(sql)
-
-
-@openupgrade.migrate()
-def migrate(env, version):
- cr = env.cr
- cr.execute('''SELECT column_name
- FROM information_schema.columns
- WHERE table_name = 'account_asset'
- AND column_name = 'type';''')
- if cr.fetchone():
- # migrate from account_asset_management
- view_to_group = create_asset_group(cr)
- update_asset_and_asset_profile(cr, view_to_group)
- else:
- # migrate from account_asset
- update_asset(cr)
- update_asset_profile(cr)
- update_move_line(cr)
diff --git a/account_asset_management/migrations/12.0.1.2.0/pre-migration.py b/account_asset_management/migrations/12.0.1.2.0/pre-migration.py
deleted file mode 100644
index 56cf936b5..000000000
--- a/account_asset_management/migrations/12.0.1.2.0/pre-migration.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# Copyright 2019 Apps2GROW - Henrik Norlin
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-from openupgradelib import openupgrade
-
-_model_renames1 = [
- ('account.asset.category', 'account.asset.profile'),
- ('account.asset.depreciation.line', 'account.asset.line'),
-]
-
-_table_renames1 = [
- (old.replace('.', '_'), new.replace('.', '_'))
- for (old, new) in _model_renames1
-]
-
-_model_renames2 = [
- ('account.asset.asset', 'account.asset'),
-]
-
-_table_renames2 = [
- (old.replace('.', '_'), new.replace('.', '_'))
- for (old, new) in _model_renames2
-]
-
-_column_copies = {
- 'account_asset': [
- ('method_number', None, None),
- ('method_period', None, None),
- ],
- 'account_asset_profile': [
- ('method_number', None, None),
- ('method_period', None, 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
- cr.execute('''SELECT column_name
- FROM information_schema.columns
- WHERE table_name = 'account_asset'
- AND column_name = 'type';''')
- if cr.fetchone():
- # migrate from account_asset_management
- pass
- else:
- # migrate from account_asset
- openupgrade.rename_models(cr, _model_renames1)
- openupgrade.rename_tables(cr, _table_renames1)
- openupgrade.rename_models(cr, _model_renames2)
- openupgrade.rename_tables(cr, _table_renames2)
- openupgrade.copy_columns(cr, _column_copies)
- 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/account_asset.py b/account_asset_management/models/account_asset.py
index 3e15c7c8d..c2ef18192 100644
--- a/account_asset_management/models/account_asset.py
+++ b/account_asset_management/models/account_asset.py
@@ -80,9 +80,12 @@ class AccountAsset(models.Model):
readonly=True,
required=True,
states={'draft': [('readonly', False)]})
- group_id = fields.Many2one(
+ group_ids = fields.Many2many(
comodel_name='account.asset.group',
- string='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,
@@ -276,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')
diff --git a/account_asset_management/models/account_asset_group.py b/account_asset_management/models/account_asset_group.py
index c331ed919..d05870ce1 100644
--- a/account_asset_management/models/account_asset_group.py
+++ b/account_asset_management/models/account_asset_group.py
@@ -1,4 +1,5 @@
# 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
@@ -8,11 +9,15 @@ 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,
+ string='Company',
+ required=True,
default=lambda self: self._default_company_id())
parent_id = fields.Many2one(
comodel_name='account.asset.group',
diff --git a/account_asset_management/models/account_asset_profile.py b/account_asset_management/models/account_asset_profile.py
index 78ad71353..f2f03fa17 100644
--- a/account_asset_management/models/account_asset_profile.py
+++ b/account_asset_management/models/account_asset_profile.py
@@ -47,9 +47,12 @@ class AccountAssetProfile(models.Model):
comodel_name='res.company',
string='Company', required=True,
default=lambda self: self._default_company_id())
- group_id = fields.Many2one(
+ group_ids = fields.Many2many(
comodel_name='account.asset.group',
- string='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/views/account_asset.xml b/account_asset_management/views/account_asset.xml
index d2566e87e..8c28fe939 100644
--- a/account_asset_management/views/account_asset.xml
+++ b/account_asset_management/views/account_asset.xml
@@ -53,7 +53,7 @@
-
+
diff --git a/account_asset_management/views/account_asset_group.xml b/account_asset_management/views/account_asset_group.xml
index 8515fab14..27cb1e29f 100644
--- a/account_asset_management/views/account_asset_group.xml
+++ b/account_asset_management/views/account_asset_group.xml
@@ -10,6 +10,7 @@
+
@@ -22,8 +23,9 @@
account.asset.group.tree
account.asset.group
-
+
+
@@ -36,6 +38,7 @@
+
diff --git a/account_asset_management/views/account_asset_profile.xml b/account_asset_management/views/account_asset_profile.xml
index 18acff623..b6053505b 100644
--- a/account_asset_management/views/account_asset_profile.xml
+++ b/account_asset_management/views/account_asset_profile.xml
@@ -10,7 +10,7 @@
-
+