backlog 0.10.8 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/History.txt +14 -0
  2. data/app/controllers/backlogs_controller.rb +2 -0
  3. data/app/controllers/work_accounts_controller.rb +51 -0
  4. data/app/controllers/works_controller.rb +72 -29
  5. data/app/helpers/application_helper.rb +1 -2
  6. data/app/helpers/work_accounts_helper.rb +2 -0
  7. data/app/models/backlog.rb +10 -3
  8. data/app/models/configuration.rb +2 -0
  9. data/app/models/customer.rb +2 -0
  10. data/app/models/task.rb +26 -5
  11. data/app/models/work.rb +18 -13
  12. data/app/models/work_account.rb +12 -0
  13. data/app/views/backlogs/_form.rhtml +5 -4
  14. data/app/views/layouts/_left_top.rhtml +1 -8
  15. data/app/views/layouts/_notice.rhtml +15 -0
  16. data/app/views/layouts/wide.rhtml +4 -10
  17. data/app/views/tasks/_fields_header.rhtml +1 -1
  18. data/app/views/work_accounts/_form.rhtml +10 -0
  19. data/app/views/work_accounts/_name_list.rhtml +5 -0
  20. data/app/views/work_accounts/edit.rhtml +9 -0
  21. data/app/views/work_accounts/list.rhtml +27 -0
  22. data/app/views/work_accounts/new.rhtml +8 -0
  23. data/app/views/work_accounts/show.rhtml +8 -0
  24. data/app/views/works/_description_list.rhtml +5 -0
  25. data/app/views/works/_form.rhtml +8 -2
  26. data/app/views/works/_row.rhtml +32 -0
  27. data/app/views/works/_row_field.rhtml +3 -0
  28. data/app/views/works/daily_work_sheet.rhtml +35 -59
  29. data/app/views/works/edit.rhtml +1 -1
  30. data/app/views/works/list.rhtml +1 -1
  31. data/app/views/works/timeliste.rhtml +3 -3
  32. data/app/views/works/update_row.rjs +6 -0
  33. data/app/views/works/weekly_work_sheet.rhtml +5 -5
  34. data/bin/backlog +4 -1
  35. data/bin/backlog_init.d +13 -0
  36. data/config/database.yml +0 -4
  37. data/config/environment.rb +1 -1
  38. data/db/backup/backlogs.yml +118 -0
  39. data/db/backup/estimates.yml +7371 -0
  40. data/db/backup/groups.yml +37 -0
  41. data/db/backup/parties.yml +2 -0
  42. data/db/backup/periods.yml +386 -0
  43. data/db/backup/task_files.yml +2 -0
  44. data/db/backup/tasks.yml +15770 -0
  45. data/db/backup/users.yml +209 -0
  46. data/db/backup/works.yml +6203 -0
  47. data/db/migrate/018_create_groups.rb +0 -1
  48. data/db/migrate/021_create_work_accounts.rb +113 -0
  49. data/db/schema.rb +35 -10
  50. data/lang/en.yaml +3 -0
  51. data/lang/no.yaml +3 -0
  52. data/lib/change_column_null_migration_fix.rb +13 -0
  53. data/nbproject/private/config.properties +0 -0
  54. data/nbproject/private/private.properties +1 -0
  55. data/nbproject/private/private.xml +4 -0
  56. data/nbproject/private/rake-t.txt +95 -0
  57. data/nbproject/project.properties +4 -0
  58. data/nbproject/project.xml +9 -0
  59. data/public/Frav/303/246rsskjema.xls +0 -0
  60. data/public/stylesheets/scaffold.css +74 -0
  61. data/test/fixtures/backlogs.yml +2 -0
  62. data/test/fixtures/configurations.yml +5 -0
  63. data/test/fixtures/customers.yml +7 -0
  64. data/test/fixtures/tasks.yml +1 -0
  65. data/test/fixtures/users.yml +3 -5
  66. data/test/fixtures/work_accounts.yml +7 -0
  67. data/test/fixtures/works.yml +11 -0
  68. data/test/functional/backlogs_controller_test.rb +1 -1
  69. data/test/functional/work_accounts_controller_test.rb +93 -0
  70. data/test/functional/works_controller_test.rb +6 -2
  71. data/test/integration/user_system_test.rb +1 -1
  72. data/test/performance/test.rb +4 -1
  73. data/test/unit/configuration_test.rb +10 -0
  74. data/test/unit/customer_test.rb +10 -0
  75. data/test/unit/estimate_test.rb +1 -1
  76. data/test/unit/group_test.rb +1 -1
  77. data/test/unit/period_test.rb +1 -1
  78. data/test/unit/task_file_test.rb +1 -1
  79. data/test/unit/task_test.rb +1 -1
  80. data/test/unit/work_account_test.rb +10 -0
  81. data/test/unit/work_test.rb +1 -1
  82. data/vendor/plugins/goldspike/lib/java_library.rb +5 -11
  83. data/vendor/plugins/goldspike/lib/run.rb +1 -2
  84. data/vendor/plugins/goldspike/lib/war_config.rb +7 -10
  85. metadata +50 -3
  86. data/app/views/tasks/_description_list.rhtml +0 -5
