From fe9dffb271021e554331f048931fe793b05bbaf1 Mon Sep 17 00:00:00 2001 From: Dany Robert Date: Mon, 3 Jun 2024 13:45:55 +0000 Subject: [PATCH] feat: accounting dimension filters in gp report (cherry picked from commit d165638bbbd49ef260760528ccca1eb04b71628b) --- .../report/gross_profit/gross_profit.js | 22 ++++++++++++++ .../report/gross_profit/gross_profit.py | 30 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.js b/erpnext/accounts/report/gross_profit/gross_profit.js index fad6586466e..4f65aa615ee 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.js +++ b/erpnext/accounts/report/gross_profit/gross_profit.js @@ -63,6 +63,26 @@ frappe.query_reports["Gross Profit"] = { }; }, }, + { + fieldname: "cost_center", + label: __("Cost Center"), + fieldtype: "MultiSelectList", + get_data: function (txt) { + return frappe.db.get_link_options("Cost Center", txt, { + company: frappe.query_report.get_filter_value("company"), + }); + }, + }, + { + fieldname: "project", + label: __("Project"), + fieldtype: "MultiSelectList", + get_data: function (txt) { + return frappe.db.get_link_options("Project", txt, { + company: frappe.query_report.get_filter_value("company"), + }); + }, + }, ], tree: true, name_field: "parent", @@ -85,3 +105,5 @@ frappe.query_reports["Gross Profit"] = { return value; }, }; + +erpnext.utils.add_dimensions("Gross Profit", 15); diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index c8c8dd9b494..6ddb95eb140 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -8,6 +8,11 @@ from frappe import _, qb, scrub from frappe.query_builder import Order from frappe.utils import cint, flt, formatdate +from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( + get_accounting_dimensions, + get_dimension_with_children, +) +from erpnext.accounts.report.financial_statements import get_cost_centers_with_children from erpnext.controllers.queries import get_match_cond from erpnext.stock.report.stock_ledger.stock_ledger import get_item_group_condition from erpnext.stock.utils import get_incoming_rate @@ -787,6 +792,31 @@ class GrossProfitGenerator: if self.filters.get("item_code"): conditions += " and `tabSales Invoice Item`.item_code = %(item_code)s" + if self.filters.get("cost_center"): + self.filters.cost_center = frappe.parse_json(self.filters.get("cost_center")) + self.filters.cost_center = get_cost_centers_with_children(self.filters.cost_center) + conditions += " and `tabSales Invoice Item`.cost_center in %(cost_center)s" + + if self.filters.get("project"): + self.filters.project = frappe.parse_json(self.filters.get("project")) + conditions += " and `tabSales Invoice Item`.project in %(project)s" + + accounting_dimensions = get_accounting_dimensions(as_list=False) + if accounting_dimensions: + for dimension in accounting_dimensions: + if self.filters.get(dimension.fieldname): + if frappe.get_cached_value("DocType", dimension.document_type, "is_tree"): + self.filters[dimension.fieldname] = get_dimension_with_children( + dimension.document_type, self.filters.get(dimension.fieldname) + ) + conditions += ( + f" and `tabSales Invoice Item`.{dimension.fieldname} in %({dimension.fieldname})s" + ) + else: + conditions += ( + f" and `tabSales Invoice Item`.{dimension.fieldname} in %({dimension.fieldname})s" + ) + if self.filters.get("warehouse"): warehouse_details = frappe.db.get_value( "Warehouse", self.filters.get("warehouse"), ["lft", "rgt"], as_dict=1