219 lines
7.6 KiB
Ruby
219 lines
7.6 KiB
Ruby
class SurveysController < ApplicationController
|
|
|
|
helper MemberHelper
|
|
|
|
def index
|
|
|
|
questionnairesurveys = QuestionnaireSurvey.any_of( {:postdate.lte => Time.now} ).desc(:postdate).page(OrbitHelper.params[:page_no]).per(OrbitHelper.page_data_count)
|
|
current_user = OrbitHelper.current_user
|
|
surveys = questionnairesurveys.collect do |a|
|
|
answer_present = (current_user.nil? ? false : (a.survey_answers.where(:user => current_user.id).count > 0 ? true : false))
|
|
|
|
if !OrbitHelper.params[:page_no].blank?
|
|
title = ('<a href="'+ OrbitHelper.url_to_show(a.to_param) + "?method=show_data&page_no=#{OrbitHelper.params[:page_no]}" + '">' + a.title + '</a>').html_safe
|
|
else
|
|
title = ('<a href="'+ OrbitHelper.url_to_show(a.to_param) + '?method=show_data">' + a.title + '</a>').html_safe
|
|
end
|
|
|
|
{
|
|
"title" => title,
|
|
"time_range" => QuestionnaireSurvey.time_range(a),
|
|
"write" => QuestionnaireSurvey.write(a),
|
|
"result" => QuestionnaireSurvey.result(a),
|
|
"answer_present" => answer_present
|
|
}
|
|
end
|
|
{
|
|
"surveys" => surveys,
|
|
"extras" => {
|
|
"widget-title"=>t('survey.survey'),
|
|
"th_time_range" => t('survey.time_range'),
|
|
"th_title" => t("survey.title"),
|
|
"th_write" => t('survey.write'),
|
|
"th_result" => t('survey.result')
|
|
},
|
|
"total_pages" => questionnairesurveys.total_pages
|
|
}
|
|
|
|
end
|
|
|
|
def show_data
|
|
|
|
params = OrbitHelper.params
|
|
|
|
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
|
|
current_user = OrbitHelper.current_user
|
|
answer_present = (current_user.nil? ? false : (survey.survey_answers.where(:user => current_user.id).count > 0 ? true : false))
|
|
answer_present = (!survey.needs_login ? false : answer_present)
|
|
link_to_answer_set = (answer_present ? "/admin/surveys/#{survey.survey_answers.where(:user => current_user.id).first.id.to_s}/answer_set" : "")
|
|
{
|
|
'survey' => survey,
|
|
'answer_present' => answer_present,
|
|
'link_to_answer_set' => link_to_answer_set,
|
|
'time_range' => QuestionnaireSurvey.time_range(survey)
|
|
}
|
|
|
|
end
|
|
|
|
def show
|
|
|
|
params = OrbitHelper.params
|
|
|
|
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
|
|
|
|
|
|
if survey.redirect_mode
|
|
|
|
redirect_url = survey.redirect_url
|
|
|
|
{
|
|
'redirect_url' => redirect_url
|
|
}
|
|
|
|
else
|
|
|
|
questions = survey.survey_questions.all.entries
|
|
current_user = OrbitHelper.current_user
|
|
answer_present = (current_user.nil? ? false : (survey.survey_answers.where(:user => current_user.id).count > 0 ? true : false))
|
|
answer_present = (!survey.needs_login ? false : answer_present)
|
|
link_to_answer_set = (answer_present ? "/admin/surveys/#{survey.survey_answers.where(:user => current_user.id).first.id.to_s}/answer_set" : "")
|
|
if survey.jump_mode
|
|
answers = Hash[questions.collect{ |o| [o.id.to_s, o.id.to_s] }]
|
|
jumpable_questions = questions.select{ |q| q.jumpable? && q.can_set_jump? }
|
|
jump_tos_map = jumpable_questions.map(&:get_jump_tos).inject(:merge)
|
|
end
|
|
{
|
|
'survey' => survey,
|
|
'redirect_url' => '',
|
|
'link_to_answer_set' => link_to_answer_set,
|
|
'questions' => questions,
|
|
'answers' => answers,
|
|
'answer_present' => answer_present,
|
|
'jump_tos_map' => jump_tos_map
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def update
|
|
|
|
uid = params[:id].split('-').last
|
|
@survey = QuestionnaireSurvey.find_by(:uid=>uid)
|
|
|
|
total = 0
|
|
individual_total = []
|
|
answer = params[:answer]
|
|
@answer_model = @survey.survey_answers.new
|
|
@answer_model.user = current_user.id if !current_user.nil?
|
|
@survey.survey_questions.each do |question|
|
|
qid = question.id.to_s
|
|
if question.is_required && answer[qid].blank? && !@survey.jump_mode #&& (! @survey.jump_mode || ( @survey.jump_mode && question.jumpable? ) )
|
|
@answer_model.errors.add question.title, t('survey_question.required_error')
|
|
else
|
|
case question.type
|
|
when SurveyQuestion::Radio, SurveyQuestion::Select
|
|
if question.custom_option && answer[qid] == 'custom_option'
|
|
@answer_model[qid] = answer[qid + '_custom_option']
|
|
else
|
|
if answer[qid]
|
|
opt = question.survey_question_options.find(answer[qid])
|
|
@answer_model[qid] = opt.name
|
|
p = (opt.points == nil ? 0 : opt.points) rescue 0
|
|
total = total + p
|
|
individual_total << p
|
|
end
|
|
end
|
|
when SurveyQuestion::Check
|
|
@answer_model[qid] = []
|
|
if answer[qid]
|
|
t = 0
|
|
answer[qid].each do |oid, value|
|
|
if value.to_i != 0
|
|
if question.custom_option && oid == 'custom_option'
|
|
@answer_model[qid].push answer[qid + '_custom_option']
|
|
else
|
|
opt = question.survey_question_options.find(oid)
|
|
@answer_model[qid].push opt.name
|
|
p = (opt.points == nil ? 0 : opt.points) rescue 0
|
|
total = total + p
|
|
t = t + p
|
|
end
|
|
end
|
|
end
|
|
individual_total << p
|
|
end
|
|
when SurveyQuestion::Radiogroup
|
|
@answer_model[qid] = {}
|
|
options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, (o.points.nil? ? 0 : o.points) ] }]
|
|
radiogroups = Hash[question.survey_question_radiogroups.collect{|rg| [ rg.id.to_s, rg.name] }]
|
|
if answer[qid]
|
|
t = 0
|
|
answer[qid].each do |oid, value|
|
|
unless value.blank?
|
|
@answer_model[qid][oid] = radiogroups[value]
|
|
total = total + options[oid]
|
|
t = t + options[oid]
|
|
else
|
|
if question.is_required
|
|
@answer_model.errors.add question.title, t('survey_question.required_error')
|
|
end
|
|
end
|
|
if question.custom_option
|
|
unless answer[oid]["custom_group_field"].blank?
|
|
@answer_model[qid]["#{oid}_custom_group_field"] = answer[oid]["custom_group_field"]
|
|
end
|
|
end
|
|
end
|
|
individual_total << t
|
|
end
|
|
when SurveyQuestion::Oneline, SurveyQuestion::Multiline, SurveyQuestion::DateTime
|
|
@answer_model[qid] = answer[qid]
|
|
individual_total << 0
|
|
end
|
|
end
|
|
end
|
|
if @answer_model.errors.empty?
|
|
@answer_model.scored_points = total
|
|
@answer_model.individual_total = individual_total
|
|
@answer_model.save!
|
|
redirect_to OrbitHelper.url_to_show(@survey.to_param) + "?method=answer_success&ans=#{@answer_model.id.to_s}"
|
|
else
|
|
@survey_answer_error = @answer_model.errors.full_messages.join(',')
|
|
render :answer_error
|
|
end
|
|
end
|
|
|
|
def answer_success
|
|
|
|
params = OrbitHelper.params
|
|
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
|
|
answer = SurveyAnswer.find(params[:ans])
|
|
page = Page.where(:page_id => params[:page_id]).first
|
|
{
|
|
'survey' => survey,
|
|
'answer' => answer,
|
|
'url' => "/#{I18n.locale.to_s}" + page.url
|
|
}
|
|
end
|
|
|
|
def result
|
|
params = OrbitHelper.params
|
|
|
|
survey = QuestionnaireSurvey.find_by(uid: params[:uid])
|
|
# survey.result_type = QuestionnaireSurvey::ResultChart if params[:force_chart]
|
|
case survey.result_type
|
|
when QuestionnaireSurvey::ResultChart
|
|
chart_data, survey_questions, survey_answers = survey.generate_chart_data
|
|
end
|
|
|
|
{
|
|
'survey' => survey,
|
|
'chart_data' => chart_data,
|
|
'survey_questions' => survey_questions,
|
|
'survey_answers' => survey_answers
|
|
}
|
|
|
|
end
|
|
|
|
end |