data/History.txt CHANGED
@@ -1,3 +1,17 @@
1
+ == 0.11.0 2007-10-26
2
+
3
+ ===Features
4
+
5
+ * Added work accounts, required for all work records.
6
+ * Allow work records to be entered without task reference.
7
+ * Improved the Daily Work Sheet slightly. STILL EXPERIMENTAL!
8
+
9
+ === Fixes
10
+
11
+ * Added init scripts on unix to start at boot.
12
+ * Now display validation errors on the Works form when editing.
13
+ * Locked the backlog application to Rails 1.2.4 since Rails 1.2.5 broke acts_as_list
14
+
1
15
  == 0.10.8 2007-09-27
2
16
 
3
17
  === Fixes
@@ -46,6 +46,7 @@ class BacklogsController < ApplicationController
46
46
 
47
47
  def new
48
48
  @backlog = Backlog.new
49
+ @work_accounts = WorkAccount.find(:all)
49
50
  end
50
51
 
51
52
  def create
@@ -60,6 +61,7 @@ class BacklogsController < ApplicationController
60
61
 
61
62
  def edit
62
63
  @backlog = Backlog.find(params[:id])
64
+ @work_accounts = WorkAccount.find(:all)
63
65
  end
64
66
 
65
67
  def edit_no_layout
@@ -0,0 +1,51 @@
1
+ class WorkAccountsController < ApplicationController
2
+ def index
3
+ list
4
+ render :action => 'list'
5
+ end
6
+
7
+ # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
8
+ verify :method => :post, :only => [ :destroy, :create, :update ],
9
+ :redirect_to => { :action => :list }
10
+
11
+ def list
12
+ @work_account_pages, @work_accounts = paginate :work_accounts, :per_page => 10
13
+ end
14
+
15
+ def show
16
+ @work_account = WorkAccount.find(params[:id])
17
+ end
18
+
19
+ def new
20
+ @work_account = WorkAccount.new
21
+ end
22
+
23
+ def create
24
+ @work_account = WorkAccount.new(params[:work_account])
25
+ if @work_account.save
26
+ flash[:notice] = 'WorkAccount was successfully created.'
27
+ redirect_to :action => 'list'
28
+ else
29
+ render :action => 'new'
30
+ end
31
+ end
32
+
33
+ def edit
34
+ @work_account = WorkAccount.find(params[:id])
35
+ end
36
+
37
+ def update
38
+ @work_account = WorkAccount.find(params[:id])
39
+ if @work_account.update_attributes(params[:work_account])
40
+ flash[:notice] = 'WorkAccount was successfully updated.'
41
+ redirect_to :action => 'show', :id => @work_account
42
+ else
43
+ render :action => 'edit'
44
+ end
45
+ end
46
+
47
+ def destroy
48
+ WorkAccount.find(params[:id]).destroy
49
+ redirect_to :action => 'list'
50
+ end
51
+ end
@@ -3,7 +3,8 @@ class WorksController < ApplicationController
3
3
  in_place_edit_for :work, :invoice
4
4
  in_place_edit_for :work, :started_at_time
5
5
  in_place_edit_for :work, :completed_at_time
