backlog 0.10.8 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -0
- data/app/controllers/backlogs_controller.rb +2 -0
- data/app/controllers/work_accounts_controller.rb +51 -0
- data/app/controllers/works_controller.rb +72 -29
- data/app/helpers/application_helper.rb +1 -2
- data/app/helpers/work_accounts_helper.rb +2 -0
- data/app/models/backlog.rb +10 -3
- data/app/models/configuration.rb +2 -0
- data/app/models/customer.rb +2 -0
- data/app/models/task.rb +26 -5
- data/app/models/work.rb +18 -13
- data/app/models/work_account.rb +12 -0
- data/app/views/backlogs/_form.rhtml +5 -4
- data/app/views/layouts/_left_top.rhtml +1 -8
- data/app/views/layouts/_notice.rhtml +15 -0
- data/app/views/layouts/wide.rhtml +4 -10
- data/app/views/tasks/_fields_header.rhtml +1 -1
- data/app/views/work_accounts/_form.rhtml +10 -0
- data/app/views/work_accounts/_name_list.rhtml +5 -0
- data/app/views/work_accounts/edit.rhtml +9 -0
- data/app/views/work_accounts/list.rhtml +27 -0
- data/app/views/work_accounts/new.rhtml +8 -0
- data/app/views/work_accounts/show.rhtml +8 -0
- data/app/views/works/_description_list.rhtml +5 -0
- data/app/views/works/_form.rhtml +8 -2
- data/app/views/works/_row.rhtml +32 -0
- data/app/views/works/_row_field.rhtml +3 -0
- data/app/views/works/daily_work_sheet.rhtml +35 -59
- data/app/views/works/edit.rhtml +1 -1
- data/app/views/works/list.rhtml +1 -1
- data/app/views/works/timeliste.rhtml +3 -3
- data/app/views/works/update_row.rjs +6 -0
- data/app/views/works/weekly_work_sheet.rhtml +5 -5
- data/bin/backlog +4 -1
- data/bin/backlog_init.d +13 -0
- data/config/database.yml +0 -4
- data/config/environment.rb +1 -1
- data/db/backup/backlogs.yml +118 -0
- data/db/backup/estimates.yml +7371 -0
- data/db/backup/groups.yml +37 -0
- data/db/backup/parties.yml +2 -0
- data/db/backup/periods.yml +386 -0
- data/db/backup/task_files.yml +2 -0
- data/db/backup/tasks.yml +15770 -0
- data/db/backup/users.yml +209 -0
- data/db/backup/works.yml +6203 -0
- data/db/migrate/018_create_groups.rb +0 -1
- data/db/migrate/021_create_work_accounts.rb +113 -0
- data/db/schema.rb +35 -10
- data/lang/en.yaml +3 -0
- data/lang/no.yaml +3 -0
- data/lib/change_column_null_migration_fix.rb +13 -0
- data/nbproject/private/config.properties +0 -0
- data/nbproject/private/private.properties +1 -0
- data/nbproject/private/private.xml +4 -0
- data/nbproject/private/rake-t.txt +95 -0
- data/nbproject/project.properties +4 -0
- data/nbproject/project.xml +9 -0
- data/public/Frav/303/246rsskjema.xls +0 -0
- data/public/stylesheets/scaffold.css +74 -0
- data/test/fixtures/backlogs.yml +2 -0
- data/test/fixtures/configurations.yml +5 -0
- data/test/fixtures/customers.yml +7 -0
- data/test/fixtures/tasks.yml +1 -0
- data/test/fixtures/users.yml +3 -5
- data/test/fixtures/work_accounts.yml +7 -0
- data/test/fixtures/works.yml +11 -0
- data/test/functional/backlogs_controller_test.rb +1 -1
- data/test/functional/work_accounts_controller_test.rb +93 -0
- data/test/functional/works_controller_test.rb +6 -2
- data/test/integration/user_system_test.rb +1 -1
- data/test/performance/test.rb +4 -1
- data/test/unit/configuration_test.rb +10 -0
- data/test/unit/customer_test.rb +10 -0
- data/test/unit/estimate_test.rb +1 -1
- data/test/unit/group_test.rb +1 -1
- data/test/unit/period_test.rb +1 -1
- data/test/unit/task_file_test.rb +1 -1
- data/test/unit/task_test.rb +1 -1
- data/test/unit/work_account_test.rb +10 -0
- data/test/unit/work_test.rb +1 -1
- data/vendor/plugins/goldspike/lib/java_library.rb +5 -11
- data/vendor/plugins/goldspike/lib/run.rb +1 -2
- data/vendor/plugins/goldspike/lib/war_config.rb +7 -10
- metadata +50 -3
- 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 => [ :
|
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
|
28
|
-
|
29
|
-
|
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]
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
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
|
75
|
-
|
76
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
130
|
-
|
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
|
-
|
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
|
-
|
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
|
data/app/models/backlog.rb
CHANGED
@@ -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
|
-
|
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
|
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.
|
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
|
-
|
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 :
|
11
|
+
validates_presence_of :work_account
|
12
12
|
|
13
|
-
def
|
14
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
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.
|
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
|
-
|
62
|
-
|
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
|
-
|
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
|
-
|
73
|
+
totals_per_work_account
|
69
74
|
end
|
70
75
|
|
71
76
|
def self.find_work_for_day date
|