Module: Legion::Extensions::Rfp::Analytics::Runners::WinRates

Extended by:
Helpers::Client
Includes:
Helpers::Lex
Included in:
Client
Defined in:
lib/legion/extensions/rfp/analytics/runners/win_rates.rb

Instance Method Summary collapse

Methods included from Helpers::Client

client

Instance Method Details

#overall_win_rate(proposals:) ⇒ Object



11
12
13
14
15
16
17
# File 'lib/legion/extensions/rfp/analytics/runners/win_rates.rb', line 11

def overall_win_rate(proposals:, **)
  decided = proposals.select { |p| %i[won lost].include?(p[:outcome]) }
  return { result: 0.0, decided: 0, total: proposals.length } if decided.empty?

  won = decided.count { |p| p[:outcome] == :won }
  { result: (won.to_f / decided.length).round(4), won: won, decided: decided.length }
end

#trend(proposals:, period: :monthly) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/legion/extensions/rfp/analytics/runners/win_rates.rb', line 45

def trend(proposals:, period: :monthly, **)
  sorted = proposals.sort_by { |p| p[:submitted_at] || '' }
  grouped = case period
            when :monthly
              sorted.group_by { |p| p[:submitted_at]&.slice(0, 7) }
            when :quarterly
              sorted.group_by { |p| quarter_key(p[:submitted_at]) }
            else
              sorted.group_by { |p| p[:submitted_at]&.slice(0, 4) }
            end

  trend_data = grouped.transform_values do |group|
    decided = group.select { |p| %i[won lost].include?(p[:outcome]) }
    won = decided.count { |p| p[:outcome] == :won }
    {
      total:   group.length,
      decided: decided.length,
      won:     won,
      rate:    decided.empty? ? 0.0 : (won.to_f / decided.length).round(4)
    }
  end

  { result: trend_data, period: period }
end

#win_rate_by_source(proposals:) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/legion/extensions/rfp/analytics/runners/win_rates.rb', line 19

def win_rate_by_source(proposals:, **)
  grouped = proposals.group_by { |p| p[:rfp_source] }
  rates = grouped.transform_values do |group|
    decided = group.select { |p| %i[won lost].include?(p[:outcome]) }
    next { rate: 0.0, decided: 0 } if decided.empty?

    won = decided.count { |p| p[:outcome] == :won }
    { rate: (won.to_f / decided.length).round(4), won: won, decided: decided.length }
  end

  { result: rates }
end

#win_rate_by_template(proposals:) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/legion/extensions/rfp/analytics/runners/win_rates.rb', line 32

def win_rate_by_template(proposals:, **)
  grouped = proposals.group_by { |p| p[:template] }
  rates = grouped.transform_values do |group|
    decided = group.select { |p| %i[won lost].include?(p[:outcome]) }
    next { rate: 0.0, decided: 0 } if decided.empty?

    won = decided.count { |p| p[:outcome] == :won }
    { rate: (won.to_f / decided.length).round(4), won: won, decided: decided.length }
  end

  { result: rates }
end