6
- skip_before_filter :populate_layout, :only => [ :set_work_hours, :weekly_work_sheet, :weekly_work_sheet2, :timeliste ]
6
+ skip_before_filter :populate_layout, :only => [ :auto_complete_for_work_description, :daily_work_sheet, :set_work_hours, :timeliste, :weekly_work_sheet, :weekly_work_sheet2 ]
7
+ auto_complete_for :work, :description
7
8
 
8
9
  def index
9
10
  list
@@ -24,36 +25,47 @@ class WorksController < ApplicationController
24
25
  end
25
26
 
26
27
  def new
27
- @work = Work.new(params[:work])
28
- @work.user = user
29
- @estimate = Estimate.new(params[:estimate])
28
+ unless @work
29
+ @work = Work.new(params[:work])
30
+ @work.user = user
31
+ end
32
+ @estimate ||= Estimate.new(params[:estimate])
33
+ @work_accounts = WorkAccount.find(:all, :order => :name)
30
34
  @tasks = Task.find_open
31
35
  @users = User.find(:all)
32
36
  end
33
37
 
34
38
  def create
35
- if params[:work] && params[:work][:backlog_name] && params[:work][:task_description]
36
- backlog = Backlog.find_by_name(params[:work].delete(:backlog_name))
37
- description = params[:work][:task_description]
38
- task = Task.find_by_backlog_id_and_description(backlog.id, description)
39
- params[:work][:task_id] = task.id
40
- params[:work].delete(:task_description)
39
+ if params[:work]
40
+ backlog_name = params[:work].delete(:backlog_name)
41
+ task_description = params[:work].delete(:task_description)
42
+ if backlog_name && backlog_name.size > 0 && task_description && task_description.size > 0
43
+ backlog = Backlog.find_by_name(backlog_name)
44
+ task = backlog.tasks_with_children.find{|t| t.description == task_description}
45
+ params[:work][:task_id] = task.id
46
+ end
47
+ account_name = params[:work].delete(:work_account_name)
48
+ if account_name && account_name.size > 0
49
+ account = WorkAccount.find_by_name(account_name)
50
+ params[:work][:work_account_id] = account.id
51
+ end
41
52
  end
42
53
  convert_hours_param
43
54
  convert_start_time_param
44
55
  @work = Work.new(params[:work])
45
56
  @work.completed_at = Time.now unless @work.completed_at
46
57
  @work.user_id = current_user.id
47
- if @work.save!
58
+ if @work.save
48
59
  flash[:notice] = 'Work was successfully created.'
49
60
  else
61
+ new
50
62
  render :action => 'new'
51
63
  return
52
64
  end
53
65
 
54
- @work.task.estimates.create!(params[:estimate]) if params[:estimate]
66
+ @work.task.estimates.create!(params[:estimate]) if @work.task && params[:estimate]
55
67
 
56
- back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id
68
+ back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task && @work.task.period, :task_id => @work.task && @work.task.id
57
69
  end
58
70
 
59
71
  def edit
@@ -65,27 +77,48 @@ class WorksController < ApplicationController
65
77
  end
66
78
 
67
79
  def update
80
+ if update_work
81
+ back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id
82
+ else
83
+ @task = @work.task
84
+ edit
85
+ render :action => 'edit'
86
+ end
87
+ end
88
+
89
+ def update_row
90
+ update_work
91
+ flash.discard
92
+ @field = params[:field] || 'started_at_time'
93
+ end
94
+
95
+ def update_work
68
96
  @work = Work.find(params[:id])
69
-
97
+ work = @work
70
98
  convert_start_time_param
71
99
  convert_hours_param
72
100
  if @work.update_attributes(params[:work])
73
101
  flash[:notice] = 'Work was successfully updated.'
74
- if params[:estimate].nil? || (@estimate = @work.task.estimates.create(params[:estimate])).errors.size == 0
75
- back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id
76
- return
102
+ if @work.task
103
+ if params[:estimate]
104
+ if (@estimate = @work.task.estimates.create(params[:estimate])).errors.size == 0
105
+ return true
106
+ end
107
+ else
108
+ return true
109
+ end
110
+ else
111
+ return true
77
112
  end
78
113
  end
79
- @task = @work.task
80
- edit
81
- render :action => 'edit'
114
+ return false
82
115
  end
83
116
 
84
117
  def destroy
85
118
  work = Work.find(params[:id])
86
- period = work.task.period
119
+ period = work.task && work.task.period
87
120
  work.destroy
