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
- #overall_win_rate(proposals:) ⇒ Object
- #trend(proposals:, period: :monthly) ⇒ Object
- #win_rate_by_source(proposals:) ⇒ Object
- #win_rate_by_template(proposals:) ⇒ Object
Methods included from Helpers::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 |