From 73616d6b3366bd357c4df162349ac3ddff429232 Mon Sep 17 00:00:00 2001 From: Saqib Date: Thu, 14 Nov 2019 10:09:44 +0530 Subject: [PATCH] fix: duplication while bulk creation of item tax template (#19570) --- .../move_item_tax_to_item_tax_template.py | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py index 412f32030ae..f25b9eaf521 100644 --- a/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py +++ b/erpnext/patches/v12_0/move_item_tax_to_item_tax_template.py @@ -1,20 +1,30 @@ import frappe import json from six import iteritems +from frappe.model.naming import make_autoname def execute(): if "tax_type" not in frappe.db.get_table_columns("Item Tax"): return old_item_taxes = {} item_tax_templates = {} - rename_template_to_untitled = [] + + frappe.reload_doc("accounts", "doctype", "item_tax_template_detail", force=1) + frappe.reload_doc("accounts", "doctype", "item_tax_template", force=1) + existing_templates = frappe.db.sql("""select template.name, details.tax_type, details.tax_rate + from `tabItem Tax Template` template, `tabItem Tax Template Detail` details + where details.parent=template.name + """, as_dict=1) + + if len(existing_templates): + for d in existing_templates: + item_tax_templates.setdefault(d.name, {}) + item_tax_templates[d.name][d.tax_type] = d.tax_rate for d in frappe.db.sql("""select parent as item_code, tax_type, tax_rate from `tabItem Tax`""", as_dict=1): old_item_taxes.setdefault(d.item_code, []) old_item_taxes[d.item_code].append(d) - frappe.reload_doc("accounts", "doctype", "item_tax_template_detail", force=1) - frappe.reload_doc("accounts", "doctype", "item_tax_template", force=1) frappe.reload_doc("stock", "doctype", "item", force=1) frappe.reload_doc("stock", "doctype", "item_tax", force=1) frappe.reload_doc("selling", "doctype", "quotation_item", force=1) @@ -27,6 +37,8 @@ def execute(): frappe.reload_doc("accounts", "doctype", "purchase_invoice_item", force=1) frappe.reload_doc("accounts", "doctype", "accounts_settings", force=1) + frappe.db.auto_commit_on_many_writes = True + # for each item that have item tax rates for item_code in old_item_taxes.keys(): # make current item's tax map @@ -34,8 +46,7 @@ def execute(): for d in old_item_taxes[item_code]: item_tax_map[d.tax_type] = d.tax_rate - item_tax_template_name = get_item_tax_template(item_tax_templates, rename_template_to_untitled, - item_tax_map, item_code) + item_tax_template_name = get_item_tax_template(item_tax_templates, item_tax_map, item_code) # update the item tax table item = frappe.get_doc("Item", item_code) @@ -49,35 +60,33 @@ def execute(): 'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice', 'Supplier Quotation', 'Purchase Order', 'Purchase Receipt', 'Purchase Invoice' ] + for dt in doctypes: for d in frappe.db.sql("""select name, parent, item_code, item_tax_rate from `tab{0} Item` - where ifnull(item_tax_rate, '') not in ('', '{{}}')""".format(dt), as_dict=1): + where ifnull(item_tax_rate, '') not in ('', '{{}}') + and item_tax_template is NULL""".format(dt), as_dict=1): item_tax_map = json.loads(d.item_tax_rate) - item_tax_template = get_item_tax_template(item_tax_templates, rename_template_to_untitled, + item_tax_template_name = get_item_tax_template(item_tax_templates, item_tax_map, d.item_code, d.parent) - frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template) + frappe.db.set_value(dt + " Item", d.name, "item_tax_template", item_tax_template_name) - idx = 1 - for oldname in rename_template_to_untitled: - frappe.rename_doc("Item Tax Template", oldname, "Untitled {}".format(idx)) - idx += 1 + frappe.db.auto_commit_on_many_writes = False settings = frappe.get_single("Accounts Settings") settings.add_taxes_from_item_tax_template = 0 settings.determine_address_tax_category_from = "Billing Address" settings.save() -def get_item_tax_template(item_tax_templates, rename_template_to_untitled, item_tax_map, item_code, parent=None): +def get_item_tax_template(item_tax_templates, item_tax_map, item_code, parent=None): # search for previously created item tax template by comparing tax maps for template, item_tax_template_map in iteritems(item_tax_templates): if item_tax_map == item_tax_template_map: - if not parent: - rename_template_to_untitled.append(template) return template # if no item tax template found, create one item_tax_template = frappe.new_doc("Item Tax Template") - item_tax_template.title = "{}--{}".format(parent, item_code) if parent else "Item-{}".format(item_code) + item_tax_template.title = make_autoname("Item Tax Template-.####") + for tax_type, tax_rate in iteritems(item_tax_map): if not frappe.db.exists("Account", tax_type): parts = tax_type.strip().split(" - ")