mirror of
https://github.com/frappe/erpnext.git
synced 2026-08-26 21:35:19 +00:00
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
|
from frappe.desk.query_report import get_filtered_data
|
||||||
from frappe.model.docstatus import DocStatus
|
from frappe.model.docstatus import DocStatus
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
@@ -12,11 +13,14 @@ def execute(filters=None):
|
|||||||
filters = frappe._dict(filters or {})
|
filters = frappe._dict(filters or {})
|
||||||
columns = get_columns(filters, group_fieldname)
|
columns = get_columns(filters, group_fieldname)
|
||||||
|
|
||||||
data = get_data(filters, group_fieldname)
|
data = get_data(filters)
|
||||||
|
data = get_filtered_data("Timesheet", columns, data, frappe.session.user)
|
||||||
|
report_summary = get_report_summary(data)
|
||||||
|
|
||||||
# the report totals itself in `get_total_row`: frappe's total row counts a group and its
|
if group_fieldname:
|
||||||
# children as separate rows, and the datatable hides it anyway in tree mode
|
data = group_by(data, group_fieldname)
|
||||||
return columns, data, None, None, None, 1
|
|
||||||
|
return columns, data, None, None, report_summary, 1
|
||||||
|
|
||||||
|
|
||||||
def get_columns(filters, group_fieldname=None):
|
def get_columns(filters, group_fieldname=None):
|
||||||
@@ -86,7 +90,7 @@ def get_columns(filters, group_fieldname=None):
|
|||||||
return columns
|
return columns
|
||||||
|
|
||||||
|
|
||||||
def get_data(filters, group_fieldname=None):
|
def get_data(filters):
|
||||||
_filters = []
|
_filters = []
|
||||||
if filters.get("employee"):
|
if filters.get("employee"):
|
||||||
_filters.append(("employee", "=", filters.get("employee")))
|
_filters.append(("employee", "=", filters.get("employee")))
|
||||||
@@ -117,13 +121,6 @@ def get_data(filters, group_fieldname=None):
|
|||||||
order_by="`tabTimesheet Detail`.from_time",
|
order_by="`tabTimesheet Detail`.from_time",
|
||||||
)
|
)
|
||||||
|
|
||||||
if not data:
|
|
||||||
return data
|
|
||||||
|
|
||||||
if group_fieldname:
|
|
||||||
data = group_by(data, group_fieldname)
|
|
||||||
|
|
||||||
data.append(get_total_row(data))
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
@@ -170,17 +167,32 @@ def get_group_value(row, fieldname):
|
|||||||
return getdate(value) if fieldname == "date" and value else value
|
return getdate(value) if fieldname == "date" and value else value
|
||||||
|
|
||||||
|
|
||||||
def get_total_row(data):
|
def get_report_summary(data):
|
||||||
total_row = dict.fromkeys(VALUE_FIELDNAMES, 0.0)
|
if not data:
|
||||||
# quoted so that the Link column renders it as plain text instead of a broken link
|
return None
|
||||||
total_row["timesheet"] = f"'{_('Total')}'"
|
|
||||||
total_row["indent"] = 0
|
|
||||||
|
|
||||||
|
totals = dict.fromkeys(VALUE_FIELDNAMES, 0.0)
|
||||||
for row in data:
|
for row in data:
|
||||||
# a group already carries its children's values: adding both would count them twice
|
|
||||||
if row.get("indent"):
|
|
||||||
continue
|
|
||||||
for value_fieldname in VALUE_FIELDNAMES:
|
for value_fieldname in VALUE_FIELDNAMES:
|
||||||
total_row[value_fieldname] += row.get(value_fieldname) or 0
|
totals[value_fieldname] += row.get(value_fieldname) or 0
|
||||||
|
|
||||||
return total_row
|
return [
|
||||||
|
{
|
||||||
|
"value": totals["hours"],
|
||||||
|
"indicator": "Blue",
|
||||||
|
"label": _("Total Working Hours"),
|
||||||
|
"datatype": "Float",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": totals["billing_hours"],
|
||||||
|
"indicator": "Blue",
|
||||||
|
"label": _("Total Billing Hours"),
|
||||||
|
"datatype": "Float",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"value": totals["billing_amount"],
|
||||||
|
"indicator": "Green",
|
||||||
|
"label": _("Total Billing Amount"),
|
||||||
|
"datatype": "Currency",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user