feat: Show Aggregate Value from Subsidiary Companies

(cherry picked from commit c23af6af41)

# Conflicts:
#	erpnext/selling/report/sales_analytics/sales_analytics.js
This commit is contained in:
l0gesh29
2024-11-15 12:54:04 +05:30
committed by Mergify
parent 74af7d01a2
commit 0469b0d1ec
2 changed files with 101 additions and 32 deletions

View File

@@ -73,6 +73,27 @@ frappe.query_reports["Sales Analytics"] = {
default: "Monthly",
reqd: 1,
},
<<<<<<< HEAD
=======
{
fieldname: "curves",
label: __("Curves"),
fieldtype: "Select",
options: [
{ value: "select", label: __("Select") },
{ value: "all", label: __("All") },
{ value: "non-zeros", label: __("Non-Zeros") },
{ value: "total", label: __("Total Only") },
],
default: "select",
reqd: 1,
},
{
fieldname: "show_aggregate_value_from_subsidiary_companies",
label: __("Show Aggregate Value from Subsidiary Companies"),
fieldtype: "Check",
},
>>>>>>> c23af6af41 (feat: Show Aggregate Value from Subsidiary Companies)
],
get_datatable_options(options) {
return Object.assign(options, {

View File

@@ -4,6 +4,8 @@
import frappe
from frappe import _, scrub
from frappe.query_builder import DocType
from frappe.query_builder.functions import IfNull
from frappe.utils import add_days, add_to_date, flt, getdate
from erpnext.accounts.utils import get_fiscal_year
@@ -37,7 +39,26 @@ class Analytics:
]
self.get_period_date_ranges()
def update_company_list_for_parent_company(self):
company_list = [self.filters.get("company")]
selected_company = self.filters.get("company")
if (
selected_company
and self.filters.get("show_aggregate_value_from_subsidiary_companies")
and frappe.db.get_value("Company", selected_company, "is_group")
):
lft, rgt = frappe.db.get_value("Company", selected_company, ["lft", "rgt"])
child_companies = frappe.db.get_list(
"Company", filters={"lft": [">", lft], "rgt": ["<", rgt]}, pluck="name"
)
company_list.extend(child_companies)
self.filters["company"] = company_list
def run(self):
self.update_company_list_for_parent_company()
self.get_columns()
self.get_data()
self.get_chart_data()
@@ -123,14 +144,23 @@ class Analytics:
else:
value_field = "total_qty"
self.entries = frappe.db.sql(
""" select s.order_type as entity, s.{value_field} as value_field, s.{date_field}
from `tab{doctype}` s where s.docstatus = 1 and s.company = %s and s.{date_field} between %s and %s
and ifnull(s.order_type, '') != '' order by s.order_type
""".format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
(self.filters.company, self.filters.from_date, self.filters.to_date),
as_dict=1,
)
doctype = DocType(self.filters.doc_type)
self.entries = (
frappe.qb.from_(doctype)
.select(
doctype.order_type.as_("entity"),
doctype[self.date_field],
doctype[value_field].as_("value_field"),
)
.where(
(doctype.docstatus == 1)
& (doctype.company.isin(self.filters.company))
& (doctype[self.date_field].between(self.filters.from_date, self.filters.to_date))
& (IfNull(doctype.order_type, "") != "")
)
.orderby(doctype.order_type)
).run(as_dict=True)
self.get_teams()
@@ -152,7 +182,7 @@ class Analytics:
fields=[entity, entity_name, value_field, self.date_field],
filters={
"docstatus": 1,
"company": self.filters.company,
"company": ["in", self.filters.company],
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
},
)
@@ -167,16 +197,26 @@ class Analytics:
else:
value_field = "stock_qty"
self.entries = frappe.db.sql(
"""
select i.item_code as entity, i.item_name as entity_name, i.stock_uom, i.{value_field} as value_field, s.{date_field}
from `tab{doctype} Item` i , `tab{doctype}` s
where s.name = i.parent and i.docstatus = 1 and s.company = %s
and s.{date_field} between %s and %s
""".format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
(self.filters.company, self.filters.from_date, self.filters.to_date),
as_dict=1,
)
doctype = DocType(self.filters.doc_type)
doctype_item = DocType(f"{self.filters.doc_type} Item")
self.entries = (
frappe.qb.from_(doctype_item)
.join(doctype)
.on(doctype.name == doctype_item.parent)
.select(
doctype_item.item_code.as_("entity"),
doctype_item.item_name.as_("entity_name"),
doctype_item.stock_uom,
doctype_item[value_field].as_("value_field"),
doctype[self.date_field],
)
.where(
(doctype_item.docstatus == 1)
& (doctype.company.isin(self.filters.company))
& (doctype[self.date_field].between(self.filters.from_date, self.filters.to_date))
)
).run(as_dict=True)
self.entity_names = {}
for d in self.entries:
@@ -201,7 +241,7 @@ class Analytics:
fields=[entity_field, value_field, self.date_field],
filters={
"docstatus": 1,
"company": self.filters.company,
"company": ["in", self.filters.company],
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
},
)
@@ -213,16 +253,24 @@ class Analytics:
else:
value_field = "qty"
self.entries = frappe.db.sql(
f"""
select i.item_group as entity, i.{value_field} as value_field, s.{self.date_field}
from `tab{self.filters.doc_type} Item` i , `tab{self.filters.doc_type}` s
where s.name = i.parent and i.docstatus = 1 and s.company = %s
and s.{self.date_field} between %s and %s
""",
(self.filters.company, self.filters.from_date, self.filters.to_date),
as_dict=1,
)
doctype = DocType(self.filters.doc_type)
doctype_item = DocType(f"{self.filters.doc_type} Item")
self.entries = (
frappe.qb.from_(doctype_item)
.join(doctype)
.on(doctype.name == doctype_item.parent)
.select(
doctype_item.item_group.as_("entity"),
doctype_item[value_field].as_("value_field"),
doctype[self.date_field],
)
.where(
(doctype_item.docstatus == 1)
& (doctype.company.isin(self.filters.company))
& (doctype[self.date_field].between(self.filters.from_date, self.filters.to_date))
)
).run(as_dict=True)
self.get_groups()
@@ -239,7 +287,7 @@ class Analytics:
fields=[entity, value_field, self.date_field],
filters={
"docstatus": 1,
"company": self.filters.company,
"company": ["in", self.filters.company],
"project": ["!=", ""],
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
},
@@ -312,7 +360,7 @@ class Analytics:
str(((posting_date.month - 1) // 3) + 1), str(posting_date.year)
)
else:
year = get_fiscal_year(posting_date, company=self.filters.company)
year = get_fiscal_year(posting_date, company=self.filters.company[0])
period = str(year[0])
return period