diff --git a/app/controllers/admin/events_controller.rb b/app/controllers/admin/events_controller.rb index 94b9653a..1f8eb566 100644 --- a/app/controllers/admin/events_controller.rb +++ b/app/controllers/admin/events_controller.rb @@ -5,7 +5,7 @@ module Admin load_and_authorize_resource :event, through: :program load_and_authorize_resource :events_registration, only: :toggle_attendance - before_action :get_event, except: [:index, :create] + before_action :get_event, except: [:index, :create, :reports] # FIXME: The timezome should only be applied on output, otherwise # you get lost in timezone conversions... @@ -150,6 +150,17 @@ module Admin end end + def reports + @events = @program.events + @events_commercials = Commercial.where(commercialable_type: 'Event', commercialable_id: @events.pluck(:id)) + @events_missing_commercial = @events.where.not(id: @events_commercials.pluck(:commercialable_id)) + @events_with_requirements = @events.where.not(description: ['', nil]) + + attended_registrants_ids = @conference.registrations.where(attended: true).pluck(:user_id) + @missing_event_speakers = EventUser.joins(:event).where('event_role = ? and program_id = ?', 'submitter', @program.id). + where.not(user_id: attended_registrants_ids).includes(:user, :event) + end + private def event_params diff --git a/app/views/admin/events/reports.html.haml b/app/views/admin/events/reports.html.haml new file mode 100644 index 00000000..228c4d0b --- /dev/null +++ b/app/views/admin/events/reports.html.haml @@ -0,0 +1,127 @@ +.tabbable + %ul.nav.nav-tabs + %li.active + = link_to 'All Events', '#all', 'data-toggle' => 'tab' + %li + %a{href: '#missing-commercial', 'data-toggle' => 'tab'} + Events without Commercials + %span.label.label-danger{style: 'border-radius: 1em;'} + = @events_missing_commercial.length + %li + %a{href: '#requirements', 'data-toggle' => 'tab'} + Speaker Requirements + %span.label.label-success{style: 'border-radius: 1em;'} + = @events_with_requirements.length + + %li + %a{href: '#missing-speakers', 'data-toggle' => 'tab'} + Missing Speakers + %span.label.label-danger{style: 'border-radius: 1em;'} + = @missing_event_speakers.length + + .tab-content + #all.tab-pane.active + .row + .col-md-12 + .page-header + %h1 + All Events + = "(#{@events.length})" + %p.text-muted + All submissions and the information that they are mssing + + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Title + %th Submitter Registered + %th Submitter Biography + %th Commercial + %th Subtitle + %th Difficulty Level + - if @program.tracks.any? + %th Track + %tbody + - @events.each do |event| + %tr + - progress_status = event.progress_status + %td + = link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) + %br + .small (Presented by #{event.speaker_names}) + + - %w(registered biography commercials subtitle difficulty_level).each do |info| + %td{'data-order' => "#{progress_status[info]}"} + %span{class: class_for_todo(progress_status[info])} + %span{class: [icon_for_todo(progress_status[info]), 'fa-lg']} + - if @program.tracks.any? + %td{'data-order' => "#{progress_status['track']}"} + %span{class: class_for_todo(progress_status['track'])} + %span{class: [icon_for_todo(progress_status['track']), 'fa-lg']} + + #missing-commercial.tab-pane + .row + .col-md-12 + .page-header + %h1 + Events without commercials + = "(#{@events_missing_commercial.length})" + %p.text-muted + All submissions that have no commercial + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Title + %th Speaker(s) + %tbody + - @events_missing_commercial.each do |event| + %tr + %td= link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) + %td #{event.speaker_names} + + #requirements.tab-pane + .row + .col-md-12 + .page-header + %h1 + Requirements + = "(#{@events_with_requirements.length})" + %p.text-muted + All submissions where the speakers have special requirements + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Title + %th Speaker(s) + %th Requirements + %tbody + - @events_with_requirements.each do |event| + %tr + %td= link_to event.title, edit_conference_program_proposal_path(@conference.short_title, event) + %td #{event.speaker_names} + %td= event.description + + #missing-speakers.tab-pane + .row + .col-md-12 + .page-header + %h1 + Missing Speakers + = "(#{@missing_event_speakers.length})" + %p.text-muted + All event speakers who haven't checked in + .col-md-12 + %table.table.table-striped.table-bordered.table-hover.datatable + %thead + %th Speaker Name + %th Registered? + %th Event + %th Start Time + %tbody + - @missing_event_speakers.each do |speaker| + %tr + %td= speaker.user.name + %td= @conference.user_registered?(speaker.user) ? 'Yes' : 'No' + %td= link_to speaker.event.title, edit_conference_program_proposal_path(@conference.short_title, speaker.event) + - event_start_time = speaker.event.time + %td= event_start_time.present? ? event_start_time : '-' diff --git a/app/views/layouts/_admin_sidebar.html.haml b/app/views/layouts/_admin_sidebar.html.haml index 62645e0c..b1e4730c 100644 --- a/app/views/layouts/_admin_sidebar.html.haml +++ b/app/views/layouts/_admin_sidebar.html.haml @@ -84,6 +84,9 @@ - if can? :update, @conference.program.schedules.build %li{class: active_nav_li(admin_conference_schedules_path(@conference.short_title))} = link_to 'Schedules', admin_conference_schedules_path(@conference.short_title) + - if can? :update, @conference.program.events.build + %li{:class=> active_nav_li(reports_admin_conference_program_path(@conference.short_title))} + = link_to 'Reports', reports_admin_conference_program_path(@conference.short_title) - if can? :update, Registration.new(conference_id: @conference.id) %li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))} diff --git a/config/routes.rb b/config/routes.rb index 7bd331d9..2a44f93a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -69,6 +69,7 @@ Osem::Application.routes.draw do get :vote end end + get 'reports' => 'events#reports' end resources :tickets