mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
Merge pull request #112 from acsone/8.0-account_chart_update-impr-sbi
[8.0] account_chart_update: several improvements and fixes
This commit is contained in:
@@ -23,4 +23,6 @@
|
||||
"""
|
||||
Account Chart Update Wizard
|
||||
"""
|
||||
|
||||
from . import model
|
||||
from . import wizard
|
||||
|
||||
1
account_chart_update/model/__init__.py
Normal file
1
account_chart_update/model/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import account_tax_code
|
||||
27
account_chart_update/model/account_tax_code.py
Normal file
27
account_chart_update/model/account_tax_code.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (c) 2014 ACSONE SA/NV (http://acsone.eu)
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as published
|
||||
# by the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
from openerp import models, fields
|
||||
|
||||
|
||||
class AccountTaxCode(models.Model):
|
||||
_inherit = 'account.tax.code'
|
||||
|
||||
active = fields.Boolean('Active', default=True)
|
||||
@@ -194,6 +194,14 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
'Updated fiscal positions',
|
||||
readonly=True
|
||||
),
|
||||
'deleted_tax_codes': fields.integer(
|
||||
'Deactivated tax codes',
|
||||
readonly=True
|
||||
),
|
||||
'deleted_taxes': fields.integer(
|
||||
'Deactivated taxes',
|
||||
readonly=True
|
||||
),
|
||||
'log': fields.text('Messages and Errors', readonly=True)
|
||||
}
|
||||
|
||||
@@ -337,7 +345,11 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
criteria = (['|', '|'] + criteria +
|
||||
[('description', '=', tax_templ.description),
|
||||
('name', '=', tax_templ.description)])
|
||||
tax_ids = tax_obj.search(cr, uid, criteria, context=context)
|
||||
criteria += [('company_id', '=', wizard.company_id.id)]
|
||||
# search inactive taxes too, to avoid re-creating
|
||||
# taxes that have been deactivated before
|
||||
search_context = dict(context, active_test=False)
|
||||
tax_ids = tax_obj.search(cr, uid, criteria, context=search_context)
|
||||
tax_templ_mapping[tax_templ.id] = tax_ids and tax_ids[0] or False
|
||||
return tax_templ_mapping[tax_templ.id]
|
||||
|
||||
@@ -353,24 +365,25 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
return False
|
||||
if tax_code_templ_mapping.get(tax_code_template.id):
|
||||
return tax_code_templ_mapping[tax_code_template.id]
|
||||
# In other case
|
||||
# prepare a search context in order to
|
||||
# search inactive tax codes too, to avoid re-creating
|
||||
# tax codes that have been deactivated before
|
||||
search_context = dict(context, active_test=False)
|
||||
tax_code_obj = self.pool['account.tax.code']
|
||||
root_tax_code_id = wizard.chart_template_id.tax_code_root_id.id
|
||||
tax_code_name = ((tax_code_template.id == root_tax_code_id) and
|
||||
wizard.company_id.name or tax_code_template.name)
|
||||
tax_code_ids = tax_code_obj.search(cr, uid, [
|
||||
('name', '=', tax_code_name),
|
||||
('company_id', '=', wizard.company_id.id)
|
||||
], context=context)
|
||||
if not tax_code_ids:
|
||||
# if we could not match no tax code template name,
|
||||
# try to match on tax code template code, if any
|
||||
tax_code_code = tax_code_template.code
|
||||
if tax_code_code:
|
||||
tax_code_ids = tax_code_obj.search(cr, uid, [
|
||||
('code', '=', tax_code_code),
|
||||
('company_id', '=', wizard.company_id.id)
|
||||
], context=context)
|
||||
tax_code_code = tax_code_template.code
|
||||
if tax_code_code:
|
||||
tax_code_ids = tax_code_obj.search(cr, uid, [
|
||||
('code', '=', tax_code_code),
|
||||
('company_id', '=', wizard.company_id.id)
|
||||
], context=search_context)
|
||||
if not tax_code_code or not tax_code_ids:
|
||||
tax_code_name = ((tax_code_template.id == root_tax_code_id) and
|
||||
wizard.company_id.name or tax_code_template.name)
|
||||
tax_code_ids = tax_code_obj.search(cr, uid, [
|
||||
('name', '=', tax_code_name),
|
||||
('company_id', '=', wizard.company_id.id)
|
||||
], context=search_context)
|
||||
tax_code_templ_mapping[tax_code_template.id] = (tax_code_ids and
|
||||
tax_code_ids[0] or
|
||||
False)
|
||||
@@ -416,6 +429,21 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
fp_templ_mapping[fp_template.id] = fp_ids and fp_ids[0] or False
|
||||
return fp_templ_mapping[fp_template.id]
|
||||
|
||||
def _get_depth_first_tax_code_template_ids(self, cr, uid, root_tax_code_id,
|
||||
context=None):
|
||||
tax_code_templ_obj = self.pool['account.tax.code.template']
|
||||
|
||||
def get_children(tct):
|
||||
for child in tct.child_ids:
|
||||
res.append(child.id)
|
||||
get_children(child)
|
||||
|
||||
tct = tax_code_templ_obj.browse(cr, uid, root_tax_code_id,
|
||||
context=context)
|
||||
res = [tct.id]
|
||||
get_children(tct)
|
||||
return res
|
||||
|
||||
def _find_tax_codes(self, cr, uid, wizard, chart_template_ids,
|
||||
context=None):
|
||||
"""
|
||||
@@ -436,9 +464,9 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
wiz_tax_code_obj.unlink(cr, uid, wiz_tax_code_obj.search(cr, uid, []))
|
||||
# Search for new / updated tax codes
|
||||
root_tax_code_id = wizard.chart_template_id.tax_code_root_id.id
|
||||
children_tax_code_template = tax_code_templ_obj.search(cr, uid, [(
|
||||
'parent_id', 'child_of', [root_tax_code_id])], order='id',
|
||||
context=context)
|
||||
children_tax_code_template = \
|
||||
self._get_depth_first_tax_code_template_ids(
|
||||
cr, uid, root_tax_code_id, context=context)
|
||||
for tax_code_template in tax_code_templ_obj.browse(
|
||||
cr, uid,
|
||||
children_tax_code_template, context=context):
|
||||
@@ -463,6 +491,9 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
notes = ""
|
||||
tax_code = tax_code_obj.browse(
|
||||
cr, uid, tax_code_id, context=context)
|
||||
if tax_code.name != tax_code_template.name:
|
||||
notes += _("The name field is different.\n")
|
||||
modified = True
|
||||
if tax_code.code != tax_code_template.code:
|
||||
notes += _("The code field is different.\n")
|
||||
modified = True
|
||||
@@ -472,7 +503,18 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
if tax_code.sign != tax_code_template.sign:
|
||||
notes += _("The sign field is different.\n")
|
||||
modified = True
|
||||
# TODO: We could check other account fields for changes...
|
||||
if tax_code.notprintable != tax_code_template.notprintable:
|
||||
notes += _("The notprintable field is different.\n")
|
||||
modified = True
|
||||
if tax_code.sequence != tax_code_template.sequence:
|
||||
notes += _("The sequence field is different.\n")
|
||||
modified = True
|
||||
if tax_code.parent_id.id != self._map_tax_code_template(
|
||||
cr, uid, wizard,
|
||||
tax_code_template_mapping,
|
||||
tax_code_template.parent_id, context=context):
|
||||
notes += _("The parent field is different.\n")
|
||||
modified = True
|
||||
if modified:
|
||||
# Tax code to update.
|
||||
updated_tax_codes += 1
|
||||
@@ -483,6 +525,24 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
'update_tax_code_id': tax_code_id,
|
||||
'notes': notes,
|
||||
}, context)
|
||||
# search for tax codes not in the template
|
||||
# and propose them for deletion
|
||||
tax_code_ids = tax_code_obj.\
|
||||
search(cr, uid, [('company_id', '=', wizard.company_id.id)],
|
||||
context=context)
|
||||
tax_code_ids = set(tax_code_ids)
|
||||
template_tax_code_ids = set(tax_code_template_mapping.values())
|
||||
tax_code_ids_to_delete = tax_code_ids - template_tax_code_ids
|
||||
for tax_code_id in tax_code_ids_to_delete:
|
||||
updated_tax_codes += 1
|
||||
wiz_tax_code_obj.create(cr, uid, {
|
||||
'tax_code_id': False,
|
||||
'update_chart_wizard_id': wizard.id,
|
||||
'type': 'deleted',
|
||||
'update_tax_code_id': tax_code_id,
|
||||
'notes': "To deactivate: not in the template",
|
||||
}, context)
|
||||
|
||||
return {
|
||||
'new': new_tax_codes,
|
||||
'updated': updated_tax_codes,
|
||||
@@ -499,6 +559,8 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
new_taxes = 0
|
||||
updated_taxes = 0
|
||||
tax_templ_mapping = {}
|
||||
tax_code_template_mapping = {}
|
||||
acc_templ_mapping = {}
|
||||
tax_obj = self.pool['account.tax']
|
||||
tax_templ_obj = self.pool['account.tax.template']
|
||||
wiz_taxes_obj = self.pool['wizard.update.charts.accounts.tax']
|
||||
@@ -569,6 +631,46 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
if tax.type_tax_use != tax_templ.type_tax_use:
|
||||
notes += _("The type tax use field is different.\n")
|
||||
modified = True
|
||||
# compare tax code fields
|
||||
if tax.base_code_id.id != self._map_tax_code_template(
|
||||
cr, uid, wizard,
|
||||
tax_code_template_mapping,
|
||||
tax_templ.base_code_id, context=context):
|
||||
notes += _("The base_code_id field is different.\n")
|
||||
modified = True
|
||||
if tax.tax_code_id.id != self._map_tax_code_template(
|
||||
cr, uid, wizard,
|
||||
tax_code_template_mapping,
|
||||
tax_templ.tax_code_id, context=context):
|
||||
notes += _("The tax_code_id field is different.\n")
|
||||
modified = True
|
||||
if tax.ref_base_code_id.id != self._map_tax_code_template(
|
||||
cr, uid, wizard,
|
||||
tax_code_template_mapping,
|
||||
tax_templ.ref_base_code_id, context=context):
|
||||
notes += _("The ref_base_code_id field is different.\n")
|
||||
modified = True
|
||||
if tax.ref_tax_code_id.id != self._map_tax_code_template(
|
||||
cr, uid, wizard,
|
||||
tax_code_template_mapping,
|
||||
tax_templ.ref_tax_code_id, context=context):
|
||||
notes += _("The ref_tax_code_id field is different.\n")
|
||||
modified = True
|
||||
# compare tax account fields
|
||||
if tax.account_paid_id.id != self._map_account_template(
|
||||
cr, uid, wizard,
|
||||
acc_templ_mapping,
|
||||
tax_templ.account_paid_id,
|
||||
context=context):
|
||||
notes += _("The account_paid field is different.\n")
|
||||
modified = True
|
||||
if tax.account_collected_id.id != self._map_account_template(
|
||||
cr, uid, wizard,
|
||||
acc_templ_mapping,
|
||||
tax_templ.account_collected_id,
|
||||
context=context):
|
||||
notes += _("The account_collected field is different.\n")
|
||||
modified = True
|
||||
# TODO: We could check other tax fields for changes...
|
||||
if modified:
|
||||
# Tax code to update.
|
||||
@@ -582,6 +684,23 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
}, context)
|
||||
for delay_vals_wiz in delay_wiz_tax:
|
||||
wiz_taxes_obj.create(cr, uid, delay_vals_wiz, context)
|
||||
# search for taxes not in the template
|
||||
# and propose them for deletion
|
||||
tax_ids = tax_obj.\
|
||||
search(cr, uid, [('company_id', '=', wizard.company_id.id)],
|
||||
context=context)
|
||||
tax_ids = set(tax_ids)
|
||||
template_tax_ids = set(tax_templ_mapping.values())
|
||||
tax_ids_to_delete = tax_ids - template_tax_ids
|
||||
for tax_id in tax_ids_to_delete:
|
||||
updated_taxes += 1
|
||||
wiz_taxes_obj.create(cr, uid, {
|
||||
'tax_id': False,
|
||||
'update_chart_wizard_id': wizard.id,
|
||||
'type': 'deleted',
|
||||
'update_tax_id': tax_id,
|
||||
'notes': "To deactivate: not in the template",
|
||||
}, context)
|
||||
|
||||
return {'new': new_taxes,
|
||||
'updated': updated_taxes,
|
||||
@@ -848,7 +967,10 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
new_tax_codes = 0
|
||||
updated_tax_codes = 0
|
||||
tax_code_template_mapping = {}
|
||||
# process new/updated
|
||||
for wiz_tax_code in wizard.tax_code_ids:
|
||||
if wiz_tax_code.type == 'deleted':
|
||||
continue
|
||||
tax_code_template = wiz_tax_code.tax_code_id
|
||||
tax_code_name = ((root_tax_code_id == tax_code_template.id) and
|
||||
wizard.company_id.name or tax_code_template.name)
|
||||
@@ -867,6 +989,8 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
tax_code_template_mapping.get(p_id)),
|
||||
'company_id': wizard.company_id.id,
|
||||
'sign': tax_code_template.sign,
|
||||
'notprintable': tax_code_template.notprintable,
|
||||
'sequence': tax_code_template.sequence,
|
||||
}
|
||||
tax_code_id = None
|
||||
modified = False
|
||||
@@ -900,9 +1024,19 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
tax_code_name, tax_code_template.parent_id.name),
|
||||
True
|
||||
)
|
||||
# process deleted
|
||||
tax_code_ids_to_delete = [wtc.update_tax_code_id.id
|
||||
for wtc in wizard.tax_code_ids
|
||||
if wtc.type == 'deleted']
|
||||
taxcodes.write(cr, uid, tax_code_ids_to_delete,
|
||||
{'active': False},
|
||||
context=context)
|
||||
log.add(_("Deactivated %d tax codes\n" % len(tax_code_ids_to_delete)))
|
||||
deleted_tax_codes = len(tax_code_ids_to_delete)
|
||||
return {
|
||||
'new': new_tax_codes,
|
||||
'updated': updated_tax_codes,
|
||||
'deleted': deleted_tax_codes,
|
||||
'mapping': tax_code_template_mapping
|
||||
}
|
||||
|
||||
@@ -917,6 +1051,8 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
tax_template_mapping = {}
|
||||
taxes_pending_for_accounts = {}
|
||||
for wiz_tax in wizard.tax_ids:
|
||||
if wiz_tax.type == 'deleted':
|
||||
continue
|
||||
tax_template = wiz_tax.tax_id
|
||||
# Ensure the parent tax template is on the map.
|
||||
self._map_tax_template(cr, uid, wizard, tax_template_mapping,
|
||||
@@ -1058,9 +1194,19 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
),
|
||||
True
|
||||
)
|
||||
# process deleted
|
||||
tax_ids_to_delete = [wtc.update_tax_id.id
|
||||
for wtc in wizard.tax_ids
|
||||
if wtc.type == 'deleted']
|
||||
taxes.write(cr, uid, tax_ids_to_delete,
|
||||
{'active': False},
|
||||
context=context)
|
||||
log.add(_("Deactivated %d taxes\n" % len(tax_ids_to_delete)))
|
||||
deleted_taxes = len(tax_ids_to_delete)
|
||||
return {
|
||||
'new': new_taxes,
|
||||
'updated': updated_taxes,
|
||||
'deleted': deleted_taxes,
|
||||
'mapping': tax_template_mapping,
|
||||
'pending': taxes_pending_for_accounts
|
||||
}
|
||||
@@ -1436,7 +1582,7 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
accounts_res = self._update_accounts(cr, uid, wizard, log,
|
||||
taxes_res['mapping'],
|
||||
context=context)
|
||||
if wizard.update_tax and wizard.update_account:
|
||||
if wizard.update_tax:
|
||||
self._update_taxes_pending_for_accounts(cr, uid, wizard, log,
|
||||
taxes_res['pending'],
|
||||
accounts_res['mapping'],
|
||||
@@ -1461,6 +1607,8 @@ class wizard_update_charts_accounts(orm.TransientModel):
|
||||
'updated_taxes': taxes_res.get('updated', 0),
|
||||
'updated_accounts': accounts_res.get('updated', 0),
|
||||
'updated_fps': fps_res.get('updated', 0),
|
||||
'deleted_tax_codes': tax_codes_res.get('deleted', 0),
|
||||
'deleted_taxes': taxes_res.get('deleted', 0),
|
||||
'log': log(),
|
||||
}, context=context)
|
||||
return _reopen(self, wizard.id, 'wizard.update.chart.accounts')
|
||||
@@ -1477,7 +1625,6 @@ class wizard_update_charts_accounts_tax_code(orm.TransientModel):
|
||||
'tax_code_id': fields.many2one(
|
||||
'account.tax.code.template',
|
||||
'Tax code template',
|
||||
required=True,
|
||||
ondelete='set null'
|
||||
),
|
||||
'update_chart_wizard_id': fields.many2one(
|
||||
@@ -1487,8 +1634,9 @@ class wizard_update_charts_accounts_tax_code(orm.TransientModel):
|
||||
ondelete='cascade'
|
||||
),
|
||||
'type': fields.selection([
|
||||
('new', 'New template'),
|
||||
('updated', 'Updated template'),
|
||||
('new', 'New tax code'),
|
||||
('updated', 'Updated tax code'),
|
||||
('deleted', 'Tax code to deactivate'),
|
||||
], 'Type'),
|
||||
'update_tax_code_id': fields.many2one(
|
||||
'account.tax.code',
|
||||
@@ -1513,7 +1661,6 @@ class wizard_update_charts_accounts_tax(orm.TransientModel):
|
||||
'tax_id': fields.many2one(
|
||||
'account.tax.template',
|
||||
'Tax template',
|
||||
required=True,
|
||||
ondelete='set null'
|
||||
),
|
||||
'update_chart_wizard_id': fields.many2one(
|
||||
@@ -1525,6 +1672,7 @@ class wizard_update_charts_accounts_tax(orm.TransientModel):
|
||||
'type': fields.selection([
|
||||
('new', 'New template'),
|
||||
('updated', 'Updated template'),
|
||||
('deleted', 'Tax to deactivate'),
|
||||
], 'Type'),
|
||||
'update_tax_id': fields.many2one(
|
||||
'account.tax',
|
||||
|
||||
@@ -113,6 +113,10 @@
|
||||
<field name="updated_accounts" />
|
||||
<field name="updated_fps" />
|
||||
</group>
|
||||
<group colspan="4">
|
||||
<separator colspan="4" string="Summary of deleted objects" />
|
||||
<field name="deleted_tax_codes" />
|
||||
</group>
|
||||
</group>
|
||||
|
||||
<footer>
|
||||
|
||||
Reference in New Issue
Block a user