working on siblings

pull/1/head
Jared Cosulich 9 years ago
parent f4a2c103d6
commit 720b59d815

@ -6,11 +6,14 @@ class Attempt < ApplicationRecord
belongs_to :recipient belongs_to :recipient
belongs_to :recipient_schedule belongs_to :recipient_schedule
belongs_to :question belongs_to :question
belongs_to :student
after_save :update_school_categories after_save :update_school_categories
after_commit :update_counts after_commit :update_counts
scope :for_question, -> (question) { where(question_id: question.id) } scope :for_question, -> (question) { where(question_id: question.id) }
scope :for_recipient, -> (recipient) { where(recipient_id: recipient.id) }
scope :for_student, -> (student) { where(student_id: student.id) }
scope :for_category, -> (category) { joins(:question).merge(Question.for_category(category)) } scope :for_category, -> (category) { joins(:question).merge(Question.for_category(category)) }
scope :for_school, -> (school) { joins(:recipient).merge(Recipient.for_school(school)) } scope :for_school, -> (school) { joins(:recipient).merge(Recipient.for_school(school)) }
scope :with_response, -> { where('answer_index is not null or open_response_id is not null')} scope :with_response, -> { where('answer_index is not null or open_response_id is not null')}

@ -31,30 +31,71 @@ class RecipientSchedule < ApplicationRecord
Question.where(id: next_question_id).first Question.where(id: next_question_id).first
end end
def attempt_question_for_recipient_students(send_message: true, question: next_question)
return if recipient.opted_out?
return if question.nil?
if !question.for_recipient_students?
return attempt_question(question: question)
end
missing_students = []
recipient_attempts = attempts.for_recipient(recipient).for_question(question)
recipient.students.each do |student|
if recipient_attempts.for_student(student).empty?
missing_students << student
end
end
attempt = recipient.attempts.create(
schedule: schedule,
recipient_schedule: self,
question: question,
student: missing_students.first
)
if send_message && attempt.send_message
upcoming = upcoming_question_ids.try(:split, /,/) || []
queued = queued_question_ids.try(:split, /,/) || []
attempted = attempted_question_ids.try(:split, /,/) || []
if question.present?
question_id = [question.id.to_s]
upcoming = upcoming - question_id
if missing_students.length > 1
queued += question_id
else
attempted += question_id
queued -= question_id
end
end
update_attributes(
upcoming_question_ids: upcoming.empty? ? nil : upcoming.join(','),
attempted_question_ids: attempted.empty? ? nil : attempted.join(','),
queued_question_ids: queued.empty? ? nil : queued.join(','),
last_attempt_at: attempt.sent_at,
next_attempt_at: next_valid_attempt_time
)
end
return attempt
end
def attempt_question(send_message: true, question: next_question) def attempt_question(send_message: true, question: next_question)
return if recipient.opted_out? return if recipient.opted_out?
unanswered_attempt = recipient.attempts.with_no_response.last unanswered_attempt = recipient.attempts.with_no_response.last
return if question.nil? && unanswered_attempt.nil? return if question.nil? && unanswered_attempt.nil?
student = nil
if unanswered_attempt.nil? if unanswered_attempt.nil?
if question.for_recipient_students? if question.for_recipient_students?
students = recipient.students return attempt_question_for_recipient_students(question: question)
student = students.first
queued = queued_question_ids.try(:split, /,/) || []
students[1...students.length].each do
queued << "#{question.id}:#{student.id}"
end
self.queued_question_ids = queued.join(',')
end end
attempt = recipient.attempts.create( attempt = recipient.attempts.create(
schedule: schedule, schedule: schedule,
recipient_schedule: self, recipient_schedule: self,
question: question, question: question
student: student
) )
end end

@ -200,6 +200,11 @@ describe "survey:attempt_questions" do
end end
end end
let(:students_recipient) { recipients[1] }
let(:students_recipient_schedule) {
recipient_schedule = students_recipient.recipient_schedules.for_schedule(schedule).first
}
describe 'With A FOR_CHILD Question Is Asked' do describe 'With A FOR_CHILD Question Is Asked' do
before :each do before :each do
questions.first.update_attributes(for_recipient_students: true) questions.first.update_attributes(for_recipient_students: true)
@ -215,23 +220,57 @@ describe "survey:attempt_questions" do
end end
it 'should store queued questions when an attempt is made on first student' do it 'should store queued questions when an attempt is made on first student' do
recipients.each do |recipient| expect(students_recipient_schedule.queued_question_ids).to be_present
recipient_schedule = recipient.recipient_schedules.for_schedule(schedule).first queued_question_ids = students_recipient_schedule.queued_question_ids.split(/,/)
expect(recipient_schedule.queued_question_ids).to be_present expect(queued_question_ids.length).to eq(1)
queued_question_ids = recipient_schedule.queued_question_ids.split(/,/) expect(queued_question_ids.first).to eq("#{questions[0].id}")
expect(queued_question_ids.length).to eq(2) end
expect(queued_question_ids.first).to eq("#{questions[0].id}:#{students[1].id}")
expect(queued_question_ids.last).to eq("#{questions[0].id}:#{students[2].id}") it 'should set the next_attempt_at to now when attempt is made on first student' do
end recipient.attempts.last.save_response(answer_index: 3)
expect(students_recipient_schedule.reload.next_attempt_at).to eq(Time.new)
end
it 'should set the next_attempt_at to now when attempt is made on second student' do
students_recipient.attempts.last.save_response(answer_index: 3)
expect{students_recipient_schedule.attempt_question}.to change{students_recipient.attempts.count}.by(1)
expect(students_recipient_schedule.reload.queued_question_ids).to be_present
attempt = students_recipient.attempts.last
expect(attempt.student).to eq(students_recipient.students[1])
attempt.save_response(answer_index: 4)
expect(students_recipient_schedule.reload.next_attempt_at).to eq(Time.new)
end end
it 'should set the next_attempt_at to now when attempt is made on first student' it 'should set the next_attempt_at in the future when an attempt is made on last student' do
students_recipient.attempts.last.save_response(answer_index: 3)
expect{students_recipient_schedule.attempt_question}.to change{students_recipient.attempts.count}.by(1)
expect(students_recipient_schedule.reload.queued_question_ids).to be_present
attempt = students_recipient.attempts.last
expect(attempt.student).to eq(students_recipient.students[1])
attempt.save_response(answer_index: 4)
expect(students_recipient_schedule.reload.next_attempt_at).to eq(Time.new)
it 'should set the next_attempt_at to now when attempt is made on second student' expect{students_recipient_schedule.attempt_question}.to change{students_recipient.attempts.count}.by(1)
expect(students_recipient_schedule.reload.queued_question_ids).to be_nil
expect(students_recipient_schedule.reload.next_attempt_at).to_not eq(Time.new)
it 'should set the next_attempt_at in the future when an attempt is made on last student' attempt = students_recipient.attempts.last
expect(attempt.student).to eq(students_recipient.students[2])
attempt.save_response(answer_index: 2)
expect(students_recipient_schedule.reload.next_attempt_at).to_not eq(Time.new)
end
it 'should mention the students name in the text' it 'should mention the students name in the text'
it 'resends the question about the same student if not responded to'
it 'still sends when no students are present'
it 'doesnt store any queued_question_ids when no students are present'
it 'doesnt store any queued_question_ids when just one student is present'
end end
describe 'With A General Question Is Asked' do describe 'With A General Question Is Asked' do

Loading…
Cancel
Save