summaryrefslogtreecommitdiff
path: root/app/helpers/version_reports_helper.rb
blob: bb6eda65b07dac29c6048c066e3805e0a14af206 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
module VersionReportsHelper

  def display_issue(issue, *options)
    text = issue.subject
    text = text.sub(/\!\!\w*/,'')
    if options.include? :tracker
      text = "#{issue.tracker} ##{issue.id} " + text
    end
    link_to text, issue_path(issue)
  end

  def issue_time(issue)
    if @show_time && issue.total_spent_hours > 0
      l_hours(issue.total_spent_hours)
    end
  end

  def issue_money(issue, *options)
    if @show_money
      amount = custom_price(issue) || hours_to_money(@version, issue.total_spent_hours)
      amount = amount.round
      if options.include?(:format)
        number_to_currency amount, :precision => 0
      else
        amount
      end
    end
  end

  def hours_to_money(version, hours)
    @rate ||= to_float( custom_field_value(version, :rate) || DEFAULT_REPORT_RATE )
    (hours||0) * @rate
  end

  #
  # name is a key for REPORT_CUSTOM_FIELDS hash
  #
  def custom_field(object, name)
    object.custom_field_values.detect {|value|
      value.custom_field.name == REPORT_CUSTOM_FIELDS[name]
    }
  end

  def custom_field_value(object, name)
    v = custom_field(object, name)
    if v
      v.value
    end
  end

  def hour_budget_error(issue)
    return unless @show_time
    budget = (custom_field_value(issue, :hours) || 0).to_i
    if issue.total_spent_hours.round != budget.round
      if issue.total_spent_hours < budget
        content_tag :div, :class => 'flash error' do
          "%s under budget!" % l_hours(budget - issue.total_spent_hours)
        end
      elsif issue.total_spent_hours > budget
        content_tag :div, :class => 'flash warning' do
          "%s over budget!" % l_hours(issue.total_spent_hours - budget)
        end
      end
    end
  end

  def custom_price(issue)
    if value = custom_field_value(issue, :price)
      to_float(value)
    end
  end

  def report_header(version)
    url = custom_field_value(version, :header)
    if !url.present?
      url = DEFAULT_REPORT_HEADER
    end
    %(<img src="#{url}" style="max-width:100%"/>).html_safe
  end

  # show_value requires CustomFieldsHelper
  def report_summary(version)
    show_value(custom_field(version, :summary))
  end

  def total_time(version, issues)
    l_hours(issues.sum(&:total_spent_hours)) if @show_time
  end

  def total_money(version, issues)
    if @show_money
      total = issues.sum {|issue| issue_money(issue)}
      number_to_currency total, :precision => 0
    end
  end

  # drops currency in a string.
  def to_float(string)
    string.gsub(/[^0-9\.]/, '').to_f
  end

end