Skip to content

Commit

Permalink
First pass at reporting survey response
Browse files Browse the repository at this point in the history
  • Loading branch information
smellsblue committed Sep 20, 2023
1 parent 9a757b6 commit d6ebb58
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 0 deletions.
7 changes: 7 additions & 0 deletions app/controllers/survey_requests_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ def show
end
end

def report
Organization.unscoped do
@survey_request = SurveyRequest.includes(survey_organization_requests: [:organization, :survey_answer]).find(params[:id])
@data = Reports::SurveyRequestData.new(@survey_request)
end
end

def create
SurveyRequest.transaction do
survey = Survey.find(params[:survey_id])
Expand Down
102 changes: 102 additions & 0 deletions app/models/reports/survey_request_data.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
module Reports
class SurveyRequestData
attr_reader :survey_request

def initialize(survey_request)
@survey_request = survey_request
end

def columns
@columns ||= [].tap do |result|
result << Reports::SurveyRequestData::Column.new("Organization", css_class: "sort-asc") { |org_request, _answers| org_request.organization.name }

survey_request.survey_revision.to_definition.fields.each.with_index do |field, i|
case field
when SurveyDef::Integer, SurveyDef::Select, SurveyDef::Text
result << Reports::SurveyRequestData::Column.new(field.label) do |_org_request, answers|
if answers
answers.values[i].display_value
end
end
when SurveyDef::Group
result << Reports::SurveyRequestData::Column.new("# of #{field.label}") do |_org_request, answers|
if answers
answers.values[i].value.size
end
end

field.fields.each.with_index do |grouped_field, j|
case grouped_field
when SurveyDef::Integer
result << Reports::SurveyRequestData::Column.new("Min #{grouped_field.label}") do |_org_request, answers|
if answers
answers.values[i].value.map { |x| x[j].value }.min
end
end

result << Reports::SurveyRequestData::Column.new("Max #{grouped_field.label}") do |_org_request, answers|
if answers
answers.values[i].value.map { |x| x[j].value }.max
end
end

result << Reports::SurveyRequestData::Column.new("Avg #{grouped_field.label}") do |_org_request, answers|
if answers
responses = answers.values[i].value.map { |x| x[j].value }
(responses.sum.to_f / responses.size.to_f).round(2)
end
end

result << Reports::SurveyRequestData::Column.new("Total #{grouped_field.label}") do |_org_request, answers|
if answers
answers.values[i].value.map { |x| x[j].value }.sum
end
end
end
end
end
end
end
end

def each
survey_request.survey_organization_requests.each do |org_request|
yield Reports::SurveyRequestData::Row.new(self, org_request, org_request.survey_answer&.answers)
end
end

class Column
attr_reader :label, :css_class

def initialize(label, css_class: nil, &apply_fn)
@label = label
@css_class = css_class
@apply_fn = apply_fn
end

def apply(org_request, answers)
@apply_fn.call(org_request, answers)
end
end

class Row
attr_reader :data, :org_request, :answers

def initialize(data, org_request, answers)
@data = data
@org_request = org_request
@answers = answers
end

def status_class
org_request.status_class
end

def each
data.columns.each do |column|
yield(column.apply(org_request, answers))
end
end
end
end
end
1 change: 1 addition & 0 deletions app/views/survey_requests/_tabs.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<div class="col-xs-6">
<ul class="nav nav-pills">
<%= tab("Overview", survey_request_path(@survey_request), params[:action] == "show") %>
<%= tab("Report", report_survey_request_path(@survey_request), params[:action] == "report") %>
</ul>
</div>
</div>
Expand Down
23 changes: 23 additions & 0 deletions app/views/survey_requests/report.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<% content_for :title, "Survey Request Overview" %>
<% content_for :content do %>
<%= render partial: "survey_requests/tabs" %>

<table class="table table-striped table-responsive data-table">
<thead>
<% @data.columns.each do |col| %>
<th class="<%= col.css_class %>"><%= col.label %></th>
<% end %>
</thead>

<tbody>
<% @data.each do |row| %>
<tr class="<%= row.status_class %>">
<% row.each do |value| %>
<td><%= value %></td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
<% end %>
4 changes: 4 additions & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,10 @@
post :skip
end
end

member do
get :report
end
end

resources :tracking_details
Expand Down

0 comments on commit d6ebb58

Please sign in to comment.