adds chart to see all actions in all past months

This one is a bit hidden. You need to click on a bar in the chart
with the actions from the last 12 months. Need to change this so
people can find it easier
This commit is contained in:
Reinier Balt 2008-07-04 17:56:59 +02:00
parent 909519293b
commit 44f8646881
5 changed files with 161 additions and 28 deletions

View file

@ -105,7 +105,107 @@ class StatsController < ApplicationController
render :layout => false
end
def actions_done_last_years
@chart_width = 900
@chart_height = 400
end
def actions_done_lastyears_data
@actions = @user.todos
# get actions created and completed in the past 12+3 months. +3 for running
# average
@actions_done_last_months = @actions.find(:all, {
:select => "completed_at",
:conditions => ["completed_at IS NOT NULL"]
})
@actions_created_last_months = @actions.find(:all, {
:select => "created_at",
})
@month_count = 0
# convert to hash to be able to fill in non-existing days in
# @actions_done_last12months and count the total actions done in the past
# 12 months to be able to calculate percentage
# use 0 to initialise action count to zero
@actions_done_last_months_hash = Hash.new(0)
@actions_done_last_months.each do |r|
months = (@today.year - r.completed_at.year)*12 + (@today.month - r.completed_at.month)
@month_count = months if months > @month_count
@actions_done_last_months_hash[months] += 1
end
# convert to hash to be able to fill in non-existing days in
# @actions_created_last12months and count the total actions done in the
# past 12 months to be able to calculate percentage
# use 0 to initialise action count to zero
@actions_created_last_months_hash = Hash.new(0)
@actions_created_last_months.each do |r|
months = (@today.year - r.created_at.year)*12 + (@today.month - r.created_at.month)
@month_count = months if months > @month_count
@actions_created_last_months_hash[months] += 1
end
@sum_actions_done_last_months=0
@sum_actions_created_last_months=0
# find max for graph in both hashes
@max=0
0.upto @month_count do |i|
@sum_actions_done_last_months += @actions_done_last_months_hash[i]
@max = @actions_done_last_months_hash[i] if @actions_done_last_months_hash[i] > @max
end
0.upto @month_count do |i|
@sum_actions_created_last_months += @actions_created_last_months_hash[i]
@max = @actions_created_last_months_hash[i] if @actions_created_last_months_hash[i] > @max
end
# find running avg for month i by calculating avg of month i and the two
# after them. Ignore current month because you do not have full data for
# it
@actions_done_avg_last_months_hash = Hash.new("null")
1.upto(@month_count) { |i|
@actions_done_avg_last_months_hash[i] = (@actions_done_last_months_hash[i] +
@actions_done_last_months_hash[i+1] +
@actions_done_last_months_hash[i+2])/3.0
}
# correct last two months
@actions_done_avg_last_months_hash[@month_count] = @actions_done_avg_last_months_hash[@month_count] * 3
@actions_done_avg_last_months_hash[@month_count-1] = @actions_done_avg_last_months_hash[@month_count-1] * 3 / 2 if @month_count > 1
# find running avg for month i by calculating avg of month i and the two
# after them. Ignore current month because you do not have full data for
# it
@actions_created_avg_last_months_hash = Hash.new("null")
1.upto(@month_count) { |i|
@actions_created_avg_last_months_hash[i] = (@actions_created_last_months_hash[i] +
@actions_created_last_months_hash[i+1] +
@actions_created_last_months_hash[i+2])/3.0
}
# correct last two months
@actions_created_avg_last_months_hash[@month_count] = @actions_created_avg_last_months_hash[@month_count] * 3
@actions_created_avg_last_months_hash[@month_count-1] = @actions_created_avg_last_months_hash[@month_count-1] * 3 / 2 if @month_count > 1
# interpolate avg for this month. Assume 31 days in this month
days_passed_this_month = Time.new.day/1.0
@interpolated_actions_created_this_month = (
@actions_created_last_months_hash[0]/days_passed_this_month*31.0+
@actions_created_last_months_hash[1]+
@actions_created_last_months_hash[2]) / 3.0
@interpolated_actions_done_this_month = (
@actions_done_last_months_hash[0]/days_passed_this_month*31.0 +
@actions_done_last_months_hash[1]+
@actions_done_last_months_hash[2]) / 3.0
render :layout => false
end
def actions_done_last30days_data
# get actions created and completed in the past 30 days.
@actions_done_last30days = @actions.find(:all, {

View file

@ -11,6 +11,8 @@
&line_7=1,0xAA0000&
&line_8=1,0x007700&
&values=<% 0.upto 11 do |i| -%><%= @actions_created_last12months_hash[i]%>,<% end -%><%= @actions_created_last12months_hash[12]%>&
&links=<% 0.upto 11 do |i| -%><%= url_for :controller => 'stats', :action => 'actions_done_last_years' %>,<% end -%><%= url_for :controller => 'stats', :action => 'actions_done_last_years' %>&
&links_2=<% 0.upto 11 do |i| -%><%= url_for :controller => 'stats', :action => 'actions_done_last_years' %>,<% end -%><%= url_for :controller => 'stats', :action => 'actions_done_last_years' %>&
&values_2=<% 0.upto 11 do |i| -%><%= @actions_done_last12months_hash[i]%>,<% end -%><%= @actions_done_last12months_hash[12]%>&
&values_3=<%0.upto 11 do |i| -%><%=@sum_actions_created_last12months/12-%>,<%end-%><%=@sum_actions_created_last12months/12-%>&
&values_4=<%0.upto 11 do |i| -%><%=@sum_actions_done_last12months/12-%>,<%end-%><%=@sum_actions_done_last12months/12-%>&

View file

@ -0,0 +1,2 @@
<%= render :partial => 'chart', :locals => {:width => @chart_width, :height => @chart_height, :data => url_for(:action => :actions_done_lastyears_data)} -%>
Click <%=link_to "here", {:controller => "stats", :action => "index"} %> to return to the statistics page.

View file

@ -0,0 +1,29 @@
&title=Actions in the last years,{font-size:16},&
&y_legend=Number of actions,12,0x736AFF&
&x_legend=Months ago,12,0x736AFF&
&y_ticks=5,10,5&
&filled_bar=50,0x9933CC,0x8010A0,Created,9&
&filled_bar_2=50,0x0066CC,0x0066CC,Completed,9&
&line_3=2,0x00FF00, Avg Created, 9&
&line_4=2,0xFF0000, Avg Completed, 9&
&line_5=2,0x007700, 3 Month Avg Created, 9&
&line_6=2,0xAA0000, 3 Month Avg Completed, 9&
&line_7=1,0xAA0000&
&line_8=1,0x007700&
&values=<% 0.upto @month_count-1 do |i| -%><%= @actions_created_last_months_hash[i]%>,<% end -%><%= @actions_created_last_months_hash[@month_count]%>&
&values_2=<% 0.upto @month_count-1 do |i| -%><%= @actions_done_last_months_hash[i]%>,<% end -%><%= @actions_done_last_months_hash[@month_count]%>&
&values_3=<%0.upto @month_count-1 do |i| -%><%=@sum_actions_created_last_months/@month_count-%>,<%end-%><%=@sum_actions_created_last_months/@month_count-%>&
&values_4=<%0.upto @month_count-1 do |i| -%><%=@sum_actions_done_last_months/@month_count-%>,<%end-%><%=@sum_actions_done_last_months/@month_count-%>&
&values_5=<%0.upto @month_count-1 do |i| -%><%=@actions_created_avg_last_months_hash[i]-%>,<%end-%><%=@actions_created_avg_last_months_hash[@month_count]-%>&
&values_6=<%0.upto @month_count-1 do |i| -%><%=@actions_done_avg_last_months_hash[i]-%>,<%end-%><%=@actions_done_avg_last_months_hash[@month_count]-%>&
&values_7=<%=@interpolated_actions_created_this_month%>,<%=@actions_done_avg_last_months_hash[1]%>&
&values_8=<%=@interpolated_actions_done_this_month%>,<%=@actions_created_avg_last_months_hash[1]%>&
&x_labels=<%0.upto @month_count-1 do |i| -%>
<%= Date::MONTHNAMES[ (Time.now.mon - i -1 ) % 12 + 1 ] + " " + (Time.now - i.months).year.to_s -%>,
<% end -%>
<%= Date::MONTHNAMES[(Time.now.mon - @month_count -1 ) % 12 + 1] + " " + (Time.now - @month_count.months).year.to_s -%>&
&y_min=0&
<% # add one to @max for people who have no actions completed yet.
# OpenFlashChart cannot handle y_max=0 -%>
&y_max=<%=@max+@max/10+1-%>&
&x_label_style=9,,2,&

View file

@ -1,30 +1,30 @@
<div class="stats_content">
<h2>Totals</h2>
<%= render :partial => 'totals' -%>
<% unless @actions.empty? -%>
<h2>Actions</h2>
<%= render :partial => 'actions' -%>
<h2>Contexts</h2>
<%= render :partial => 'contexts' -%>
<h2>Projects</h2>
<%= render :partial => 'projects' -%>
<h2>Tags</h2>
<%= render :partial => 'tags' -%>
<% else -%>
<p>More statistics will appear here once you have added some actions.</p>
<% end -%>
<h2>Totals</h2>
<%= render :partial => 'totals' -%>
<% unless @actions.empty? -%>
<h2>Actions</h2>
<%= render :partial => 'actions' -%>
<h2>Contexts</h2>
<%= render :partial => 'contexts' -%>
<h2>Projects</h2>
<%= render :partial => 'projects' -%>
<h2>Tags</h2>
<%= render :partial => 'tags' -%>
<% else -%>
<p>More statistics will appear here once you have added some actions.</p>
<% end -%>
</div>