class Quby::Answers::Entities::Answer

Attributes

_id[RW]

@return [String]

aborted[RW]
actions[W]
active[RW]

@return [Boolean]

completed_at[RW]

@return [Time]

completion[W]
created_at[RW]

@return [Time]

dsl_last_update[RW]

@return [Time]

extra_failed_validations[RW]
extra_question_values[RW]

For setting raw content values and failed validations

flags[RW]

@return [Hash<String, Boolean>]

import_notes[RW]

For answers that are imported from external sources @return [Hash]

outcome[RW]

@return [Outcome]

outcome_generated_at[RW]
patient[RW]

@return [Hash]

patient_id[RW]

@return [String]

questionnaire_id[RW]

@return [String]

questionnaire_key[RW]

@return [String]

raw_params[RW]

The raw form data (for recovery purposes) @return [Hash]

scores[W]
started_at[RW]

@return [Time]

test[RW]

@return [Boolean]

textvars[RW]

@return [Hash<String, String>]

token[RW]

@return [String]

updated_at[RW]

@return [Time]

value[RW]

The filtered and transformed form data @return [Hash]

Public Class Methods

new(_id: nil, questionnaire_id: nil, questionnaire_key: nil, questionnaire: nil, raw_params: nil, value: nil, patient_id: nil, patient: nil, token: nil, active: true, test: false, created_at: nil, updated_at: nil, started_at: nil, completed_at: nil, outcome: nil, outcome_generated_at: nil, scores: nil, actions: nil, completion: nil, dsl_last_update: nil, import_notes: nil, flags: nil, textvars: nil) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 85
def initialize(_id: nil, questionnaire_id: nil, questionnaire_key: nil, questionnaire: nil,
  raw_params: nil, value: nil, patient_id: nil, patient: nil,
  token: nil, active: true, test: false, created_at: nil, updated_at: nil,
  started_at: nil, completed_at: nil, outcome: nil, outcome_generated_at: nil,
  scores: nil, actions: nil, completion: nil, dsl_last_update: nil, import_notes: nil,
  flags: nil, textvars: nil)

  self._id = _id
  self.questionnaire_id = questionnaire_id
  self.questionnaire_key = questionnaire_key
  self.raw_params = raw_params || {}
  self.value = value || {}
  self.patient_id = patient_id
  self.patient = patient || {}
  self.token = token
  self.active = active
  self.test = test
  self.created_at = created_at
  self.updated_at = updated_at
  self.started_at = started_at
  self.completed_at = completed_at
  self.outcome_generated_at = outcome_generated_at
  self.scores = scores || {}
  self.actions = actions || {}
  self.completion = completion || {}
  self.dsl_last_update = dsl_last_update
  self.import_notes = import_notes || {}
  self.flags = flags
  self.textvars = textvars

  @questionnaire = questionnaire
end

Public Instance Methods

_id=(value) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 122
def _id=(value)
  @_id = value.to_s
end
action() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 290
def action
  outcome.action
end
actions() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 282
def actions
  outcome.actions
end
all_blank?() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 317
def all_blank?
  questionnaire.questions.reduce(true) do |all_blank, question|
    next all_blank unless question
    all_blank and send(question.key).blank?
  end
end
as_json(options = {}) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 304
def as_json(options = {})
  attributes.merge(
      id: id,
      value_by_values: value_by_values,
      scores: scores,
      is_completed: self.completed? ? true : false
  )
end
attributes() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 130
def attributes
  HashWithIndifferentAccess.new({
    _id: _id,
    questionnaire_id: questionnaire_id,
    questionnaire_key: questionnaire_key,
    raw_params: raw_params,
    value: value,
    patient_id: patient_id,
    patient: patient,
    token: token,
    active: active,
    test: test,
    created_at: created_at,
    updated_at: updated_at,
    started_at: started_at,
    completed_at: completed_at,
    outcome_generated_at: outcome_generated_at,
    scores: scores,
    actions: actions,
    completion: completion,
    dsl_last_update: dsl_last_update,
    import_notes: import_notes,
    flags: flags,
    textvars: textvars
  })
end
completed?() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 313
def completed?
  !all_blank? && valid?
end
completion() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 286
def completion
  outcome.completion
end
enhance_by_dsl() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 177
def enhance_by_dsl
  DSL.enhance(self)