88
- redirect_to :controller => 'periods', :action => :list_work, :id => period
121
+ back_or_redirect_to :controller => 'periods', :action => :list_work, :id => period
89
122
  end
90
123
 
91
124
  def daily_work_sheet
@@ -93,6 +126,7 @@ class WorksController < ApplicationController
93
126
  @periods = []
94
127
  @works = Work.find_work_for_day @date
95
128
  @started_works = Task.find_started
129
+ @work = Work.new(:started_at => Time.now, :completed_at => Time.now)
96
130
  render :layout => 'wide'
97
131
  end
98
132
 
@@ -110,6 +144,15 @@ class WorksController < ApplicationController
110
144
  render :layout => false
111
145
  end
112
146
 
147
+ def auto_complete_for_work_work_account_name
148
+ @accounts = WorkAccount.find(:all,
149
+ :conditions => [ 'LOWER(name) LIKE ?',
150
+ '%' + params[:work][:work_account_name].downcase + '%' ],
151
+ :order => 'name ASC',
152
+ :limit => 16)
153
+ render :partial => '/work_accounts/name_list'
154
+ end
155
+
113
156
  def auto_complete_for_work_backlog_name
114
157
  @backlogs = Backlog.find(:all,
115
158
  :conditions => [ 'LOWER(name) LIKE ?',
@@ -121,17 +164,17 @@ class WorksController < ApplicationController
121
164
 
122
165
  def auto_complete_for_work_task_description
123
166
  if backlog_name = params[:backlog_name]
124
- if backlog = Backlog.find_by_name(backlog_name)
125
- backlog_clause = " AND backlog_id = #{backlog.id}"
167
+ if @backlog = Backlog.find_by_name(backlog_name)
168
+ @tasks = @backlog.tasks_with_children.select {|t| t.description.downcase =~ /#{params[:work][:task_description].downcase}/}
126
169
  end
127
170
  end
128
-
129
- @tasks = Task.find(:all,
130
- :conditions => [ "finished_at IS NULL AND LOWER(description) LIKE ?#{backlog_clause}",
131
- '%' + params[:work][:task_description].downcase + '%' ],
171
+ @tasks ||= Task.find(:all,
172
+ :conditions => [ "finished_at IS NULL AND LOWER(description) LIKE ?",
173
+ '%' + params[:work][:task_description].downcase + '%' ],
132
174
  :order => 'description ASC',
133
175
  :limit => 16)
134
- render :partial => '/tasks/description_list'
176
+
177
+ render :partial => 'description_list'
135
178
  end
136
179
 
137
180
  private
@@ -6,8 +6,7 @@ module ApplicationHelper
6
6
  include UrlForFix
7
7
 
8
8
  def image_button_to(image_source, title, options)
9
- html = ''
10
- html += image_submit_tag image_source, :class => 'image-submit', :alt => title, :title => title,
9
+ image_submit_tag image_source, :class => 'image-submit', :alt => title, :title => title,
11
10
  :id => "#{title}_#{options[:id]}", :name => title,
12
11
  :onclick => "form.action='#{url_for(options)}'"
13
12
  end
@@ -0,0 +1,2 @@
1
+ module WorkAccountsHelper
2
+ end
@@ -4,12 +4,11 @@ class Backlog < ActiveRecord::Base
4
4
  validates_uniqueness_of :name
5
5
  validates_inclusion_of :track_todo, :in => [true, false], :allow_nil => true, :message => ActiveRecord::Errors.default_error_messages[:blank]
6
6
  validates_inclusion_of :track_done, :in => [true, false], :allow_nil => true, :message => ActiveRecord::Errors.default_error_messages[:blank]
7
- validates_inclusion_of :track_times, :in => [true, false], :allow_nil => true, :message => ActiveRecord::Errors.default_error_messages[:blank]
8
7
  validates_inclusion_of :enable_subtasks, :in => [true, false], :allow_nil => false, :message => ActiveRecord::Errors.default_error_messages[:blank]
9
8
  validates_inclusion_of :enable_customer, :in => [true, false], :allow_nil => true, :message => ActiveRecord::Errors.default_error_messages[:blank]
10
9
  validates_inclusion_of :enable_users, :in => [true, false], :allow_nil => true, :message => ActiveRecord::Errors.default_error_messages[:blank]
11
- validates_length_of :invoice_code, :allow_nil => true, :maximum => 255
12
10
 
11
+ belongs_to :work_account
13
12
  has_many :tasks, :order => 'period_id, position', :dependent => :destroy
14
13
  has_many :unplanned_tasks, :class_name => 'Task', :conditions => 'period_id IS NULL', :order => 'position'
15
14
 
@@ -21,6 +20,10 @@ class Backlog < ActiveRecord::Base
21
20
  Task.find(:all, :conditions => "period_id = #{periods.first.id} AND (position IS NOT NULL OR finished_at >= '#{1.week.ago.iso8601}')", :order => "position, finished_at")
22
21
  end
23
22
 
23
+ def tasks_with_children
24
+ tasks.map {|t| t.self_with_children}.flatten
25
+ end
26
+
24
27
  def estimate_data(date)
25
28
  total = 0
26
29
  periods.each do |period|
@@ -45,7 +48,11 @@ class Backlog < ActiveRecord::Base
45
48
  end
46
49
 
47
50
  def enable_invoicing?
48
- !invoice_code.nil? && invoice_code.length > 0
51
+ work_account && work_account.invoice_code && work_account.invoice_code.length > 0
52
+ end
53
+
54
+ def track_times?
55
+ work_account && work_account.track_times?
49
56
  end
50
57
 
51
58
  end
@@ -0,0 +1,2 @@
1
+ class Configuration < ActiveRecord::Base
2
+ end
@@ -0,0 +1,2 @@
1
+ class Customer < ActiveRecord::Base
2
+ end
data/app/models/task.rb CHANGED
@@ -10,6 +10,8 @@ class Task < ActiveRecord::Base
10
10
  belongs_to :backlog
11
11
  belongs_to :period
12
12
  belongs_to :ancestor_task, :class_name => 'Task', :foreign_key => 'previous_task_id'
13
+ belongs_to :customer
14
+ belongs_to :work_account
13
15
  has_many :descendant_tasks, :class_name => 'Task', :foreign_key => 'previous_task_id', :dependent => :destroy
14
16
  has_many :estimates, :order => 'created_at', :dependent => :destroy
15
17
  has_many :works, :order => 'completed_at', :dependent => :destroy
@@ -61,6 +63,10 @@ class Task < ActiveRecord::Base
61
63
  return "finished_at >= '#{1.week.ago.iso8601}'"
62
64
  end
63
65
 
66
+ def self_with_children
67
+ [self] << children.map {|t| t.self_with_children}.flatten
68
+ end
69
+
64
70
  def todo
65
71
  estimates.last ? estimates.last.todo : initial_estimate
66
72
  end
@@ -114,9 +120,8 @@ class Task < ActiveRecord::Base
114
120
  if finished_at
115
121
  self.finished_at = nil
116
122
  self.resolution = nil
123
+ self.position = nil
117
124
  insert_at 1
118
- self.position = 1
119
- self.save!
120
125
  estimate(initial_estimate)
121
126
  parent.open if parent
122
127
  end
@@ -160,9 +165,11 @@ class Task < ActiveRecord::Base
160
165
  new_task.period = new_period
161
166
  new_task.description = self.description
162
167
  new_task.initial_estimate = self.initial_estimate
163
- new_task.insert_at 1
164
- new_task.position = 1
168
+ new_task.position = nil
165
169
  new_task.save!
170
+ new_task.insert_at 1
171
+ # new_task.position = 1
172
+ # new_task.save!
166
173
  new_task.estimate(old_todo)
167
174
  end
168
175
  else
@@ -238,7 +245,7 @@ class Task < ActiveRecord::Base
238
245
  end
239
246
 
240
247
  def track_times?
241
- root_task.backlog.track_times?
248
+ work_account && work_account.track_times?
242
249
  end
243
250
 
244
251
  def track_todo?
@@ -266,6 +273,16 @@ class Task < ActiveRecord::Base
266
273
  old_period || root_task.old_period
267
274
  end
268
275
 
276
+ alias_method :old_backlog, :backlog
277
+ def backlog
278
+ old_backlog || root_task.old_backlog
279
+ end
280
+
281
+ alias_method :old_work_account, :work_account
282
+ def work_account
283
+ self.old_work_account || (parent ? parent.work_account : backlog.work_account)
284
+ end
285
+
269
286
  def depth
270
287
  root_task = self
271
288
  depth = 0
@@ -309,7 +326,10 @@ class Task < ActiveRecord::Base
309
326
  return if work_started?
310
327
  open
311
328
  new_work = works.new
329
+
330
+ # TODO (uwe): Only needed for rails 1.2.x branch. Remove when moving to 1.3 or 2.0.
312
331
  new_work.task = self
332
+
313
333
  new_work.started_at = Time.previous_quarter
314
334
  if works.size > 0
315
335
  if current_user
@@ -323,6 +343,7 @@ class Task < ActiveRecord::Base
323
343
  end
324
344
  end
325
345
  new_work.user = current_user
346
+ new_work.work_account_id = work_account.id
326
347
  new_work.save!
327
348
  end
328
349
 
data/app/models/work.rb CHANGED
@@ -4,18 +4,23 @@ class Work < ActiveRecord::Base
4
4
 
5
5
  belongs_to :task
6
6
  belongs_to :user
7
+ belongs_to :work_account
7
8
 
8
- validates_presence_of :task_id
9
9
  validates_associated :task
10
10
  validates_presence_of :started_at
11
- validates_presence_of :user_id, :if => :validate_user?
11
+ validates_presence_of :work_account
12
12
 
13
- def validate_user?
14
- task.enable_users?
13
+ def validate
14
+ errors.add(:work, "Work account is missing") unless work_account
15
+ end
16
+
17
+ alias_method :old_work_account, :work_account
18
+ def work_account
19
+ self.old_work_account || (task && task.work_account)
15
20
  end
16
21
 
17
22
  def track_times?
18
- task.backlog.track_times?
23
+ task && task.backlog && task.backlog.track_times?
19
24
  end
20
25
 
21
26
  # Return an array with an array of works per day:
@@ -48,24 +53,24 @@ class Work < ActiveRecord::Base
48
53
  first = Date.commercial(Date.today.year, week_no, 1)
49
54
  last = first + 7
50
55
  works = find(:all, :conditions => "completed_at IS NOT NULL AND started_at BETWEEN '#{first.to_time.iso8601}' AND '#{last.to_time.iso8601}'", :order => 'started_at')
51
- totals_per_backlog = {}
52
- Backlog.find(:all).each do |backlog|
53
- totals_per_backlog[backlog.id] = [[], []]
56
+ totals_per_work_account = {}
57
+ WorkAccount.find(:all).each do |work_account|
58
+ totals_per_work_account[work_account.id] = [[], []]
54
59
  (0..6).each do |day|
55
- works_for_day = works.select {|work| (work.task.backlog == backlog) && (work.started_at.to_date == (first + day)) && (work.user_id.nil? || (user && work.user_id == user.id)) }
60
+ works_for_day = works.select {|work| (work.work_account == work_account) && (work.started_at.to_date == (first + day)) && (work.user_id.nil? || (user && work.user_id == user.id)) }
56
61
  invoice_works_for_day = works_for_day.select {|work| work.invoice? }
57
62
  internal_works_for_day = works_for_day.select {|work| !work.invoice? }
58
63
 
59
64
  invoice_day_total = invoice_works_for_day.reduce(BigDecimal('0')){|total, work| total += work.hours}
60
65
  internal_day_total = internal_works_for_day.reduce(BigDecimal('0')){|total, work| total += work.hours}
61
- totals_per_backlog[backlog.id][0] << invoice_day_total
62
- totals_per_backlog[backlog.id][1] << internal_day_total
66
+ totals_per_work_account[work_account.id][0] << invoice_day_total
67
+ totals_per_work_account[work_account.id][1] << internal_day_total
63
68
  end
64
69
  end
65
- totals_per_backlog.reject! do |backlog_id, day_totals|
70
+ totals_per_work_account.reject! do |work_account_id, day_totals|
66
71
  !day_totals[0].find{|day_total| day_total > 0} && !day_totals[1].find{|day_total| day_total > 0}
67
72
  end
68
- totals_per_backlog
73
+ totals_per_work_account
69
74
  end
70
75
 
71
76
  def self.find_work_for_day date