Version 8 Upgrade Error - Tax_id

Getting this error in multiple servers:

Traceback (most recent call last):
File “/usr/lib/python2.7/runpy.py”, line 162, in _run_module_as_main
main”, fname, loader, pkg_name)
File “/usr/lib/python2.7/runpy.py”, line 72, in _run_code
exec code in run_globals
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 79, in
main()
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 16, in main
click.Group(commands=commands)(prog_name=‘bench’)
File “/home/ubuntu/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 664, in call
return self.main(*args, **kwargs)
File “/home/ubuntu/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 644, in main
rv = self.invoke(ctx)
File “/home/ubuntu/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 991, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/ubuntu/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 991, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/ubuntu/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 837, in invoke
return ctx.invoke(self.callback, **ctx.params)
File “/home/ubuntu/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 464, in invoke
return callback(*args, **kwargs)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/commands/init.py”, line 24, in _func
ret = f(frappe.dict(ctx.obj), *args, **kwargs)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/commands/site.py”, line 210, in migrate
migrate(context.verbose, rebuild_website=rebuild_website)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/migrate.py”, line 35, in migrate
sync_fixtures()
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/utils/fixtures.py”, line 24, in sync_fixtures
ignore_links=True, overwrite=True)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/core/page/data_import_tool/data_import_tool.py”, line 95, in import_doc
frappe.modules.import_file.import_file_by_path(f, data_import=True, force=True, pre_process=pre_process, reset_permissions=True)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/modules/import_file.py”, line 58, in import_file_by_path
ignore_version=ignore_version, reset_permissions=reset_permissions)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/modules/import_file.py”, line 129, in import_doc
doc.insert()
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/model/document.py”, line 220, in insert
self.run_post_save_methods()
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/model/document.py”, line 790, in run_post_save_methods
self.run_method(“on_update”)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/model/document.py”, line 667, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/model/document.py”, line 892, in composer
return composed(self, method, *args, **kwargs)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/model/document.py”, line 875, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/model/document.py”, line 661, in
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py”, line 47, in on_update
validate_fields_for_doctype(self.dt)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 361, in validate_fields_for_doctype
validate_fields(frappe.get_meta(doctype, cached=False))
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 575, in validate_fields
check_unique_fieldname(d.fieldname)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 388, in check_unique_fieldname
frappe.throw(
(“Fieldname {0} appears multiple times in rows {1}”).format(fieldname, ", ".join(duplicates)))
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/init.py”, line 316, in throw
msgprint(msg, raise_exception=exc, title=title, indicator=‘red’)
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/init.py”, line 306, in msgprint
_raise_exception()
File “/home/ubuntu/frappe-bench/apps/frappe/frappe/init.py”, line 279, in _raise_exception
raise raise_exception, encode(msg)
frappe.exceptions.ValidationError: Fieldname tax_id appears multiple times in rows 9, 38

Are there any custom fields?
Is there any tax_id field in custom_field.json in fixtures?

Note: Generally i add prefix to fields added on ERPNext or Frappe DocTypes .
Eg. acme_tax_id

I typically add Customer TIN. But there is a standard field called Tax ID in the customer master, right? Is that what’s causing the problem?

Thanks

Jay

Has the Tax ID field been introduced in any new document in ver 8?

I know ver 7 had Tax ID as a standard field in thhe Customer DocType. Has it been introduced in say, Delivery Note or Sales Invoice?

Thanks

Jay

You know, sometimes it seems like I’m talking to myself.

