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, 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) ⇒ 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
115
116
# 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

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



282
283
284
# File 'lib/quby/answers/entities/answer.rb', line 282

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



286
287
288
# File 'lib/quby/answers/entities/answer.rb', line 286

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



270
271
272
# File 'lib/quby/answers/entities/answer.rb', line 270

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



290
291
292
# File 'lib/quby/answers/entities/answer.rb', line 290

def action
  outcome.action
end

#all_blank?Boolean

Returns:

  • (Boolean)


317
318
319
320
321
322
# 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 = {}) ⇒ Object



304
305
306
307
308
309
310
311
# 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

#attributesObject



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# 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?Boolean

Returns:

  • (Boolean)


313
314
315
# File 'lib/quby/answers/entities/answer.rb', line 313

def completed?
  !all_blank? && valid?
end

#enhance_by_dslObject



177
178
179
# File 'lib/quby/answers/entities/answer.rb', line 177

def enhance_by_dsl
  DSL.enhance(self)
end

#errorsObject



157
158
159
# File 'lib/quby/answers/entities/answer.rb', line 157

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

#idObject



118
119
120
# File 'lib/quby/answers/entities/answer.rb', line 118

def id
  _id
end

#mark_completed(start_time) ⇒ Object



170
171
172
173
174
175
# 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

#questionnaireObject

Faux belongs_to :questionnaire



166
167
168
# File 'lib/quby/answers/entities/answer.rb', line 166

def questionnaire
  @questionnaire ||= Quby.questionnaires.find(questionnaire_key)
end

#read_attribute_for_validation(attr) ⇒ Object

Required for ActiveModel::Errors



339
340
341
# File 'lib/quby/answers/entities/answer.rb', line 339

def read_attribute_for_validation(attr)
  send(attr)
end

#score_objectsObject



274
275
276
277
278
279
280
# 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

#to_paramObject



126
127
128
# File 'lib/quby/answers/entities/answer.rb', line 126

def to_param
  id
end

#url_params(options = {}) ⇒ Object



324
325
326
327
328
329
330
331
332
333
334
335
336
# 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?Boolean

Returns:

  • (Boolean)


161
162
163
# File 'lib/quby/answers/entities/answer.rb', line 161

def valid?
  errors.empty?
end

#value_by_regular_valuesObject



232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# 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_valuesObject



208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# 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