Class: Entry

Inherits:
Object
  • Object
show all
Includes:
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



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/health-data-standards/models/entry.rb', line 82

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



45
46
47
# File 'lib/health-data-standards/models/entry.rb', line 45

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



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

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



131
132
133
134
135
136
137
138
139
# File 'lib/health-data-standards/models/entry.rb', line 131

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



165
166
167
168
169
# File 'lib/health-data-standards/models/entry.rb', line 165

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



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

def hash
  @hash || calculate_hash!
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.



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

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



116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/health-data-standards/models/entry.rb', line 116

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



106
107
108
109
# File 'lib/health-data-standards/models/entry.rb', line 106

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

#shift_dates(date_diff) ⇒ Object



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

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.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/health-data-standards/models/entry.rb', line 52

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



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/health-data-standards/models/entry.rb', line 69

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



35
36
37
38
39
40
41
42
43
# File 'lib/health-data-standards/models/entry.rb', line 35

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



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/health-data-standards/models/entry.rb', line 173

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)


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

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