mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-15 12:55:10 +00:00
fix: initialize all tax columns to resolve Key error in item_wise_sales_register and item_wise_purchase_register reports (backport #53323) (#53582)
Co-authored-by: Lakshit Jain <ljain112@gmail.com> fix: initialize all tax columns to resolve Key error in `item_wise_sales_register` and `item_wise_purchase_register` reports (#53323)
This commit is contained in:
@@ -32,6 +32,7 @@ def _execute(filters=None, additional_table_columns=None):
|
|||||||
|
|
||||||
item_list = get_items(filters, additional_table_columns)
|
item_list = get_items(filters, additional_table_columns)
|
||||||
aii_account_map = get_aii_accounts()
|
aii_account_map = get_aii_accounts()
|
||||||
|
default_taxes = {}
|
||||||
if item_list:
|
if item_list:
|
||||||
itemised_tax, tax_columns = get_tax_accounts(
|
itemised_tax, tax_columns = get_tax_accounts(
|
||||||
item_list,
|
item_list,
|
||||||
@@ -40,6 +41,9 @@ def _execute(filters=None, additional_table_columns=None):
|
|||||||
doctype="Purchase Invoice",
|
doctype="Purchase Invoice",
|
||||||
tax_doctype="Purchase Taxes and Charges",
|
tax_doctype="Purchase Taxes and Charges",
|
||||||
)
|
)
|
||||||
|
for tax in tax_columns:
|
||||||
|
default_taxes[f"{tax}_rate"] = 0
|
||||||
|
default_taxes[f"{tax}_amount"] = 0
|
||||||
|
|
||||||
po_pr_map = get_purchase_receipts_against_purchase_order(item_list)
|
po_pr_map = get_purchase_receipts_against_purchase_order(item_list)
|
||||||
|
|
||||||
@@ -87,6 +91,7 @@ def _execute(filters=None, additional_table_columns=None):
|
|||||||
|
|
||||||
total_tax = 0
|
total_tax = 0
|
||||||
total_other_charges = 0
|
total_other_charges = 0
|
||||||
|
row.update(default_taxes.copy())
|
||||||
for tax, details in itemised_tax.get(d.name, {}).items():
|
for tax, details in itemised_tax.get(d.name, {}).items():
|
||||||
row.update(
|
row.update(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ def _execute(filters=None, additional_table_columns=None, additional_conditions=
|
|||||||
return columns, [], None, None, None, 0
|
return columns, [], None, None, None, 0
|
||||||
|
|
||||||
itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency)
|
itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency)
|
||||||
|
default_taxes = {}
|
||||||
|
for tax in tax_columns:
|
||||||
|
default_taxes[f"{tax}_rate"] = 0
|
||||||
|
default_taxes[f"{tax}_amount"] = 0
|
||||||
|
|
||||||
mode_of_payments = get_mode_of_payments(set(d.parent for d in item_list))
|
mode_of_payments = get_mode_of_payments(set(d.parent for d in item_list))
|
||||||
so_dn_map = get_delivery_notes_against_sales_order(item_list)
|
so_dn_map = get_delivery_notes_against_sales_order(item_list)
|
||||||
@@ -90,6 +94,9 @@ def _execute(filters=None, additional_table_columns=None, additional_conditions=
|
|||||||
|
|
||||||
total_tax = 0
|
total_tax = 0
|
||||||
total_other_charges = 0
|
total_other_charges = 0
|
||||||
|
|
||||||
|
row.update(default_taxes.copy())
|
||||||
|
|
||||||
for tax, details in itemised_tax.get(d.name, {}).items():
|
for tax, details in itemised_tax.get(d.name, {}).items():
|
||||||
row.update(
|
row.update(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,9 +16,11 @@ class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
frappe.db.rollback()
|
frappe.db.rollback()
|
||||||
|
|
||||||
def create_sales_invoice(self, do_not_submit=False):
|
def create_sales_invoice(self, item=None, taxes=None, do_not_submit=False):
|
||||||
si = create_sales_invoice(
|
si = create_sales_invoice(
|
||||||
item=self.item,
|
item=item or self.item,
|
||||||
|
item_name=item or self.item,
|
||||||
|
description=item or self.item,
|
||||||
company=self.company,
|
company=self.company,
|
||||||
customer=self.customer,
|
customer=self.customer,
|
||||||
debit_to=self.debit_to,
|
debit_to=self.debit_to,
|
||||||
@@ -29,6 +31,19 @@ class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase):
|
|||||||
price_list_rate=100,
|
price_list_rate=100,
|
||||||
do_not_save=1,
|
do_not_save=1,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for tax in taxes or []:
|
||||||
|
si.append(
|
||||||
|
"taxes",
|
||||||
|
{
|
||||||
|
"charge_type": "On Net Total",
|
||||||
|
"account_head": tax["account_head"],
|
||||||
|
"cost_center": self.cost_center,
|
||||||
|
"description": tax["description"],
|
||||||
|
"rate": tax["rate"],
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
si = si.save()
|
si = si.save()
|
||||||
if not do_not_submit:
|
if not do_not_submit:
|
||||||
si = si.submit()
|
si = si.submit()
|
||||||
@@ -62,3 +77,50 @@ class TestItemWiseSalesRegister(AccountsTestMixin, IntegrationTestCase):
|
|||||||
|
|
||||||
report_output = {k: v for k, v in report[1][0].items() if k in expected_result}
|
report_output = {k: v for k, v in report[1][0].items() if k in expected_result}
|
||||||
self.assertDictEqual(report_output, expected_result)
|
self.assertDictEqual(report_output, expected_result)
|
||||||
|
|
||||||
|
def test_grouped_report_handles_different_tax_descriptions(self):
|
||||||
|
self.create_item(item_name="_Test Item Tax Description A")
|
||||||
|
first_item = self.item
|
||||||
|
self.create_item(item_name="_Test Item Tax Description B")
|
||||||
|
second_item = self.item
|
||||||
|
|
||||||
|
first_tax_description = "Tax Description A"
|
||||||
|
second_tax_description = "Tax Description B"
|
||||||
|
first_tax_amount_field = f"{frappe.scrub(first_tax_description)}_amount"
|
||||||
|
second_tax_amount_field = f"{frappe.scrub(second_tax_description)}_amount"
|
||||||
|
|
||||||
|
self.create_sales_invoice(
|
||||||
|
item=first_item,
|
||||||
|
taxes=[
|
||||||
|
{
|
||||||
|
"account_head": "_Test Account VAT - _TC",
|
||||||
|
"description": first_tax_description,
|
||||||
|
"rate": 5,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
)
|
||||||
|
self.create_sales_invoice(
|
||||||
|
item=second_item,
|
||||||
|
taxes=[
|
||||||
|
{
|
||||||
|
"account_head": "_Test Account Service Tax - _TC",
|
||||||
|
"description": second_tax_description,
|
||||||
|
"rate": 2,
|
||||||
|
}
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
filters = frappe._dict(
|
||||||
|
{
|
||||||
|
"from_date": today(),
|
||||||
|
"to_date": today(),
|
||||||
|
"company": self.company,
|
||||||
|
"group_by": "Customer",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
_, data, _, _, _, _ = execute(filters)
|
||||||
|
|
||||||
|
grand_total_row = next(row for row in data if row.get("bold") and row.get("item_code") == "Total")
|
||||||
|
|
||||||
|
self.assertEqual(grand_total_row[first_tax_amount_field], 5.0)
|
||||||
|
self.assertEqual(grand_total_row[second_tax_amount_field], 2.0)
|
||||||
|
|||||||
Reference in New Issue
Block a user