mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-27 08:54:45 +00:00
fix: duplication while bulk creation of item tax template (#19570)
This commit is contained in:
@@ -1,20 +1,30 @@
|
|||||||
import frappe
|
import frappe
|
||||||
import json
|
import json
|
||||||
from six import iteritems
|
from six import iteritems
|
||||||
|
from frappe.model.naming import make_autoname
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
if "tax_type" not in frappe.db.get_table_columns("Item Tax"):
|
if "tax_type" not in frappe.db.get_table_columns("Item Tax"):
|
||||||
return
|
return
|
||||||
old_item_taxes = {}
|
old_item_taxes = {}
|
||||||
item_tax_templates = {}
|
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):
|
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.setdefault(d.item_code, [])
|
||||||
old_item_taxes[d.item_code].append(d)
|
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", force=1)
|
||||||
frappe.reload_doc("stock", "doctype", "item_tax", force=1)
|
frappe.reload_doc("stock", "doctype", "item_tax", force=1)
|
||||||
frappe.reload_doc("selling", "doctype", "quotation_item", 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", "purchase_invoice_item", force=1)
|
||||||
frappe.reload_doc("accounts", "doctype", "accounts_settings", 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 each item that have item tax rates
|
||||||
for item_code in old_item_taxes.keys():
|
for item_code in old_item_taxes.keys():
|
||||||
# make current item's tax map
|
# make current item's tax map
|
||||||
@@ -34,8 +46,7 @@ def execute():
|
|||||||
for d in old_item_taxes[item_code]:
|
for d in old_item_taxes[item_code]:
|
||||||
item_tax_map[d.tax_type] = d.tax_rate
|
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_template_name = get_item_tax_template(item_tax_templates, item_tax_map, item_code)
|
||||||
item_tax_map, item_code)
|
|
||||||
|
|
||||||
# update the item tax table
|
# update the item tax table
|
||||||
item = frappe.get_doc("Item", item_code)
|
item = frappe.get_doc("Item", item_code)
|
||||||
@@ -49,35 +60,33 @@ def execute():
|
|||||||
'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice',
|
'Quotation', 'Sales Order', 'Delivery Note', 'Sales Invoice',
|
||||||
'Supplier Quotation', 'Purchase Order', 'Purchase Receipt', 'Purchase Invoice'
|
'Supplier Quotation', 'Purchase Order', 'Purchase Receipt', 'Purchase Invoice'
|
||||||
]
|
]
|
||||||
|
|
||||||
for dt in doctypes:
|
for dt in doctypes:
|
||||||
for d in frappe.db.sql("""select name, parent, item_code, item_tax_rate from `tab{0} Item`
|
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_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)
|
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
|
frappe.db.auto_commit_on_many_writes = False
|
||||||
for oldname in rename_template_to_untitled:
|
|
||||||
frappe.rename_doc("Item Tax Template", oldname, "Untitled {}".format(idx))
|
|
||||||
idx += 1
|
|
||||||
|
|
||||||
settings = frappe.get_single("Accounts Settings")
|
settings = frappe.get_single("Accounts Settings")
|
||||||
settings.add_taxes_from_item_tax_template = 0
|
settings.add_taxes_from_item_tax_template = 0
|
||||||
settings.determine_address_tax_category_from = "Billing Address"
|
settings.determine_address_tax_category_from = "Billing Address"
|
||||||
settings.save()
|
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
|
# search for previously created item tax template by comparing tax maps
|
||||||
for template, item_tax_template_map in iteritems(item_tax_templates):
|
for template, item_tax_template_map in iteritems(item_tax_templates):
|
||||||
if item_tax_map == item_tax_template_map:
|
if item_tax_map == item_tax_template_map:
|
||||||
if not parent:
|
|
||||||
rename_template_to_untitled.append(template)
|
|
||||||
return template
|
return template
|
||||||
|
|
||||||
# if no item tax template found, create one
|
# if no item tax template found, create one
|
||||||
item_tax_template = frappe.new_doc("Item Tax Template")
|
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):
|
for tax_type, tax_rate in iteritems(item_tax_map):
|
||||||
if not frappe.db.exists("Account", tax_type):
|
if not frappe.db.exists("Account", tax_type):
|
||||||
parts = tax_type.strip().split(" - ")
|
parts = tax_type.strip().split(" - ")
|
||||||
|
|||||||
Reference in New Issue
Block a user