diff --git a/app/controllers/admin/registrations_controller.rb b/app/controllers/admin/registrations_controller.rb index 9c60ca14..1b67d392 100644 --- a/app/controllers/admin/registrations_controller.rb +++ b/app/controllers/admin/registrations_controller.rb @@ -9,6 +9,10 @@ module Admin @pdf_filename = "#{@conference.title}.pdf" @registrations = @conference.registrations.includes(:user).order('registrations.created_at ASC') @attended = @conference.registrations.where('attended = ?', true).count + + @new_reg = @conference.registrations.where('created_at > ?', current_user.last_sign_in_at).count + @registration_distribution = @conference.registration_distribution + @affiliation_distribution = @conference.affiliation_distribution end def edit; end diff --git a/app/models/conference.rb b/app/models/conference.rb index f190bff2..d9ced2f4 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -325,11 +325,58 @@ class Conference < ActiveRecord::Base # * +hash+ -> hash def scheduled_event_distribution confirmed_events = program.events.where(state: 'confirmed') - scheduled_value = { 'value' => confirmed_events.where('start_time IS NOT NULL').count, 'color' => 'green' } - unscheduled_value = { 'value' => confirmed_events.where('start_time IS NULL').count, 'color' => 'red' } + scheduled_value = { 'value' => confirmed_events.where.not(start_time: nil).count, 'color' => 'green' } + unscheduled_value = { 'value' => confirmed_events.where(start_time: nil).count, 'color' => 'red' } { 'Scheduled' => scheduled_value, 'Unscheduled' => unscheduled_value } end + ## + # Returns a hash with Registration attended vs. Registration not attended + # { "Attended" => { value: number of registration attended, color: color }, + # "Not attended" => { value: number of registration not attended, color: color } + # + # ====Returns + # * +hash+ -> hash + def registration_distribution + reg = registrations.includes(:user) + attended_value = { 'value' => reg.where(attended: true).count, 'color' => 'magenta' } + not_attended_value = { 'value' => reg.where.not(attended: true).count, 'color' => 'blue' } + { 'Attended' => attended_value, 'Not attended' => not_attended_value } + end + + ## + # Returns a hash with affiliation => + # {value: count of registration whose user has that affilation, color: color} + # In case that the affiliation is blank, it groups them in None and + # if the number of persons that have an affiliation are less than the 2% of + # the total number of registered people, they are grouped in others. + # + # ====Returns + # * +hash+ -> hash + def affiliation_distribution + counted_affiliations = registrations.joins(:user).group(:affiliation).count + result = {} + i=1 + others = 0 + none = 0 + counted_affiliations.each do |key, value| + if value < 0.02 * registrations.length + others += value + elsif key.blank? + none += value + else + result[key.capitalize] = { 'value' => value, 'color' => next_color(i) } + i += 1 + end + end + if others > 0 + result['Others'] = { 'value' => others, 'color' => next_color(i) } + i += 1 + end + result['None'] = { 'value' => none, 'color' => next_color(i) } if none > 0 + result + end + ## # Returns a hash with user distribution => {value: count of user state, color: color} # active: signed in during the last 3 months @@ -550,6 +597,16 @@ class Conference < ActiveRecord::Base private + # Returns a different html colour for every i. We make use of big prime numbers + # to avoid repetition and to make consecutive colors clearly different. + def next_color(i) + color = '#000000' + color[1..2] = ((i*113)%239 + 16).to_s(16) + color[3..4] = ((i*67)%239 + 16).to_s(16) + color[5..6] = ((i*151)%239 + 16).to_s(16) + color + end + after_create do self.create_contact self.create_program diff --git a/app/views/admin/registrations/index.html.haml b/app/views/admin/registrations/index.html.haml index 3e581914..2d2c3225 100644 --- a/app/views/admin/registrations/index.html.haml +++ b/app/views/admin/registrations/index.html.haml @@ -11,6 +11,26 @@ = link_to 'Export XLS', {format: :xlsx}, class: 'btn btn-success' %p.text-muted All the people who registered to your event +.row + .col-sm-4.col-xs-4 + .dashbox.text-center + %span.fa.fa-user.fa-lg + %span.fa.fa-lg + = @registrations.length + %p + %small + #{'Registration'.pluralize(@registrations.length)} + - if @new_reg + %span.label.label-success{title: "+#{@new_reg} since you last logged in!"} + + + = @new_reg + .col-md-4 + = render partial: 'admin/conference/doughnut_chart', locals: {title: 'Affiliation', data: @affiliation_distribution} + - unless @conference.pending? + .col-md-4 + = render partial: 'admin/conference/doughnut_chart', locals: {title: 'Attended registrations', data: @registration_distribution} +.row + .col-md-12 %table.table.table-hover.datatable#registrations %thead %tr