require "study_engine/assessment" require "study_engine/config" module StudyEngine class ExistingAssessmentsForm include ActiveModel::Validations extend ActiveModel::Naming def self.model_name ActiveModel::Name.new(Assessment) end validate :format_of_study_id validate :presence_of_some_event validate :presence_of_previous_events def initialize attributes = {} self.study_id = StudyID.new self.event_datetimes ||= [] attributes.each do |name, value| send("#{name}=", value) end end def to_model self end def to_key end def persisted? false end attr_accessor :study_id, :method_applied, :event_datetimes delegate :study, :site, :id, to: :study_id, prefix: true delegate :study=, :site=, :id=, to: :study_id, prefix: true def method_applied @method_applied || "In-person" end def study_options StudyID::Bank.studies end def save if valid? base = Assessment.by_study_id(study_id) event_datetimes.each.with_index do |datetime, index| next if datetime.blank? event = StudyEngine.events[index] assessment = base.by_event(event).create!(created_at: datetime, assessment_updated_at: datetime, method_applied: method_applied) assessment.update_column :group_index, nil end true end end private def format_of_study_id if study_id.present? unless study_id.valid? errors.add :base, "METRC study ID must be in the following format: XXX-XXX-####" end else errors.add :base, "METRC study ID can not be blank. Enter ID in the following format: XXX-XXX-####" end end def presence_of_some_event if event_datetimes.all?(&:blank?) events = StudyEngine.events.dup events.map!(&:downcase) events.last.prepend("or ") events = events.join(", ") errors.add :base, "A #{events} timestamp must be present" end end def presence_of_previous_events event_datetimes.each.with_index do |datetime, index| next if datetime.blank? || index.nil? || index.zero? event = StudyEngine.events[index] previous_events = StudyEngine.events[0...index] previous_events.each.with_index do |previous_event, index| if event_datetimes[index].blank? && Assessment.by_study_id(study_id).by_event(previous_event).none? errors.add :base, "Cannot add a #{event.downcase} assessment when #{previous_event.downcase} assessment does not exist" end end end end end end