Class: Entry

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::MassAssignmentSecurity, Mongoid::Attributes::Dynamic, Mongoid::Document, ThingWithCodes
Defined in:
lib/health-data-standards/models/entry.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ThingWithCodes

#add_code, #codes_in_code_set, #codes_to_s, convert_codes_to_s, included, #preferred_code, #single_code_value?, #translation_codes

Class Method Details

.from_event_hash(event) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/health-data-standards/models/entry.rb', line 77

def self.from_event_hash(event)
  entry = Entry.new
  if event['code']
    entry.add_code(event['code'], event['code_set'])
  end
  entry.time = event['time']
  if event['value']
    entry.set_value(event['value'], event['unit'])
  end
  if event['description']
    entry.description = event['description']
  end
  if event['specifics']
    entry.specifics = event['specifics']
  end
  if event['status']
    entry.status = event['status']
  end
  entry
end

.time_to_s(input_time) ⇒ Object



40
41
42
# File 'lib/health-data-standards/models/entry.rb', line 40

def self.time_to_s(input_time)
  Time.at(input_time).utc.to_formatted_s(:long_ordinal)
end

Instance Method Details

#==(other) ⇒ Object

Compares hash values to determine equality



150
151
152
# File 'lib/health-data-standards/models/entry.rb', line 150

def ==(other)
  self.class==other.class && self.hash==other.hash
end

#as_point_in_timeObject

Tries to find a single point in time for this entry. Will first return time if it is present, then fall back to start_time and finally end_time



126
127
128
129
130
131
132
133
134
# File 'lib/health-data-standards/models/entry.rb', line 126

def as_point_in_time
  if time
    time
  elsif start_time
    start_time
  else
    end_time
  end
end

#calculate_hash!Object

Calculates a hash value for this entry



160
161
162
163
164
# File 'lib/health-data-standards/models/entry.rb', line 160

def calculate_hash!
  entry_hash = to_hash
  entry_hash['description']=nil
  @hash = entry_hash.hash
end

#hashObject

Returns the hash value, calculating it if not already done



155
156
157
# File 'lib/health-data-standards/models/entry.rb', line 155

def hash
  @hash || calculate_hash!
end

#identifierObject



204
205
206
207
208
209
210
# File 'lib/health-data-standards/models/entry.rb', line 204

def identifier
  if respond_to?(:cda_identifier) && self.cda_identifier.present?
    self.cda_identifier
  else
    self.id
  end
end

#is_date_range?true, false

Checks to see if this Entry can be used as a date range

Returns:

  • (true, false)

    If the Entry has a start and end time returns true, false otherwise.



138
139
140
# File 'lib/health-data-standards/models/entry.rb', line 138

def is_date_range?
  start_time.present? && end_time.present?
end

#is_in_code_set?(code_set) ⇒ true, false

Checks if a code is in the list of possible codes

Parameters:

  • code_set (Array)

    an Array of Hashes that describe the values for code sets The hash has a key of “set” for the code system name and “values” for the actual code list

Returns:

  • (true, false)

    whether the code is in the list of desired codes



111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/health-data-standards/models/entry.rb', line 111

def is_in_code_set?(code_set)
  codes.keys.each do |code_system|
    all_codes_in_system = code_set.find_all {|set| set['set'] == code_system}
    all_codes_in_system.each do |codes_in_system|
      matching_codes = codes_in_system['values'] & codes[code_system]
      if matching_codes.length > 0
        return true
      end
    end
  end
  false
end

#set_value(scalar, units = nil) ⇒ Object

Sets the value for the entry

Parameters:

  • scalar (String)

    the value

  • units (String) (defaults to: nil)

    the units of the scalar value



101
102
103
104
# File 'lib/health-data-standards/models/entry.rb', line 101

def set_value(scalar, units=nil)
  pq_value = PhysicalQuantityResultValue.new(scalar: scalar, units: units)
  self.values << pq_value
end

#shift_dates(date_diff) ⇒ Object



198
199
200
201
202
# File 'lib/health-data-standards/models/entry.rb', line 198

def shift_dates(date_diff)
  self.start_time = self.start_time.nil? ? nil : (self.start_time + date_diff)
  self.end_time = self.end_time.nil? ? nil : (self.end_time + date_diff)
  self.time = self.time.nil? ? nil : (self.time + date_diff)
end

#statusObject

Entry previously had a status field that dropped the code set and converted the status to a String. Entry now preserves the original code and code set. This method is here to maintain backwards compatibility.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/health-data-standards/models/entry.rb', line 47

def status
  if status_code.present?
    if status_code['HL7 ActStatus']
      status_code['HL7 ActStatus'].first()
    elsif status_code['SNOMED-CT']
      case status_code['SNOMED-CT'].first()
      when '55561003'
        'active'
      when '73425007'
        'inactive'
      when '413322009'      
        'resolved'
      end
    end
  end
end

#status=(status_text) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/health-data-standards/models/entry.rb', line 64

def status=(status_text)
  case status_text.to_s # makes sure that any Symbols passed in are stringified
  when 'active'
    self.status_code = {'SNOMED-CT' => ['55561003'], 'HL7 ActStatus' => ['active']}
  when 'inactive'
    self.status_code = {'SNOMED-CT' => ['73425007']}
  when 'resolved'
    self.status_code = {'SNOMED-CT' => ['413322009']}
  else
    self.status_code = {'HL7 ActStatus' => [status_text]}
  end
end

#times_to_s(nil_string = 'UNK') ⇒ Object



30
31
32
33
34
35
36
37
38
# File 'lib/health-data-standards/models/entry.rb', line 30

def times_to_s(nil_string='UNK')
  if start_time.present? || end_time.present?
    start_string = start_time ? Entry.time_to_s(start_time) : nil_string
    end_string = end_time ? Entry.time_to_s(end_time) : nil_string
    "#{start_string} - #{end_string}"
  elsif time.present?
    Time.at(time).utc.to_formatted_s(:long_ordinal)
  end
end

#to_hashHash

Creates a Hash for this Entry

Returns:

  • (Hash)

    a Hash representing the Entry



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/health-data-standards/models/entry.rb', line 168

def to_hash
  entry_hash = {}
  entry_hash['codes'] = codes
  unless values.empty?
    entry_hash['value'] = values
  end
  
  if is_date_range?
    entry_hash['start_time'] = start_time
    entry_hash['end_time'] = end_time
  else
    entry_hash['time'] = as_point_in_time
  end
  
  if status
    entry_hash['status'] = status
  end
  
  if description
    entry_hash['description'] = description
  end

  if specifics
    entry_hash['specifics'] = specifics
  end
  
  entry_hash
end

#usable?true, false

Checks to see if this Entry is usable for measure calculation. This means that it contains at least one code and has one of its time properties set (start, end or time)

Returns:

  • (true, false)


145
146
147
# File 'lib/health-data-standards/models/entry.rb', line 145

def usable?
  codes.present? && (start_time.present? || end_time.present? || time.present?)
end