fix: calculate chart data from beginning of period

- show period as label
This commit is contained in:
prssanna 2020-10-27 17:46:21 +05:30
parent d54f223b4b
commit 969aa86e68
2 changed files with 30 additions and 5 deletions

View file

@ -8,8 +8,7 @@ from frappe import _
import datetime
import json
from frappe.utils.dashboard import cache_source, get_from_date_from_timespan
from frappe.utils import nowdate, add_to_date, getdate, get_last_day, formatdate,\
get_datetime, cint, now_datetime
from frappe.utils import *
from frappe.model.naming import append_number_if_name_exists
from frappe.boot import get_allowed_reports
from frappe.model.document import Document
@ -156,6 +155,7 @@ def add_chart_to_dashboard(args):
def get_chart_config(chart, filters, timespan, timegrain, from_date, to_date):
if not from_date:
from_date = get_from_date_from_timespan(to_date, timespan)
from_date = get_period_beginning(from_date, timegrain)
if not to_date:
to_date = now_datetime()
@ -163,7 +163,6 @@ def get_chart_config(chart, filters, timespan, timegrain, from_date, to_date):
datefield = chart.based_on
aggregate_function = get_aggregate_function(chart.chart_type)
value_field = chart.value_based_on or '1'
from_date = from_date.strftime('%Y-%m-%d')
to_date = to_date
filters.append([doctype, datefield, '>=', from_date, False])
@ -185,7 +184,7 @@ def get_chart_config(chart, filters, timespan, timegrain, from_date, to_date):
result = get_result(data, timegrain, from_date, to_date)
chart_config = {
"labels": [formatdate(r[0].strftime('%Y-%m-%d')) for r in result],
"labels": [get_period(r[0], timegrain) for r in result],
"datasets": [{
"name": chart.name,
"values": [r[1] for r in result]
@ -282,7 +281,7 @@ def get_result(data, timegrain, from_date, to_date):
start_date = getdate(from_date)
end_date = getdate(to_date)
result = [[start_date, 0.0]]
result = []
while start_date < end_date:
next_date = get_next_expected_date(start_date, timegrain)
@ -304,6 +303,21 @@ def get_next_expected_date(date, timegrain):
next_date = get_period_ending(add_to_date(date, days=1), timegrain)
return getdate(next_date)
def get_period_beginning(date, timegrain):
as_str = True
if timegrain == 'Daily':
pass
elif timegrain == 'Weekly':
date = get_first_day_of_week(date, as_str=as_str)
elif timegrain == 'Monthly':
date = get_first_day(date, as_str=as_str)
elif timegrain == 'Quarterly':
date = get_quarter_start(date, as_str=as_str)
elif timegrain == 'Yearly':
date = get_year_start(date, as_str=as_str)
return date
def get_period_ending(date, timegrain):
date = getdate(date)
if timegrain == 'Daily':

View file

@ -441,6 +441,17 @@ def get_timespan_date_range(timespan):
return date_range_map.get(timespan)
def get_period(date, interval='Monthly'):
date = getdate(date)
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
return {
'Daily': date.strftime('%d-%m-%y'),
'Weekly': date.strftime('%d-%m-%y'),
'Monthly': str(months[date.month - 1]) + ' ' + str(date.year),
'Quarterly': 'Quarter ' + str(((date.month-1)//3)+1) + ' ' + str(date.year),
'Yearly': str(date.year)
}[interval]
def global_date_format(date, format="long"):
"""returns localized date in the form of January 1, 2012"""
date = getdate(date)