##// END OF EJS Templates
Reverting commit r1748. Some environments are not allowing the cached file to...
Reverting commit r1748. Some environments are not allowing the cached file to write to public, causing all JavaScript to fail. Javascripts are now cached into a single file for downloads in production mode. #1186 git-svn-id: http://redmine.rubyforge.org/svn/trunk@1771 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r1673:f54c2d812d4d
r1770:8f3a04ce6906
Show More
timelog_helper.rb
150 lines | 5.4 KiB | text/x-ruby | RubyLexer
/ app / helpers / timelog_helper.rb
Jean-Philippe Lang
Added time report....
r569 # redMine - project management software
# Copyright (C) 2006 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 module TimelogHelper
Jean-Philippe Lang
Addq "please select" to activity select box if no activity is set as default (#937)....
r1588 def activity_collection_for_select_options
activities = Enumeration::get_values('ACTI')
collection = []
collection << [ "--- #{l(:actionview_instancetag_blank_option)} ---", '' ] unless activities.detect(&:is_default)
activities.each { |a| collection << [a.name, a.id] }
collection
end
Jean-Philippe Lang
Added time report....
r569 def select_hours(data, criteria, value)
Jean-Philippe Lang
Propagates time tracking to the parent project (closes #433). Time report enhancements....
r1162 data.select {|row| row[criteria] == value}
Jean-Philippe Lang
Added time report....
r569 end
def sum_hours(data)
sum = 0
data.each do |row|
sum += row['hours'].to_f
end
sum
end
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159
def options_for_period_select(value)
options_for_select([[l(:label_all_time), 'all'],
[l(:label_today), 'today'],
[l(:label_yesterday), 'yesterday'],
[l(:label_this_week), 'current_week'],
[l(:label_last_week), 'last_week'],
[l(:label_last_n_days, 7), '7_days'],
[l(:label_this_month), 'current_month'],
[l(:label_last_month), 'last_month'],
[l(:label_last_n_days, 30), '30_days'],
[l(:label_this_year), 'current_year']],
value)
end
def entries_to_csv(entries)
ic = Iconv.new(l(:general_csv_encoding), 'UTF-8')
Jean-Philippe Lang
Adds a key in lang files (general_csv_decimal_separator) to set the decimal separator (point or comma) in csv exports (#1372)....
r1577 decimal_separator = l(:general_csv_decimal_separator)
Jean-Philippe Lang
Adds custom fields to the time entries csv export....
r1673 custom_fields = TimeEntryCustomField.find(:all)
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 export = StringIO.new
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
# csv header fields
headers = [l(:field_spent_on),
l(:field_user),
l(:field_activity),
Jean-Philippe Lang
Propagates time tracking to the parent project (closes #433). Time report enhancements....
r1162 l(:field_project),
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 l(:field_issue),
l(:field_tracker),
l(:field_subject),
l(:field_hours),
l(:field_comments)
]
Jean-Philippe Lang
Adds custom fields to the time entries csv export....
r1673 # Export custom fields
headers += custom_fields.collect(&:name)
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 csv << headers.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
# csv lines
entries.each do |entry|
fields = [l_date(entry.spent_on),
entry.user,
entry.activity,
Jean-Philippe Lang
Propagates time tracking to the parent project (closes #433). Time report enhancements....
r1162 entry.project,
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 (entry.issue ? entry.issue.id : nil),
(entry.issue ? entry.issue.tracker : nil),
(entry.issue ? entry.issue.subject : nil),
Jean-Philippe Lang
Adds a key in lang files (general_csv_decimal_separator) to set the decimal separator (point or comma) in csv exports (#1372)....
r1577 entry.hours.to_s.gsub('.', decimal_separator),
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 entry.comments
]
Jean-Philippe Lang
Adds custom fields to the time entries csv export....
r1673 fields += custom_fields.collect {|f| show_value(entry.custom_value_for(f)) }
Jean-Philippe Lang
Adds date range filter and pagination on time entries detail view (closes #434)....
r1159 csv << fields.collect {|c| begin; ic.iconv(c.to_s); rescue; c.to_s; end }
end
end
export.rewind
export
end
Jean-Philippe Lang
CSV export added to timelog report (#1009)....
r1323
Jean-Philippe Lang
Custom fields (list and boolean) can be used as criteria in time report (#1012)....
r1325 def format_criteria_value(criteria, value)
value.blank? ? l(:label_none) : ((k = @available_criterias[criteria][:klass]) ? k.find_by_id(value.to_i) : format_value(value, @available_criterias[criteria][:format]))
end
Jean-Philippe Lang
CSV export added to timelog report (#1009)....
r1323 def report_to_csv(criterias, periods, hours)
export = StringIO.new
CSV::Writer.generate(export, l(:general_csv_separator)) do |csv|
# Column headers
headers = criterias.collect {|criteria| l(@available_criterias[criteria][:label]) }
headers += periods
headers << l(:label_total)
csv << headers.collect {|c| to_utf8(c) }
# Content
report_criteria_to_csv(csv, criterias, periods, hours)
# Total row
row = [ l(:label_total) ] + [''] * (criterias.size - 1)
total = 0
periods.each do |period|
sum = sum_hours(select_hours(hours, @columns, period.to_s))
total += sum
row << (sum > 0 ? "%.2f" % sum : '')
end
row << "%.2f" %total
csv << row
end
export.rewind
export
end
def report_criteria_to_csv(csv, criterias, periods, hours, level=0)
Jean-Philippe Lang
Custom fields (list and boolean) can be used as criteria in time report (#1012)....
r1325 hours.collect {|h| h[criterias[level]].to_s}.uniq.each do |value|
Jean-Philippe Lang
CSV export added to timelog report (#1009)....
r1323 hours_for_value = select_hours(hours, criterias[level], value)
next if hours_for_value.empty?
row = [''] * level
Jean-Philippe Lang
Custom fields (list and boolean) can be used as criteria in time report (#1012)....
r1325 row << to_utf8(format_criteria_value(criterias[level], value))
Jean-Philippe Lang
CSV export added to timelog report (#1009)....
r1323 row += [''] * (criterias.length - level - 1)
total = 0
periods.each do |period|
sum = sum_hours(select_hours(hours_for_value, @columns, period.to_s))
total += sum
row << (sum > 0 ? "%.2f" % sum : '')
end
row << "%.2f" %total
csv << row
if criterias.length > level + 1
report_criteria_to_csv(csv, criterias, periods, hours_for_value, level + 1)
end
end
end
def to_utf8(s)
@ic ||= Iconv.new(l(:general_csv_encoding), 'UTF-8')
begin; @ic.iconv(s.to_s); rescue; s.to_s; end
end
Jean-Philippe Lang
Simple time tracking functionality added. Time can be logged at issue or project level....
r365 end