fix(selling): respect company in target variance actuals

Filter permitted sales documents by the selected company before collecting achievement. Keep transaction permissions and callers without a company filter unchanged.

Issue: frappe/erpnext-bug-reviews#395 (bug 1)
(cherry picked from commit 7d493a6678)

# Conflicts:
#	erpnext/selling/report/sales_partner_target_variance_based_on_item_group/item_group_wise_sales_target_variance.py
This commit is contained in:
Krishna Shirsath
2026-10-27 12:14:23 +00:00
committed by Mergify
parent c5ec3e6563
commit 7550e0570f
4 changed files with 74 additions and 0 deletions
@@ -233,6 +233,7 @@ def get_actual_data(filters, sales_users_or_territory_data, date_field, sales_fi
fiscal_year = get_fiscal_year(fiscal_year=filters.get("fiscal_year"), as_dict=1)
doctype = filters.get("doctype")
<<<<<<< HEAD
permitted_names = frappe.get_list(
doctype,
filters={
@@ -240,6 +241,20 @@ def get_actual_data(filters, sales_users_or_territory_data, date_field, sales_fi
date_field: ["between", [fiscal_year.year_start_date, fiscal_year.year_end_date]],
},
pluck="name",
=======
doc_filters = {
"docstatus": 1,
date_field: ["between", [fiscal_year.year_start_date, fiscal_year.year_end_date]],
}
if filters.get("company"):
doc_filters["company"] = filters.company
permitted_docs = frappe.qb.get_query(
table=doctype,
fields=["name"],
filters=doc_filters,
ignore_permissions=False,
>>>>>>> 7d493a6 (fix(selling): respect company in target variance actuals)
)
if not permitted_names:
@@ -55,3 +55,10 @@ class TestSalesPartnerTargetVarianceBasedOnItemGroup(FrappeTestCase):
[flt(value, 2) for value in (row.total_target, row.total_achieved, row.total_variance)],
[50, 20, -30],
)
def test_company_filter_excludes_other_company_sales(self):
from erpnext.selling.report.territory_target_variance_based_on_item_group.test_territory_target_variance_based_on_item_group import (
check_company_filter,
)
check_company_filter(self, "Sales Partner", "partner_name", execute)
@@ -113,6 +113,13 @@ class TestSalesPersonTargetVarianceBasedOnItemGroup(FrappeTestCase):
self.assertEqual(flt(rows[person_on_order.name].total_achieved, 2), 20)
self.assertEqual(flt(rows[person_on_invoice.name].total_achieved, 2), 0)
def test_company_filter_excludes_other_company_sales(self):
from erpnext.selling.report.territory_target_variance_based_on_item_group.test_territory_target_variance_based_on_item_group import (
check_company_filter,
)
check_company_filter(self, "Sales Person", "sales_person_name", execute)
def create_target_distribution(fiscal_year):
if frappe.db.exists("Monthly Distribution", "Target Report Distribution"):
@@ -150,6 +150,13 @@ class TestTerritoryTargetVarianceBasedOnItemGroup(FrappeTestCase):
remove_user_permission("Customer", "_Test Customer 2", user)
self.assertEqual(flt(restricted, 2), 3)
def test_company_filter_excludes_other_company_sales(self):
from erpnext.selling.report.territory_target_variance_based_on_item_group.test_territory_target_variance_based_on_item_group import (
check_company_filter,
)
check_company_filter(self, "Territory", "territory_name", execute)
def create_territory_with_target(name, fiscal_year, distribution_id, target_qty=50):
doc = frappe.new_doc("Territory")
@@ -166,3 +173,41 @@ def create_territory_with_target(name, fiscal_year, distribution_id, target_qty=
},
)
return doc.insert()
def check_company_filter(test, doctype, name_field, execute_report):
from erpnext.selling.report.sales_person_target_variance_based_on_item_group.test_sales_person_target_variance_based_on_item_group import (
create_sales_target_doc,
)
from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
distribution = create_target_distribution(test.fiscal_year)
holder = create_sales_target_doc(
doctype, name_field, frappe.generate_hash(length=10), test.fiscal_year, distribution.name
)
order = make_sales_order(
company="_Test Company 2",
currency=frappe.get_cached_value("Company", "_Test Company 2", "default_currency"),
warehouse=create_warehouse("_Test Target Report Warehouse", company="_Test Company 2"),
rate=800,
qty=1,
do_not_submit=True,
)
field = frappe.scrub(doctype)
if doctype == "Sales Person":
order.set("sales_team", [{"sales_person": holder.name, "allocated_percentage": 100}])
else:
order.set(field, holder.name)
if doctype == "Sales Partner":
order.commission_rate = 5
order.submit()
filters = frappe._dict(
fiscal_year=test.fiscal_year, doctype="Sales Order", period="Yearly", target_on="Amount"
)
def achieved():
return next(r["total_achieved"] for r in execute_report(filters)[1] if r[field] == holder.name)
test.assertEqual(flt(achieved(), 2), flt(order.base_net_total, 2))
filters.company = "_Test Company"
test.assertEqual(flt(achieved(), 2), 0)