Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save marten/7232450 to your computer and use it in GitHub Desktop.
Save marten/7232450 to your computer and use it in GitHub Desktop.
class OldInvitationsToFillOutTasks < ActiveRecord::Migration
include Roqua::Logging
def up
Invitation.where(active: true, completed: false, is_template: false)
.includes(:questionnaires)
.includes(:meas_instance)
.includes(:patient)
.includes(:team)
.find_each do |invitation|
invitation.questionnaires.each do |questionnaire|
answer = invitation.meas_instance.answers.active.where(questionnaire_id: questionnaire.id).first
if answer
next if answer.completed_at
# answer is pending for the current meas_instance
fill_out_task = invitation.patient.fill_out_task_for!(invitation.type_of)
pending_answer = fill_out_task.answers.where(questionnaire_id: questionnaire.id).first
if pending_answer.present?
# In the future if we want to associate this pending answer with the
# protocol/measurement of this invitation, we want to know the relevant ids.
eventlog.info 'roqua.migrations.old_invitations.answer_already_pending',
answer_id: answer.id,
pending_answer_id: pending_answer.id,
invitation_id: invitation.id,
protocol_id: invitation.meas_instance.protocol_id,
measurement_id: invitation.meas_instance.measurement_id,
proj_serial: invitation.meas_instance.proj_serial,
respondent_type: invitation.type_of
else
answer.fill_out_task = invitation.patient.fill_out_task_for!(invitation.type_of)
answer.open_from = invitation.open_from
answer.open_till = invitation.open_till
answer.save!
eventlog.info 'roqua.migrations.old_invitations.answer_added_to_fill_out_task',
answer_id: answer.id,
invitation_id: invitation.id,
protocol_id: invitation.meas_instance.protocol_id,
measurement_id: invitation.meas_instance.measurement_id,
proj_serial: invitation.meas_instance.proj_serial,
respondent_type: invitation.type_of
end
end
end
end
Invitation.where(active: true, completed: false, is_template: false)
.includes(:questionnaires)
.includes(:meas_instance)
.includes(:patient)
.includes(:team)
.find_each do |invitation|
invitation.questionnaires.each do |questionnaire|
answer = invitation.meas_instance.answers.active.where(questionnaire_id: questionnaire.id).first
if not answer
# answer might be pending for another meas_instance, or for timeline
command = Commands::EnsurePendingAnswer.new(patient: invitation.patient,
respondent_type: invitation.type_of,
questionnaire: questionnaire,
options: {measurement: invitation.meas_instance.measurement,
completer: invitation.patient,
team: invitation.team,
open_from: invitation.open_from,
open_till: invitation.open_till})
pending_answer = command.send(:find_pending_answer)
if pending_answer.present?
# In the future if we want to associate this pending answer with the
# protocol/measurement of this invitation, we want to know the relevant ids.
eventlog.info 'roqua.migrations.old_invitations.answer_already_pending',
answer_id: nil,
pending_answer_id: pending_answer.id,
invitation_id: invitation.id,
protocol_id: invitation.meas_instance.protocol_id,
measurement_id: invitation.meas_instance.measurement_id,
proj_serial: invitation.meas_instance.proj_serial,
respondent_type: invitation.type_of
else
answer = command.call
answer.update_attributes!(created_at: invitation.created_at)
eventlog.info 'roqua.migrations.old_invitations.answer_created',
answer_id: answer.id,
invitation_id: invitation.id,
protocol_id: invitation.meas_instance.protocol_id,
measurement_id: invitation.meas_instance.measurement_id,
proj_serial: invitation.meas_instance.proj_serial,
respondent_type: invitation.type_of
end
end
end
end
end
def down
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment