Class: Quby::Answers::Entities::Answer

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Naming, ActiveModel::Translation
Defined in:
lib/quby/answers/entities/answer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(_id: nil, questionnaire_id: nil, questionnaire_key: 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) ⇒ Answer

Returns a new instance of Answer.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/quby/answers/entities/answer.rb', line 85

def initialize(_id: nil, questionnaire_id: nil, questionnaire_key: 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
end

Instance Attribute Details

#_idString

Returns:

  • (String)


15
16
17
# File 'lib/quby/answers/entities/answer.rb', line 15

def _id
  @_id
end

#abortedObject

Returns the value of attribute aborted.



79
80
81
# File 'lib/quby/answers/entities/answer.rb', line 79

def aborted
  @aborted
end

#actionsObject



280
281
282
# File 'lib/quby/answers/entities/answer.rb', line 280

def actions
  outcome.actions
end

#activeBoolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/quby/answers/entities/answer.rb', line 41

def active
  @active
end

#completed_atTime

Returns:

  • (Time)


56
57
58
# File 'lib/quby/answers/entities/answer.rb', line 56

def completed_at
  @completed_at
end

#completionObject



284
285
286
# File 'lib/quby/answers/entities/answer.rb', line 284

def completion
  outcome.completion
end

#created_atTime

Returns:

  • (Time)


47
48
49
# File 'lib/quby/answers/entities/answer.rb', line 47

def created_at
  @created_at
end

#dsl_last_updateTime

Returns:

  • (Time)


62
63
64
# File 'lib/quby/answers/entities/answer.rb', line 62

def dsl_last_update
  @dsl_last_update
end

#extra_failed_validationsObject

Returns the value of attribute extra_failed_validations.



83
84
85
# File 'lib/quby/answers/entities/answer.rb', line 83

def extra_failed_validations
  @extra_failed_validations
end

#extra_question_valuesObject

For setting raw content values and failed validations



82
83
84
# File 'lib/quby/answers/entities/answer.rb', line 82

def extra_question_values
  @extra_question_values
end

#flagsHash<String, Boolean>

Returns:

  • (Hash<String, Boolean>)


69
70
71
# File 'lib/quby/answers/entities/answer.rb', line 69

def flags
  @flags
end

#import_notesHash

For answers that are imported from external sources

Returns:

  • (Hash)


66
67
68
# File 'lib/quby/answers/entities/answer.rb', line 66

def import_notes
  @import_notes
end

#outcomeOutcome

Returns:



59
60
61
# File 'lib/quby/answers/entities/answer.rb', line 59

def outcome
  @outcome
end

#outcome_generated_atObject

Returns the value of attribute outcome_generated_at.



74
75
76
# File 'lib/quby/answers/entities/answer.rb', line 74

def outcome_generated_at
  @outcome_generated_at
end

#patientHash

Returns:

  • (Hash)


35
36
37
# File 'lib/quby/answers/entities/answer.rb', line 35

def patient
  @patient
end

#patient_idString

Returns:

  • (String)


32
33
34
# File 'lib/quby/answers/entities/answer.rb', line 32

def patient_id
  @patient_id
end

#questionnaire_idString

Returns:

  • (String)


18
19
20
# File 'lib/quby/answers/entities/answer.rb', line 18

def questionnaire_id
  @questionnaire_id
end

#questionnaire_keyString

Returns:

  • (String)


21
22
23
# File 'lib/quby/answers/entities/answer.rb', line 21

def questionnaire_key
  @questionnaire_key
end

#raw_paramsHash

The raw form data (for recovery purposes)

Returns:

  • (Hash)


25
26
27
# File 'lib/quby/answers/entities/answer.rb', line 25

def raw_params
  @raw_params
end

#scoresObject



268
269
270
# File 'lib/quby/answers/entities/answer.rb', line 268

def scores
  outcome.scores
end

#started_atTime

Returns:

  • (Time)


53
54
55
# File 'lib/quby/answers/entities/answer.rb', line 53

def started_at
  @started_at
end

#testBoolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/quby/answers/entities/answer.rb', line 44

def test
  @test
end

#textvarsHash<String, String>

Returns:

  • (Hash<String, String>)


72
73
74
# File 'lib/quby/answers/entities/answer.rb', line 72

def textvars
  @textvars
end

#tokenString

Returns:

  • (String)


38
39
40
# File 'lib/quby/answers/entities/answer.rb', line 38

def token
  @token
end

#updated_atTime

Returns:

  • (Time)


50
51
52
# File 'lib/quby/answers/entities/answer.rb', line 50

def updated_at
  @updated_at
end

#valueHash

The filtered and transformed form data

Returns:

  • (Hash)


29
30
31
# File 'lib/quby/answers/entities/answer.rb', line 29

def value
  @value
end

Instance Method Details

#actionObject



288
289
290
# File 'lib/quby/answers/entities/answer.rb', line 288

def action
  outcome.action
end

#all_blank?Boolean

Returns:

  • (Boolean)


315
316
317
318
319
320
# File 'lib/quby/answers/entities/answer.rb', line 315

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 = {}) ⇒ Object



302
303
304
305
306
307
308
309
# File 'lib/quby/answers/entities/answer.rb', line 302

def as_json(options = {})
  attributes.merge(
      id: id,
      value_by_values: value_by_values,
      scores: scores,
      is_completed: self.completed? ? true : false
  )
end

#attributesObject



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/quby/answers/entities/answer.rb', line 128

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?Boolean

Returns:

  • (Boolean)


311
312
313
# File 'lib/quby/answers/entities/answer.rb', line 311

def completed?
  !all_blank? && valid?
end

#enhance_by_dslObject



175
176
177
# File 'lib/quby/answers/entities/answer.rb', line 175

def enhance_by_dsl
  DSL.enhance(self)
end

#errorsObject



155
156
157
# File 'lib/quby/answers/entities/answer.rb', line 155

def errors
  @errors ||= ActiveModel::Errors.new(self)
end

#idObject



116
117
118
# File 'lib/quby/answers/entities/answer.rb', line 116

def id
  _id
end

#mark_completed(start_time) ⇒ Object



168
169
170
171
172
173
# File 'lib/quby/answers/entities/answer.rb', line 168

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

#questionnaireObject

Faux belongs_to :questionnaire



164
165
166
# File 'lib/quby/answers/entities/answer.rb', line 164

def questionnaire
  Quby.questionnaires.find(questionnaire_key)
end

#score_objectsObject



272
273
274
275
276
277
278
# File 'lib/quby/answers/entities/answer.rb', line 272

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

#to_paramObject



124
125
126
# File 'lib/quby/answers/entities/answer.rb', line 124

def to_param
  id
end

#url_params(options = {}) ⇒ Object



322
323
324
325
326
327
328
329
330
331
332
333
334
# File 'lib/quby/answers/entities/answer.rb', line 322

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?Boolean

Returns:

  • (Boolean)


159
160
161
# File 'lib/quby/answers/entities/answer.rb', line 159

def valid?
  errors.empty?
end

#value_by_regular_valuesObject



230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/quby/answers/entities/answer.rb', line 230

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_valuesObject



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
# File 'lib/quby/answers/entities/answer.rb', line 206

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