diff options
Diffstat (limited to 'lib/tasks/stats.rake')
-rw-r--r-- | lib/tasks/stats.rake | 96 |
1 files changed, 71 insertions, 25 deletions
diff --git a/lib/tasks/stats.rake b/lib/tasks/stats.rake index e1b58905d..9d7d70540 100644 --- a/lib/tasks/stats.rake +++ b/lib/tasks/stats.rake @@ -1,48 +1,94 @@ -namespace :stats do - - desc 'Produce transaction stats' - task :show => :environment do +namespace :stats do + + desc 'Produce transaction stats' + task :show => :environment do month_starts = (Date.new(2009, 1)..Date.new(2011, 8)).select { |d| d.day == 1 } headers = ['Period', - 'Requests sent', - 'Annotations added', - 'Track this request email signups', - 'Comments on own requests', + 'Requests sent', + 'Annotations added', + 'Track this request email signups', + 'Comments on own requests', 'Follow up messages sent'] puts headers.join("\t") month_starts.each do |month_start| month_end = month_start.end_of_month period = "#{month_start}-#{month_end}" - date_conditions = ['created_at >= ? - AND created_at < ?', + date_conditions = ['created_at >= ? + AND created_at < ?', month_start, month_end+1] request_count = InfoRequest.count(:conditions => date_conditions) comment_count = Comment.count(:conditions => date_conditions) - track_conditions = ['track_type = ? - AND track_medium = ? - AND created_at >= ? - AND created_at < ?', + track_conditions = ['track_type = ? + AND track_medium = ? + AND created_at >= ? + AND created_at < ?', 'request_updates', 'email_daily', month_start, month_end+1] email_request_track_count = TrackThing.count(:conditions => track_conditions) - comment_on_own_request_conditions = ['comments.user_id = info_requests.user_id - AND comments.created_at >= ? + comment_on_own_request_conditions = ['comments.user_id = info_requests.user_id + AND comments.created_at >= ? AND comments.created_at < ?', month_start, month_end+1] comment_on_own_request_count = Comment.count(:conditions => comment_on_own_request_conditions, :include => :info_request) - - followup_conditions = ['message_type = ? - AND created_at >= ? + + followup_conditions = ['message_type = ? + AND created_at >= ? AND created_at < ?', 'followup', month_start, month_end+1] follow_up_count = OutgoingMessage.count(:conditions => followup_conditions) - puts [period, - request_count, - comment_count, - email_request_track_count, - comment_on_own_request_count, + puts [period, + request_count, + comment_count, + email_request_track_count, + comment_on_own_request_count, follow_up_count].join("\t") end end - + + desc 'Produce stats on volume of requests to authorities matching a set of tags. Specify tags as TAGS=tagone,tagtwo' + task :volumes_by_authority_tag => :environment do + tags = ENV['TAGS'].split(',') + first_request_datetime = InfoRequest.minimum(:created_at) + start_year = first_request_datetime.strftime("%Y").to_i + start_month = first_request_datetime.strftime("%m").to_i + end_year = Time.now.strftime("%Y").to_i + end_month = Time.now.strftime("%m").to_i + puts "Start year: #{start_year}" + puts "Start month: #{start_month}" + puts "End year: #{end_year}" + puts "End month: #{end_month}" + public_bodies = [] + tags.each do |tag| + tag_bodies = PublicBody.find_by_tag(tag) + puts "Bodies with tag '#{tag}': #{tag_bodies.size}" + public_bodies += tag_bodies + end + public_body_ids = public_bodies.map{ |body| body.id }.uniq + public_body_condition_string = 'AND public_bodies.id in (?)' + month_starts = (Date.new(start_year, start_month)..Date.new(end_year, end_month)).select { |d| d.day == 1 } + headers = ['Period', + 'Requests sent', + 'Requests sent as % of total sent in period'] + puts headers.join("\t") + month_starts.each do |month_start| + month_end = month_start.end_of_month + period = "#{month_start}-#{month_end}" + date_condition_string = 'info_requests.created_at >= ? AND info_requests.created_at < ?' + conditions = [date_condition_string + " " + public_body_condition_string, + month_start, + month_end+1, + public_body_ids] + request_count = InfoRequest.count(:conditions => conditions, + :include => :public_body) + + total_count = InfoRequest.count(:conditions => [date_condition_string, month_start, month_end+1]) + if total_count > 0 + percent = ((request_count.to_f / total_count.to_f ) * 100).round(2) + else + percent = 0.0 + end + puts [period, request_count, percent].join("\t") + end + end + end |