from __future__ import unicode_literals import frappe from frappe.utils import flt from erpnext.controllers.taxes_and_totals import get_itemised_tax from six import iteritems def update_itemised_tax_data(doc): if not doc.taxes: return itemised_tax = get_itemised_tax(doc.taxes) for row in doc.items: tax_rate = 0.0 item_tax_rate = 0.0 if row.item_tax_rate: item_tax_rate = frappe.parse_json(row.item_tax_rate) # First check if tax rate is present # If not then look up in item_wise_tax_detail if item_tax_rate: for account, rate in iteritems(item_tax_rate): tax_rate += rate elif row.item_code and itemised_tax.get(row.item_code): tax_rate = sum([tax.get('tax_rate', 0) for d, tax in itemised_tax.get(row.item_code).items()]) row.tax_rate = flt(tax_rate, row.precision("tax_rate")) row.tax_amount = flt((row.net_amount * tax_rate) / 100, row.precision("net_amount")) row.total_amount = flt((row.net_amount + row.tax_amount), row.precision("total_amount"))