You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sqm-dashboards/app/services/survey_responses_data_loade...

55 lines
1.6 KiB

require 'csv'
class SurveyResponsesDataLoader
@@survey_item_responses = []
def self.load_data(filepath:)
@@survey_item_responses = []
csv_file = File.read(filepath)
parsed_csv_file = CSV.parse(csv_file, headers: true)
survey_items = parsed_csv_file.headers
.filter { |header| !header.nil? }
.filter { |header| header.start_with? 't-' or header.start_with? 's-' }
.map { |survey_item_id| SurveyItem.find_by_survey_item_id survey_item_id }
parsed_csv_file.each do |row|
process_row row: row, survey_items: survey_items
end
SurveyItemResponse.import @@survey_item_responses
end
private
def self.process_row(row:, survey_items:)
response_date = Date.parse(row['Recorded Date'])
academic_year = AcademicYear.find_by_date response_date
response_id = row['Response ID']
district_code = row['district_code']
school_code = row['school_code']
return if school_code.nil?
school = School.find_by_district_code_and_school_code(district_code, school_code)
return if school.nil?
survey_items.each do |survey_item|
return unless SurveyItemResponse.where(response_id: response_id, survey_item: survey_item).empty?
likert_score = row[survey_item.survey_item_id]
next if likert_score.nil?
@@survey_item_responses << SurveyItemResponse.new(
response_id: response_id,
academic_year: academic_year,
school: school,
survey_item: survey_item,
likert_score: likert_score
)
end
end
end