diff --git a/erpnext/accounts/report/gross_profit/gross_profit.js b/erpnext/accounts/report/gross_profit/gross_profit.js index fad6586466e..ad194ee90a2 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.js +++ b/erpnext/accounts/report/gross_profit/gross_profit.js @@ -36,7 +36,7 @@ frappe.query_reports["Gross Profit"] = { label: __("Group By"), fieldtype: "Select", options: - "Invoice\nItem Code\nItem Group\nBrand\nWarehouse\nCustomer\nCustomer Group\nTerritory\nSales Person\nProject\nMonthly\nPayment Term", + "Invoice\nItem Code\nItem Group\nBrand\nWarehouse\nCustomer\nCustomer Group\nTerritory\nSales Person\nProject\nCost Center\nMonthly\nPayment Term", default: "Invoice", }, { @@ -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..fe2746660eb 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 @@ -120,6 +125,13 @@ def execute(filters=None): "gross_profit_percent", ], "project": ["project", "base_amount", "buying_amount", "gross_profit", "gross_profit_percent"], + "cost_center": [ + "cost_center", + "base_amount", + "buying_amount", + "gross_profit", + "gross_profit_percent", + ], "territory": [ "territory", "base_amount", @@ -299,7 +311,14 @@ def get_columns(group_wise_columns, filters): "fieldname": "project", "fieldtype": "Link", "options": "Project", - "width": 100, + "width": 140, + }, + "cost_center": { + "label": _("Cost Center"), + "fieldname": "cost_center", + "fieldtype": "Link", + "options": "Cost Center", + "width": 140, }, "sales_person": { "label": _("Sales Person"), @@ -787,6 +806,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