Defect #5329 » 5329_add_year_of_week_to_time_entries.diff
| test/functional/timelog_controller_test.rb (working copy) | ||
|---|---|---|
| 173 | 173 |
assert_equal "8.65", "%.2f" % assigns(:total_hours) |
| 174 | 174 |
end |
| 175 | 175 |
|
| 176 |
def test_report_one_criteria_year_spanning_week |
|
| 177 |
get :report, :project_id => 1, :columns => 'week', :from => "2009-12-01", :to => "2010-01-31", :criterias => ['project'] |
|
| 178 | ||
| 179 |
assert_response :success |
|
| 180 |
assert_template 'report' |
|
| 181 |
assert_not_nil assigns(:total_hours) |
|
| 182 |
assert_equal "3.00", "%.2f" % assigns(:total_hours) |
|
| 183 |
|
|
| 184 |
# one entry for 2009-12 and one for 2010-01 |
|
| 185 |
assert_not_nil assigns(:hours) |
|
| 186 |
assert_equal 2, assigns(:hours).count |
|
| 187 |
|
|
| 188 |
assigns(:hours).each do |week| |
|
| 189 |
assert_equal "2009-53", week["week"] |
|
| 190 |
end |
|
| 191 |
hours = assigns(:hours).sum{|week| week["hours"].to_f}
|
|
| 192 |
assert_equal "3.00", "%.2f" % hours |
|
| 193 |
end |
|
| 194 |
|
|
| 195 |
|
|
| 176 | 196 |
def test_report_two_criterias |
| 177 | 197 |
get :report, :project_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criterias => ["member", "activity"] |
| 178 | 198 |
assert_response :success |
| test/fixtures/time_entries.yml (working copy) | ||
|---|---|---|
| 13 | 13 |
hours: 4.25 |
| 14 | 14 |
user_id: 2 |
| 15 | 15 |
tyear: 2007 |
| 16 |
twyear: 2007 |
|
| 16 | 17 |
time_entries_002: |
| 17 | 18 |
created_on: 2007-03-23 14:11:04 +01:00 |
| 18 | 19 |
tweek: 11 |
| ... | ... | |
| 27 | 28 |
hours: 150.0 |
| 28 | 29 |
user_id: 1 |
| 29 | 30 |
tyear: 2007 |
| 31 |
twyear: 2007 |
|
| 30 | 32 |
time_entries_003: |
| 31 | 33 |
created_on: 2007-04-21 12:20:48 +02:00 |
| 32 | 34 |
tweek: 16 |
| ... | ... | |
| 41 | 43 |
hours: 1.0 |
| 42 | 44 |
user_id: 1 |
| 43 | 45 |
tyear: 2007 |
| 46 |
twyear: 2007 |
|
| 44 | 47 |
time_entries_004: |
| 45 | 48 |
created_on: 2007-04-22 12:20:48 +02:00 |
| 46 | 49 |
tweek: 16 |
| ... | ... | |
| 55 | 58 |
hours: 7.65 |
| 56 | 59 |
user_id: 1 |
| 57 | 60 |
tyear: 2007 |
| 58 |
|
|
| 61 |
twyear: 2007 |
|
| 62 |
time_entries_005: |
|
| 63 |
created_on: 2010-04-22 12:20:48 +02:00 |
|
| 64 |
tweek: 53 |
|
| 65 |
tmonth: 12 |
|
| 66 |
project_id: 5 |
|
| 67 |
comments: "old year, old week" |
|
| 68 |
updated_on: 2010-04-22 12:20:48 +02:00 |
|
| 69 |
activity_id: 11 |
|
| 70 |
spent_on: 2009-12-31 |
|
| 71 |
issue_id: |
|
| 72 |
id: 5 |
|
| 73 |
hours: 1 |
|
| 74 |
user_id: 1 |
|
| 75 |
tyear: 2009 |
|
| 76 |
twyear: 2009 |
|
| 77 |
time_entries_006: |
|
| 78 |
created_on: 2010-04-22 12:20:48 +02:00 |
|
| 79 |
tweek: 53 |
|
| 80 |
tmonth: 1 |
|
| 81 |
project_id: 5 |
|
| 82 |
comments: "new year, old week" |
|
| 83 |
updated_on: 2007-04-22 12:20:48 +02:00 |
|
| 84 |
activity_id: 11 |
|
| 85 |
spent_on: 2010-01-01 |
|
| 86 |
issue_id: |
|
| 87 |
id: 6 |
|
| 88 |
hours: 2 |
|
| 89 |
user_id: 1 |
|
| 90 |
tyear: 2010 |
|
| 91 |
twyear: 2009 |
|
| app/models/time_entry.rb (working copy) | ||
|---|---|---|
| 23 | 23 |
belongs_to :user |
| 24 | 24 |
belongs_to :activity, :class_name => 'TimeEntryActivity', :foreign_key => 'activity_id' |
| 25 | 25 |
|
| 26 |
attr_protected :project_id, :user_id, :tyear, :tmonth, :tweek |
|
| 26 |
attr_protected :project_id, :user_id, :tyear, :tmonth, :tweek, :twyear
|
|
| 27 | 27 | |
| 28 | 28 |
acts_as_customizable |
| 29 | 29 |
acts_as_event :title => Proc.new {|o| "#{l_hours(o.hours)} (#{(o.issue || o.project).event_title})"},
|
| ... | ... | |
| 62 | 62 |
write_attribute :hours, (h.is_a?(String) ? (h.to_hours || h) : h) |
| 63 | 63 |
end |
| 64 | 64 |
|
| 65 |
# tyear, tmonth, tweek assigned where setting spent_on attributes |
|
| 65 |
# tyear, tmonth, tweek, twyear assigned where setting spent_on attributes
|
|
| 66 | 66 |
# these attributes make time aggregations easier |
| 67 | 67 |
def spent_on=(date) |
| 68 | 68 |
super |
| 69 | 69 |
self.tyear = spent_on ? spent_on.year : nil |
| 70 | 70 |
self.tmonth = spent_on ? spent_on.month : nil |
| 71 | 71 |
self.tweek = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cweek : nil |
| 72 |
self.twyear = spent_on ? Date.civil(spent_on.year, spent_on.month, spent_on.day).cwyear : nil |
|
| 72 | 73 |
end |
| 73 | 74 |
|
| 74 | 75 |
# Returns true if the time entry can be edited by usr, otherwise false |
| app/controllers/timelog_controller.rb (working copy) | ||
|---|---|---|
| 81 | 81 |
@criterias = @criterias[0,3] |
| 82 | 82 |
|
| 83 | 83 |
@columns = (params[:columns] && %w(year month week day).include?(params[:columns])) ? params[:columns] : 'month' |
| 84 |
year_column = (@columns == 'week' ? 'twyear' : 'tyear') |
|
| 84 | 85 |
|
| 85 | 86 |
retrieve_date_range |
| 86 | 87 |
|
| ... | ... | |
| 97 | 98 |
sql_condition = "#{Issue.table_name}.root_id = #{@issue.root_id} AND #{Issue.table_name}.lft >= #{@issue.lft} AND #{Issue.table_name}.rgt <= #{@issue.rgt}"
|
| 98 | 99 |
end |
| 99 | 100 | |
| 100 |
sql = "SELECT #{sql_select}, tyear, tmonth, tweek, spent_on, SUM(hours) AS hours"
|
|
| 101 |
sql = "SELECT #{sql_select}, #{year_column}, tmonth, tweek, spent_on, SUM(hours) AS hours"
|
|
| 101 | 102 |
sql << " FROM #{TimeEntry.table_name}"
|
| 102 | 103 |
sql << " LEFT JOIN #{Issue.table_name} ON #{TimeEntry.table_name}.issue_id = #{Issue.table_name}.id"
|
| 103 | 104 |
sql << " LEFT JOIN #{Project.table_name} ON #{TimeEntry.table_name}.project_id = #{Project.table_name}.id"
|
| 104 | 105 |
sql << " WHERE" |
| 105 | 106 |
sql << " (%s) AND" % sql_condition |
| 106 | 107 |
sql << " (spent_on BETWEEN '%s' AND '%s')" % [ActiveRecord::Base.connection.quoted_date(@from), ActiveRecord::Base.connection.quoted_date(@to)] |
| 107 |
sql << " GROUP BY #{sql_group_by}, tyear, tmonth, tweek, spent_on"
|
|
| 108 |
sql << " GROUP BY #{sql_group_by}, #{year_column}, tmonth, tweek, spent_on"
|
|
| 108 | 109 |
|
| 109 | 110 |
@hours = ActiveRecord::Base.connection.select_all(sql) |
| 110 | 111 |
|
| ... | ... | |
| 115 | 116 |
when 'month' |
| 116 | 117 |
row['month'] = "#{row['tyear']}-#{row['tmonth']}"
|
| 117 | 118 |
when 'week' |
| 118 |
row['week'] = "#{row['tyear']}-#{row['tweek']}"
|
|
| 119 |
row['week'] = "#{row['twyear']}-#{row['tweek']}"
|
|
| 119 | 120 |
when 'day' |
| 120 | 121 |
row['day'] = "#{row['spent_on']}"
|
| 121 | 122 |
end |
| ... | ... | |
| 136 | 137 |
@periods << "#{date_from.year}-#{date_from.month}"
|
| 137 | 138 |
date_from = (date_from + 1.month).at_beginning_of_month |
| 138 | 139 |
when 'week' |
| 139 |
@periods << "#{date_from.year}-#{date_from.to_date.cweek}"
|
|
| 140 |
@periods << "#{date_from.to_date.cwyear}-#{date_from.to_date.cweek}"
|
|
| 140 | 141 |
date_from = (date_from + 7.day).at_beginning_of_week |
| 141 | 142 |
when 'day' |
| 142 | 143 |
@periods << "#{date_from.to_date}"
|
| db/migrate/20100630181445_add_year_of_week_to_time_entries.rb (revision 0) | ||
|---|---|---|
| 1 |
class AddYearOfWeekToTimeEntries < ActiveRecord::Migration |
|
| 2 |
class TimeEntry < ActiveRecord::Base |
|
| 3 |
end |
|
| 4 |
|
|
| 5 |
def self.up |
|
| 6 |
add_column :time_entries, :twyear, :integer |
|
| 7 |
|
|
| 8 |
TimeEntry.all.each do |t| |
|
| 9 |
t.update_attributes({
|
|
| 10 |
:twyear => Date.civil(t.spent_on.year, t.spent_on.month, t.spent_on.day).cwyear |
|
| 11 |
}) |
|
| 12 |
end |
|
| 13 |
|
|
| 14 |
change_column :time_entries, :twyear, :integer, :null => false |
|
| 15 |
end |
|
| 16 | ||
| 17 |
def self.down |
|
| 18 |
remove_column :time_entries, :twyear |
|
| 19 |
end |
|
| 20 |
end |
|