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/staffing_loader.rb

90 lines
2.5 KiB

# frozen_string_literal: true
require "csv"
class StaffingLoader
def self.load_data(filepath:)
respondents = []
CSV.parse(File.read(filepath), headers: true) do |row|
row = StaffingRowValues.new(row:)
next unless row.school.present? && row.academic_years.size.positive?
respondents.concat(create_staffing_entry(row:))
end
Respondent.import respondents, batch_size: 1000, on_duplicate_key_update: [:total_teachers]
end
def self.clone_previous_year_data
respondents = []
School.all.each do |school|
academic_years_without_data(school:).each do |academic_year|
year_with_data = last_academic_year_with_data(school:)
respondent = Respondent.where(school:, academic_year: year_with_data).first
next if respondent.nil?
current_respondent = Respondent.find_or_initialize_by(school:, academic_year:)
if current_respondent.total_teachers.nil? || current_respondent.total_teachers.zero?
current_respondent.total_teachers = respondent.total_teachers
end
respondents << current_respondent
end
end
Respondent.import respondents, batch_size: 1000, on_duplicate_key_update: [:total_teachers]
end
private
def self.create_staffing_entry(row:)
row.academic_years.map do |academic_year|
respondent = Respondent.find_or_initialize_by(school: row.school, academic_year:)
respondent.total_teachers = row.fte_count
respondent
end
end
def self.last_academic_year_with_data(school:)
AcademicYear.all.order(range: :DESC).find do |academic_year|
respondents = Respondent.find_by(school:, academic_year:)
respondents&.total_teachers&.positive?
end
end
def self.academic_years_without_data(school:)
AcademicYear.all.order(range: :DESC).select do |academic_year|
respondents = Respondent.find_by(school:, academic_year:)
respondents.nil? || respondents.total_teachers.nil? || respondents.total_teachers.zero?
end
end
private_class_method :last_academic_year_with_data
private_class_method :academic_years_without_data
private_class_method :create_staffing_entry
end
class StaffingRowValues
attr_reader :row
def initialize(row:)
@row = row
end
def school
@school ||= begin
dese_id = row["DESE ID"].strip.to_i
School.find_by_dese_id(dese_id)
end
end
def academic_years
@academic_year ||= begin
year = row["Academic Year"]
AcademicYear.of_year(year)
end
end
def fte_count
row["FTE Count"]
end
end