end
errors() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 157
def errors
  @errors ||= ActiveModel::Errors.new(self)
end
flags=(value) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 294
def flags=(value)
  return unless value
  @flags = value.symbolize_keys
end
id() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 118
def id
  _id
end
mark_completed(start_time) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 170
def mark_completed(start_time)
  if completed? || @aborted
    self.started_at = start_time if started_at.blank?
    self.completed_at = Time.now if completed_at.blank?
  end
end
outcome=(outcome) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 263
def outcome=(outcome)
  self.scores               = outcome.scores
  self.actions              = outcome.actions
  self.completion           = outcome.completion
  self.outcome_generated_at = outcome.generated_at
end
questionnaire() click to toggle source

Faux belongs_to :questionnaire

# File lib/quby/answers/entities/answer.rb, line 166
def questionnaire
  @questionnaire ||= Quby.questionnaires.find(questionnaire_key)
end
score_objects() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 274
def score_objects
  scores.map do |score_key, score_hash|
    score = Score.new score_schema: questionnaire.score_schemas[score_key],
                      score_hash: score_hash
    [score_key, score]
  end.to_h.with_indifferent_access
end
scores() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 270
def scores
  outcome.scores
end
textvars=(value) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 299
def textvars=(value)
  return unless value
  @textvars = value.symbolize_keys
end
to_param() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 126
def to_param
  id
end
url_params(options = {}) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 324
def url_params(options = {})
  timestamp = Time.now.getgm.strftime("%Y-%m-%dT%H:%M:%S+00:00")
  plain_token = [Quby::Settings.shared_secret, token, timestamp].join('|')

  # double slash removed from return_url (it's either this or removing the
  # final slash in Settings.application_url)
  options.merge(
      display_mode: options[:display_mode] || "paged",
      token: token,
      timestamp: timestamp,
      hmac: Digest::SHA1.hexdigest(plain_token)
  )
end
valid?() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 161
def valid?
  errors.empty?
end
value_by_regular_values() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 232
def value_by_regular_values
  result = {}
  if value
    result = value.dup
    value.each do |key, answer|
      question = questionnaire.questions.find { |q| q&.key.to_s == key.to_s }
      next unless question
      if question.type == :radio || question.type == :scale || question.type == :select
        option = question.options.find { |o| o.key.to_s == value[key].to_s }
        result[key] = option.value if option
      elsif question.type == :integer
        result[key] = answer.to_i if answer
      elsif question.type == :float
        result[key] = answer.to_f if answer
      end
    end
  end
  result
rescue Exception => e
  if defined? Roqua::Support::Errors
    Roqua::Support::Errors.report e, root_path: Rails.root.to_s
  end
  raise e if Rails.env.development? || Rails.env.test?
  Rails.logger.error "RESCUED #{e.message} \n #{e.backtrace.join('\n')}"
  {}
end
value_by_values() click to toggle source
# File lib/quby/answers/entities/answer.rb, line 208
def value_by_values
  result = {}
  if value
    result = value.dup
    value.each_key do |key|
      question = questionnaire.questions.find { |q| q&.key.to_s == key.to_s }
      if question and (question.type == :radio || question.type == :scale || question.type == :select)
        option = question.options.find { |o| o.key.to_s == value[key].to_s }
        if option
          result[key] = option.value.to_s
        end
      end
    end
  end
  result
rescue Exception => e
  if defined? Roqua::Support::Errors
    Roqua::Support::Errors.report e, root_path: Rails.root.to_s
  end
  raise e if Rails.env.development? || Rails.env.test?
  Rails.logger.error "RESCUED #{e.message} \n #{e.backtrace.join('\n')}"
  {}
end

Protected Instance Methods

add_error(question, validationtype, message) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 353
def add_error(question, validationtype, message)
  errors.add(question.key, {message: message, valtype: validationtype})
end
calc_answered(qkeys) click to toggle source
# File lib/quby/answers/entities/answer.rb, line 340
def calc_answered(qkeys)
  answered = 0
  qkeys.each do |qk|
    ans = send(qk)
    if ans.is_a? Hash # in case of check_box, only count checked check_boxes as answered
      answered += (ans.values.sum >= 1 ? 1 : 0)
    elsif send(qk).present?
      answered += 1
    end
  end
  answered
end