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:
@@ -73,6 +73,27 @@ frappe.query_reports["Sales Analytics"] = {
|
|||||||
default: "Monthly",
|
default: "Monthly",
|
||||||
reqd: 1,
|
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) {
|
get_datatable_options(options) {
|
||||||
return Object.assign(options, {
|
return Object.assign(options, {
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _, scrub
|
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 frappe.utils import add_days, add_to_date, flt, getdate
|
||||||
|
|
||||||
from erpnext.accounts.utils import get_fiscal_year
|
from erpnext.accounts.utils import get_fiscal_year
|
||||||
@@ -37,7 +39,26 @@ class Analytics:
|
|||||||
]
|
]
|
||||||
self.get_period_date_ranges()
|
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):
|
def run(self):
|
||||||
|
self.update_company_list_for_parent_company()
|
||||||
self.get_columns()
|
self.get_columns()
|
||||||
self.get_data()
|
self.get_data()
|
||||||
self.get_chart_data()
|
self.get_chart_data()
|
||||||
@@ -123,14 +144,23 @@ class Analytics:
|
|||||||
else:
|
else:
|
||||||
value_field = "total_qty"
|
value_field = "total_qty"
|
||||||
|
|
||||||
self.entries = frappe.db.sql(
|
doctype = DocType(self.filters.doc_type)
|
||||||
""" 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
|
self.entries = (
|
||||||
and ifnull(s.order_type, '') != '' order by s.order_type
|
frappe.qb.from_(doctype)
|
||||||
""".format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
|
.select(
|
||||||
(self.filters.company, self.filters.from_date, self.filters.to_date),
|
doctype.order_type.as_("entity"),
|
||||||
as_dict=1,
|
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()
|
self.get_teams()
|
||||||
|
|
||||||
@@ -152,7 +182,7 @@ class Analytics:
|
|||||||
fields=[entity, entity_name, value_field, self.date_field],
|
fields=[entity, entity_name, value_field, self.date_field],
|
||||||
filters={
|
filters={
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
"company": self.filters.company,
|
"company": ["in", self.filters.company],
|
||||||
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
|
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -167,16 +197,26 @@ class Analytics:
|
|||||||
else:
|
else:
|
||||||
value_field = "stock_qty"
|
value_field = "stock_qty"
|
||||||
|
|
||||||
self.entries = frappe.db.sql(
|
doctype = DocType(self.filters.doc_type)
|
||||||
"""
|
doctype_item = DocType(f"{self.filters.doc_type} Item")
|
||||||
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
|
self.entries = (
|
||||||
where s.name = i.parent and i.docstatus = 1 and s.company = %s
|
frappe.qb.from_(doctype_item)
|
||||||
and s.{date_field} between %s and %s
|
.join(doctype)
|
||||||
""".format(date_field=self.date_field, value_field=value_field, doctype=self.filters.doc_type),
|
.on(doctype.name == doctype_item.parent)
|
||||||
(self.filters.company, self.filters.from_date, self.filters.to_date),
|
.select(
|
||||||
as_dict=1,
|
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 = {}
|
self.entity_names = {}
|
||||||
for d in self.entries:
|
for d in self.entries:
|
||||||
@@ -201,7 +241,7 @@ class Analytics:
|
|||||||
fields=[entity_field, value_field, self.date_field],
|
fields=[entity_field, value_field, self.date_field],
|
||||||
filters={
|
filters={
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
"company": self.filters.company,
|
"company": ["in", self.filters.company],
|
||||||
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
|
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -213,16 +253,24 @@ class Analytics:
|
|||||||
else:
|
else:
|
||||||
value_field = "qty"
|
value_field = "qty"
|
||||||
|
|
||||||
self.entries = frappe.db.sql(
|
doctype = DocType(self.filters.doc_type)
|
||||||
f"""
|
doctype_item = DocType(f"{self.filters.doc_type} Item")
|
||||||
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
|
self.entries = (
|
||||||
where s.name = i.parent and i.docstatus = 1 and s.company = %s
|
frappe.qb.from_(doctype_item)
|
||||||
and s.{self.date_field} between %s and %s
|
.join(doctype)
|
||||||
""",
|
.on(doctype.name == doctype_item.parent)
|
||||||
(self.filters.company, self.filters.from_date, self.filters.to_date),
|
.select(
|
||||||
as_dict=1,
|
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()
|
self.get_groups()
|
||||||
|
|
||||||
@@ -239,7 +287,7 @@ class Analytics:
|
|||||||
fields=[entity, value_field, self.date_field],
|
fields=[entity, value_field, self.date_field],
|
||||||
filters={
|
filters={
|
||||||
"docstatus": 1,
|
"docstatus": 1,
|
||||||
"company": self.filters.company,
|
"company": ["in", self.filters.company],
|
||||||
"project": ["!=", ""],
|
"project": ["!=", ""],
|
||||||
self.date_field: ("between", [self.filters.from_date, self.filters.to_date]),
|
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)
|
str(((posting_date.month - 1) // 3) + 1), str(posting_date.year)
|
||||||
)
|
)
|
||||||
else:
|
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])
|
period = str(year[0])
|
||||||
return period
|
return period
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user