I figured out that I’d pulled the Tax ID value from the Customer Master into other documents such as Sales Order, Delivery Note and Sales Invoice. So, I dropped those columns in the appropriate database using the Database commands (Couldn’t delete the custom fields on ERPNext intergface as I was stuck between versions.

Now when I run bench update it is failing with the error message at the end of this post. Each time I run bench update I get the same error message and log back into the database I see a new field created on Tax ID in Sales Order and it fails again.

I drop this column again and run bench update again, it does the same thing and I seem to have a closed loop.

Any ideas how I can get out of it?

Thanks

Jay

Error Message:

File “/usr/lib/python2.7/runpy.py”, line 174, in _run_module_as_main
main”, fname, loader, pkg_name)
File “/usr/lib/python2.7/runpy.py”, line 72, in _run_code
exec code in run_globals
File “/home/jay/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 79, in
main()
File “/home/jay/frappe-bench/apps/frappe/frappe/utils/bench_helper.py”, line 16, in main
click.Group(commands=commands)(prog_name=‘bench’)
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 716, in call
return self.main(*args, **kwargs)
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 696, in main
rv = self.invoke(ctx)
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 1060, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 1060, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 889, in invoke
return ctx.invoke(self.callback, **ctx.params)
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/core.py”, line 534, in invoke
return callback(*args, **kwargs)
File “/home/jay/frappe-bench/env/local/lib/python2.7/site-packages/click/decorators.py”, line 17, in new_func
return f(get_current_context(), *args, **kwargs)
File “/home/jay/frappe-bench/apps/frappe/frappe/commands/init.py”, line 24, in _func
ret = f(frappe.dict(ctx.obj), *args, **kwargs)
File “/home/jay/frappe-bench/apps/frappe/frappe/commands/site.py”, line 210, in migrate
migrate(context.verbose, rebuild_website=rebuild_website)
File “/home/jay/frappe-bench/apps/frappe/frappe/migrate.py”, line 35, in migrate
sync_fixtures()
File “/home/jay/frappe-bench/apps/frappe/frappe/utils/fixtures.py”, line 24, in sync_fixtures
ignore_links=True, overwrite=True)
File “/home/jay/frappe-bench/apps/frappe/frappe/core/page/data_import_tool/data_import_tool.py”, line 95, in import_doc
frappe.modules.import_file.import_file_by_path(f, data_import=True, force=True, pre_process=pre_process, reset_permissions=True)
File “/home/jay/frappe-bench/apps/frappe/frappe/modules/import_file.py”, line 58, in import_file_by_path
ignore_version=ignore_version, reset_permissions=reset_permissions)
File “/home/jay/frappe-bench/apps/frappe/frappe/modules/import_file.py”, line 129, in import_doc
doc.insert()
File “/home/jay/frappe-bench/apps/frappe/frappe/model/document.py”, line 220, in insert
self.run_post_save_methods()
File “/home/jay/frappe-bench/apps/frappe/frappe/model/document.py”, line 790, in run_post_save_methods
self.run_method(“on_update”)
File “/home/jay/frappe-bench/apps/frappe/frappe/model/document.py”, line 667, in run_method
out = Document.hook(fn)(self, *args, **kwargs)
File “/home/jay/frappe-bench/apps/frappe/frappe/model/document.py”, line 892, in composer
return composed(self, method, *args, **kwargs)
File “/home/jay/frappe-bench/apps/frappe/frappe/model/document.py”, line 875, in runner
add_to_return_value(self, fn(self, *args, **kwargs))
File “/home/jay/frappe-bench/apps/frappe/frappe/model/document.py”, line 661, in
fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
File “/home/jay/frappe-bench/apps/frappe/frappe/custom/doctype/custom_field/custom_field.py”, line 47, in on_update
validate_fields_for_doctype(self.dt)
File “/home/jay/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 361, in validate_fields_for_doctype
validate_fields(frappe.get_meta(doctype, cached=False))
File “/home/jay/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 575, in validate_fields
check_unique_fieldname(d.fieldname)
File “/home/jay/frappe-bench/apps/frappe/frappe/core/doctype/doctype/doctype.py”, line 388, in check_unique_fieldname
frappe.throw(
(“Fieldname {0} appears multiple times in rows {1}”).format(fieldname, ", ".join(duplicates)))
File “/home/jay/frappe-bench/apps/frappe/frappe/init.py”, line 316, in throw
msgprint(msg, raise_exception=exc, title=title, indicator=‘red’)
File “/home/jay/frappe-bench/apps/frappe/frappe/init.py”, line 306, in msgprint
_raise_exception()
File “/home/jay/frappe-bench/apps/frappe/frappe/init.py”, line 279, in _raise_exception
raise raise_exception, encode(msg)
frappe.exceptions.ValidationError: Fieldname tax_id appears multiple times in rows 10, 33

Before dropping to the database commands, try entering bench console

fieldname appearing multiple times could mean it is in DocType as well as Custom Field.

If bench console is accessible try listing custom fields frappe.get_all("Custom Field", fields=["*"]) if there is any such field,

If there is a field delete it with frappe.delete_doc("Custom Field", docname)

2 Likes

On Sales Invoice I am getting this error

Fieldname tax_id appears multiple times in rows 7, 8

I am trying to delete the custom tax_id but it won’t let me. Any suggestions?

Thanks

Hello!

I’ve been there too! as reported in [v8] Duplicated tax_id · Issue #8267 · frappe/erpnext · GitHub

Solution:

Go to custom fields list and delete the field from there! (not on the personalize form, custom fields list ok?) Remember to do a backup of the information stored in tax_id to upload again in case something goes wrong.

Can we do a quick check while bench is being updated if there are existing fields with the same name as the fields that are being introduced, and rename such custom fields into something else?

I mean this could happen to anybody anytime right? And its an unfortunate, and eminently preventable, reason for for ERPNext not to be seamlessly upgradeable.

Or simply publish a document that lists the new fields being added.

Thanks

Jay

Hi revant_one,

I am facing the same issue here as Jay, but I am unable to delete the tax_id field.

I was able to access bench console but this function frappe.get_all("Custom Field", fields=["*"]) didnt show any field with tax__id.

So i modified the funnction to frappe.get_all("Customer", fields=["tax_id"]) and frappe.get_all("Customer", fields=["tax_id"]) respectively and it threw a list of tax__id’s.

How should I remove the tax__id field. not very familiar with frappe commands and I cant access the desk to delete since my version is stuck while upgrading.

Awaiting any help to solve this.

Thanks and regards
Ajit

Check if this helps?