22
33module Metrics
44 class LocationHealthCalculator < ApplicationService
5- def call ( event )
6- return 0 unless event . active?
5+ def initialize ( event )
6+ @event = event
7+ end
8+
9+ def call
10+ return 0 unless @event . active?
711
812 factors = [ ]
913
10- factors << calculate_activity_frequency_factor ( event )
11- factors << calculate_volunteer_consistency_factor ( event )
12- factors << calculate_athlete_retention_factor ( event )
13- factors << calculate_results_quality_factor ( event )
14+ factors << calculate_activity_frequency_factor
15+ factors << calculate_volunteer_consistency_factor
16+ factors << calculate_athlete_retention_factor
17+ factors << calculate_results_quality_factor
1418
15- factors . sum . to_f / factors . size * 100
19+ factors . sum . to_f / factors . size
1620 end
1721
1822 private
1923
20- def calculate_activity_frequency_factor ( event )
24+ def calculate_activity_frequency_factor
2125 six_months_ago = Date . current - 6 . months
22- recent_activities = Activity . published . where ( event : event , date : six_months_ago ..) . count
26+ recent_activities = Activity . published . where ( event : @ event, date : six_months_ago ..) . count
2327 ( recent_activities . to_f / 26.0 * 100 ) . clamp ( 0 , 100 )
2428 end
2529
26- def calculate_volunteer_consistency_factor ( event )
30+ def calculate_volunteer_consistency_factor
2731 recent_volunteers = Volunteer . joins ( :activity )
28- . where ( activity : { event : event , published : true , date : ( Date . current - 6 . months ) .. } )
32+ . where ( activity : { event : @ event, published : true , date : ( Date . current - 6 . months ) .. } )
2933 . distinct . count ( :athlete_id )
3034 total_volunteers = Volunteer . joins ( :activity )
31- . where ( activity : { event : event , published : true } )
35+ . where ( activity : { event : @ event, published : true } )
3236 . distinct . count ( :athlete_id )
3337
3438 return 0 if total_volunteers . zero?
3539
3640 ( recent_volunteers . to_f / total_volunteers * 100 ) . clamp ( 0 , 100 )
3741 end
3842
39- def calculate_athlete_retention_factor ( event )
43+ def calculate_athlete_retention_factor
4044 six_months_ago = Date . current - 6 . months
41- total_athletes = event . athletes . count
45+ total_athletes = @ event. athletes . count
4246
4347 recent_athletes = Result . joins ( :activity )
44- . where ( activity : { event : event , published : true , date : six_months_ago .. } )
48+ . where ( activity : { event : @ event, published : true , date : six_months_ago .. } )
4549 . distinct . count ( :athlete_id )
4650
4751 returning_athletes = Result . joins ( :activity )
48- . where ( activity : { event : event , published : true } )
52+ . where ( activity : { event : @ event, published : true } )
4953 . group ( :athlete_id )
5054 . having ( 'COUNT(*) > 1' )
5155 . distinct . count ( :athlete_id )
@@ -58,18 +62,15 @@ def calculate_athlete_retention_factor(event)
5862 ) . clamp ( 0 , 100 )
5963 end
6064
61- def calculate_results_quality_factor ( event )
65+ def calculate_results_quality_factor
6266 recent_results = Result . joins ( :activity )
63- . where ( activity : { event : event , published : true , date : ( Date . current - 3 . months ) .. } )
67+ . includes ( :athlete )
68+ . where ( activity : { event : @event , published : true , date : ( Date . current - 3 . months ) .. } )
6469
6570 total = recent_results . count
6671 return 100 if total . zero?
6772
68- incorrect = Result . joins ( :activity )
69- . where ( activity : { event : event , published : true } )
70- . where (
71- 'total_time IS NULL OR athlete_id IS NOT NULL AND (name IS NULL OR gender IS NULL)' ,
72- ) . count
73+ incorrect = recent_results . count { |result | !result . correct? }
7374
7475 ( 1.0 - ( incorrect . to_f / total ) ) * 100
7576 end
0 commit comments