feat: add Purchase Partner Target Variance Based On Item Group report

Mirrors the Sales Partner Target Variance Based On Item Group report
for the purchase flow. Calls the shared get_data_column helper with
"Purchase Partner" so it reads Target Details with parenttype=Purchase
Partner and matches against the purchase_partner field on PO/PI/PR.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Dipen Gala
2026-06-17 13:39:05 +05:30
parent a674d9216a
commit 5284b8c7a8
5 changed files with 116 additions and 1 deletions

View File

@@ -0,0 +1,60 @@
// Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
frappe.query_reports["Purchase Partner Target Variance Based On Item Group"] = {
filters: [
{
fieldname: "company",
label: __("Company"),
fieldtype: "Link",
options: "Company",
default: frappe.defaults.get_user_default("Company"),
},
{
fieldname: "fiscal_year",
label: __("Fiscal Year"),
fieldtype: "Link",
options: "Fiscal Year",
default: erpnext.utils.get_fiscal_year(frappe.datetime.get_today()),
},
{
fieldname: "doctype",
label: __("Document Type"),
fieldtype: "Select",
options: "Purchase Order\nPurchase Receipt\nPurchase Invoice",
default: "Purchase Order",
},
{
fieldname: "period",
label: __("Period"),
fieldtype: "Select",
options: [
{ value: "Monthly", label: __("Monthly") },
{ value: "Quarterly", label: __("Quarterly") },
{ value: "Half-Yearly", label: __("Half-Yearly") },
{ value: "Yearly", label: __("Yearly") },
],
default: "Monthly",
},
{
fieldname: "target_on",
label: __("Target On"),
fieldtype: "Select",
options: "Quantity\nAmount",
default: "Quantity",
},
],
formatter: function (value, row, column, data, default_formatter) {
value = default_formatter(value, row, column, data);
if (column.fieldname.includes("variance")) {
if (data[column.fieldname] < 0) {
value = "<span style='color:red'>" + value + "</span>";
} else if (data[column.fieldname] > 0) {
value = "<span style='color:green'>" + value + "</span>";
}
}
return value;
},
};

View File

@@ -0,0 +1,33 @@
{
"add_total_row": 0,
"creation": "2026-06-17 00:00:00",
"disable_prepared_report": 0,
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"modified": "2026-06-17 00:00:00",
"modified_by": "Administrator",
"module": "Buying",
"name": "Purchase Partner Target Variance Based On Item Group",
"owner": "Administrator",
"prepared_report": 0,
"ref_doctype": "Purchase Order",
"report_name": "Purchase Partner Target Variance Based On Item Group",
"report_type": "Script Report",
"roles": [
{
"role": "Purchase User"
},
{
"role": "Purchase Manager"
},
{
"role": "Accounts User"
},
{
"role": "Stock User"
}
]
}

View File

@@ -0,0 +1,11 @@
# Copyright (c) 2026, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from erpnext.selling.report.sales_partner_target_variance_based_on_item_group.item_group_wise_sales_target_variance import (
get_data_column,
)
def execute(filters=None):
return get_data_column(filters, "Purchase Partner")

View File

@@ -455,6 +455,17 @@
"onboard": 0,
"type": "Link"
},
{
"dependencies": "Purchase Partner",
"hidden": 0,
"is_query_report": 1,
"label": "Purchase Partner Target Variance Based On Item Group",
"link_count": 0,
"link_to": "Purchase Partner Target Variance Based On Item Group",
"link_type": "Report",
"onboard": 0,
"type": "Link"
},
{
"hidden": 0,
"is_query_report": 0,
@@ -637,7 +648,7 @@
"type": "Link"
}
],
"modified": "2026-06-17 13:01:33.296280",
"modified": "2026-06-17 13:13:38.489837",
"modified_by": "Administrator",
"module": "Buying",
"name": "Buying",