class Quby::Answers::Services::OutcomeCalculation

Attributes

answer[R]

Public Class Methods

new(answer) click to toggle source
# File lib/quby/answers/services/outcome_calculation.rb, line 13
def initialize(answer)
  @answer = answer
end

Public Instance Methods

calculate() click to toggle source
# File lib/quby/answers/services/outcome_calculation.rb, line 17
def calculate # rubocop:disable Metrics/MethodLength
  results = {}
  score_results = {}
  action_results = {}
  completion_result = {}

  questionnaire.score_calculations.each do |key, calculation|
    begin
      result = ScoreCalculator.calculate(questionnaire: answer.questionnaire,
                                         values: value_by_regular_values,
                                         timestamp: completed_at,
                                         patient_attrs: patient&.slice("birthyear", "gender"),
                                         respondent_attrs: patient&.slice("respondent_type"),
                                         &calculation.calculation)

      if calculation.completion
        result = {"value" => result}
      elsif calculation.score
        result = (result || {}).reverse_merge(calculation.options)
      end

      results[key] = result
    rescue ScoreCalculator::MissingAnswerValues => exception
      results[key] = calculation.options.merge(missing_values: exception.missing)
    rescue StandardError => exception
      if defined? Roqua::Support::Errors
        Roqua::Support::Errors.report exception, root_path: Rails.root.to_s
      end
      results[key] = {exception: exception.message,
                      backtrace: exception.backtrace}.reverse_merge(calculation.options)
    end

    score_results[key] = results[key] if calculation.score
    action_results[key] = results[key] if calculation.action
    completion_result = results[key] if calculation.completion
  end

  Entities::Outcome.new(scores: score_results,
                        actions: action_results,
                        completion: completion_result,
                        generated_at: Time.now)
end
update_scores() click to toggle source

Calculate scores and actions, write to the database but bypass any validations This function is called by parts of the system that only want to calculate stuff, and can't help it if an answer is not completed.

# File lib/quby/answers/services/outcome_calculation.rb, line 63
def update_scores
  # Now we can fill it back up
  outcome = calculate
  answer.outcome = outcome
  Quby.answers.update!(answer)
end

Private Instance Methods

completed_at() click to toggle source
# File lib/quby/answers/services/outcome_calculation.rb, line 82
def completed_at
  answer.completed_at
end
patient() click to toggle source
# File lib/quby/answers/services/outcome_calculation.rb, line 86
def patient
  answer.patient
end
questionnaire() click to toggle source
# File lib/quby/answers/services/outcome_calculation.rb, line 72
def questionnaire
  answer.questionnaire
end
value_by_regular_values() click to toggle source
# File lib/quby/answers/services/outcome_calculation.rb, line 76
def value_by_regular_values
  @value_by_regular_values ||= answer.value_by_regular_values.sort_by do |key, value|
    questionnaire.fields.question_hash.keys.index(key) || Float::INFINITY
  end.to_h
end