From 8d70385019fbede9fecfe55362039200b2b8c98a Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 15:43:59 +0530 Subject: [PATCH 1/2] test: Territory Target Variance based on Item Group report coverage --- ...ory_target_variance_based_on_item_group.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py diff --git a/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py new file mode 100644 index 00000000000..dd7cca771e3 --- /dev/null +++ b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py @@ -0,0 +1,71 @@ +# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +from frappe.utils import flt, nowdate + +from erpnext.accounts.utils import get_fiscal_year +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.selling.report.territory_target_variance_based_on_item_group.territory_target_variance_based_on_item_group import ( + execute, +) +from erpnext.tests.utils import ERPNextTestSuite + + +class TestTerritoryTargetVarianceBasedOnItemGroup(ERPNextTestSuite): + def setUp(self): + self.fiscal_year = get_fiscal_year(nowdate())[0] + + def test_achieved_target_and_variance(self): + distribution = create_target_distribution(self.fiscal_year) + territory = create_territory_with_target( + "_Test Target Territory", self.fiscal_year, distribution.name, target_qty=50 + ) + + # a Sales Order in that territory contributes to the achieved quantity + so = make_sales_order(rate=1000, qty=20, do_not_submit=True) + so.territory = territory.name + so.submit() + + result = execute( + frappe._dict( + { + "fiscal_year": self.fiscal_year, + "doctype": "Sales Order", + "period": "Yearly", + "target_on": "Quantity", + } + ) + )[1] + + rows = [frappe._dict(r) for r in result if r.get("territory") == territory.name] + self.assertTrue(rows, "Target territory missing from report") + achieved = sum(flt(r.total_achieved) for r in rows) + self.assertEqual(flt(rows[0].total_target, 2), 50) + self.assertEqual(flt(achieved, 2), 20) + self.assertEqual(flt(rows[0].total_variance, 2), -30) + + +def create_target_distribution(fiscal_year): + distribution = frappe.new_doc("Monthly Distribution") + distribution.distribution_id = "Target Report Distribution" + distribution.fiscal_year = fiscal_year + distribution.get_months() + return distribution.insert() + + +def create_territory_with_target(name, fiscal_year, distribution_id, target_qty=50): + doc = frappe.new_doc("Territory") + doc.territory_name = name + doc.parent_territory = "All Territories" + doc.is_group = 0 + doc.append( + "targets", + { + "fiscal_year": fiscal_year, + "target_qty": target_qty, + "target_amount": 30000, + "distribution_id": distribution_id, + }, + ) + return doc.insert() From 08884056402bbbc7972d22a450bb1ca819622439 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Thu, 2 Jul 2026 17:15:05 +0530 Subject: [PATCH 2/2] test: reuse shared distribution helper and assert a single territory row --- ...ory_target_variance_based_on_item_group.py | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py index dd7cca771e3..8c98a98bd7c 100644 --- a/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py +++ b/erpnext/selling/report/territory_target_variance_based_on_item_group/test_territory_target_variance_based_on_item_group.py @@ -6,6 +6,9 @@ from frappe.utils import flt, nowdate from erpnext.accounts.utils import get_fiscal_year from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +from erpnext.selling.report.sales_person_target_variance_based_on_item_group.test_sales_person_target_variance_based_on_item_group import ( + create_target_distribution, +) from erpnext.selling.report.territory_target_variance_based_on_item_group.territory_target_variance_based_on_item_group import ( execute, ) @@ -38,20 +41,14 @@ class TestTerritoryTargetVarianceBasedOnItemGroup(ERPNextTestSuite): ) )[1] + # no item_group is set on the target, so the report emits exactly one row per + # territory -- assert all three figures against that single row rows = [frappe._dict(r) for r in result if r.get("territory") == territory.name] - self.assertTrue(rows, "Target territory missing from report") - achieved = sum(flt(r.total_achieved) for r in rows) - self.assertEqual(flt(rows[0].total_target, 2), 50) - self.assertEqual(flt(achieved, 2), 20) - self.assertEqual(flt(rows[0].total_variance, 2), -30) - - -def create_target_distribution(fiscal_year): - distribution = frappe.new_doc("Monthly Distribution") - distribution.distribution_id = "Target Report Distribution" - distribution.fiscal_year = fiscal_year - distribution.get_months() - return distribution.insert() + self.assertEqual(len(rows), 1, "expected exactly one row for the target territory") + row = rows[0] + self.assertEqual(flt(row.total_target, 2), 50) + self.assertEqual(flt(row.total_achieved, 2), 20) + self.assertEqual(flt(row.total_variance, 2), -30) def create_territory_with_target(name, fiscal_year, distribution_id, target_qty=50):