diff --git a/account_chart_update/wizard/wizard_chart_update.py b/account_chart_update/wizard/wizard_chart_update.py
index 59d4bc2db..369ef6fc1 100644
--- a/account_chart_update/wizard/wizard_chart_update.py
+++ b/account_chart_update/wizard/wizard_chart_update.py
@@ -194,6 +194,10 @@ class wizard_update_charts_accounts(orm.TransientModel):
'Updated fiscal positions',
readonly=True
),
+ 'deleted_tax_codes': fields.integer(
+ 'Deleted tax codes',
+ readonly=True
+ ),
'log': fields.text('Messages and Errors', readonly=True)
}
@@ -495,6 +499,54 @@ 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 = tax_code_template_mapping.values()
+ template_tax_code_ids = set(template_tax_code_ids)
+ tax_code_ids_to_delete = tax_code_ids - template_tax_code_ids
+ if tax_code_ids_to_delete:
+ cr.execute("SELECT DISTINCT(tax_code_id) "
+ "FROM account_move_line "
+ "WHERE tax_code_id in %(tctd)s "
+ "UNION "
+ "SELECT DISTINCT(base_code_id) "
+ "FROM account_tax "
+ "WHERE base_code_id in %(tctd)s "
+ "UNION "
+ "SELECT DISTINCT(tax_code_id) "
+ "FROM account_tax "
+ "WHERE tax_code_id in %(tctd)s "
+ "UNION "
+ "SELECT DISTINCT(ref_base_code_id) "
+ "FROM account_tax "
+ "WHERE ref_base_code_id in %(tctd)s "
+ "UNION "
+ "SELECT DISTINCT(ref_tax_code_id) "
+ "FROM account_tax "
+ "WHERE ref_tax_code_id in %(tctd)s ",
+ {'tctd': tuple(tax_code_ids_to_delete)})
+ # do not delete tax codes which are in use, and their parents
+ tax_code_ids_to_keep = set([row[0] for row in cr.fetchall()])
+ for tax_code in tax_code_obj.\
+ browse(cr, uid, list(tax_code_ids_to_keep),
+ context=context):
+ while tax_code.parent_id:
+ tax_code_ids_to_keep.add(tax_code.parent_id.id)
+ tax_code = tax_code.parent_id
+ for tax_code_id in tax_code_ids_to_delete - tax_code_ids_to_keep:
+ 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 delete: not in the template and unused",
+ }, context)
+
return {
'new': new_tax_codes,
'updated': updated_tax_codes,
@@ -859,8 +911,12 @@ class wizard_update_charts_accounts(orm.TransientModel):
root_tax_code_id = wizard.chart_template_id.tax_code_root_id.id
new_tax_codes = 0
updated_tax_codes = 0
+ deleted_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)
@@ -914,9 +970,17 @@ 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.unlink(cr, uid, tax_code_ids_to_delete, context=context)
+ log.add(_("Deleted %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
}
@@ -1475,6 +1539,7 @@ 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),
'log': log(),
}, context=context)
return _reopen(self, wizard.id, 'wizard.update.chart.accounts')
@@ -1491,7 +1556,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(
@@ -1501,8 +1565,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 delete'),
], 'Type'),
'update_tax_code_id': fields.many2one(
'account.tax.code',
diff --git a/account_chart_update/wizard/wizard_chart_update_view.xml b/account_chart_update/wizard/wizard_chart_update_view.xml
index 91c7927d8..f4f1586e6 100644
--- a/account_chart_update/wizard/wizard_chart_update_view.xml
+++ b/account_chart_update/wizard/wizard_chart_update_view.xml
@@ -113,6 +113,10 @@
+
+
+
+