backlog 0.10.8 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|