Class: Roqua::Healthy::A19::Transformer

Inherits:
Object
  • Object
show all
Defined in:
lib/roqua/healthy/a19/transformer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(message) ⇒ Transformer

Returns a new instance of Transformer.



14
15
16
17
18
19
20
21
# File 'lib/roqua/healthy/a19/transformer.rb', line 14

def initialize(message)
  @message = message
  @message['PID']['PID.3']  = [@message.fetch('PID').fetch('PID.3')].flatten.compact
  @message['PID']['PID.5']  = [@message.fetch('PID').fetch('PID.5')].flatten.compact
  @message['PID']['PID.11'] = [@message.fetch('PID').fetch('PID.11')].flatten.compact
  @message['PID']['PID.13'] = [@message.fetch('PID').fetch('PID.13')].flatten.compact
  @message = MessageCleaner.new(@message).message
end

Instance Attribute Details

#messageObject (readonly)

Returns the value of attribute message.



12
13
14
# File 'lib/roqua/healthy/a19/transformer.rb', line 12

def message
  @message
end

Instance Method Details

#birthdateObject



79
80
81
82
# File 'lib/roqua/healthy/a19/transformer.rb', line 79

def birthdate
  birthdate_details = message.fetch('PID').fetch('PID.7')
  birthdate_details&.fetch('PID.7.1')
end

#emailObject



84
85
86
87
88
89
90
91
92
93
# File 'lib/roqua/healthy/a19/transformer.rb', line 84

def email
  email_record = message.fetch('PID').fetch('PID.13').find do |record|
    record.fetch('PID.13.2', :unknown_type_of_phone_record) == 'NET'
  end
  return nil unless email_record

  email_address = email_record.fetch('PID.13.1', "")
  email_address = email_record.fetch('PID.13.4', "") if email_address.blank?
  email_address
end

#genderObject



116
117
118
# File 'lib/roqua/healthy/a19/transformer.rb', line 116

def gender
  message.dig('PID', 'PID.8', 'PID.8.1')
end

#identitiesObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/roqua/healthy/a19/transformer.rb', line 54

def identities
  @identities ||= message.fetch('PID').fetch('PID.3').map do |identity|
    next if identity.fetch('PID.3.1').blank?
    authority = identity.fetch('PID.3.5')
    # medoq sends all its (possibly identifying) metadata in 1 json encoded identity
    # non medoq hl7 clients could fake being medoq, so do not add any trusted behavior
    # to medoq identities beyond what a regular hl7 field would enable
    if authority == 'MEDOQ'
      parsed_medoq_data = JSON.parse(identity.fetch('PID.3.1')).with_indifferent_access
      {ident: parsed_medoq_data[:epd_id],
       research_number: parsed_medoq_data[:research_number],
       metadata: parsed_medoq_data[:metadata],
       authority: authority}
    else
      {ident: identity.fetch('PID.3.1'), authority: authority}
    end
  end.compact
end

#medoq_dataObject



73
74
75
76
77
# File 'lib/roqua/healthy/a19/transformer.rb', line 73

def medoq_data
  identities.find do |identity|
    identity[:authority] == 'MEDOQ'
  end || {}
end

#phone_cellObject

this is a heuristic to pick likely dutch cell phone numbers out of the hl7 messages we receive



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/roqua/healthy/a19/transformer.rb', line 97

def phone_cell
  pid13 = message.fetch('PID').fetch('PID.13')

  # prefer PRN (Primary Residence Number) that contains a cell phone number
  phone_cell_record = pid13.find do |record|
    phone_cell_number?(record.fetch('PID.13.1', '') || '') &&
      record.fetch('PID.13.2', :unknown_type_of_phone_record) == 'PRN'
  end

  # otherwise choose the first occuring cell phone number
  phone_cell_record ||= pid13.find do |record|
    phone_cell_number?(record.fetch('PID.13.1', '') || '')
  end

  # any number for which phone_cell_number? returns false is ignored

  strip_non_phone_number_characters(phone_cell_record.fetch('PID.13.1')) if phone_cell_record.present?
end

#sourceObject



50
51
52
# File 'lib/roqua/healthy/a19/transformer.rb', line 50

def source
  message.fetch('MSH').fetch('MSH.4').fetch('MSH.4.1')
end

#statusObject



46
47
48
# File 'lib/roqua/healthy/a19/transformer.rb', line 46

def status
  'SUCCESS'
end

#to_patientObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/roqua/healthy/a19/transformer.rb', line 23

def to_patient
  {
    status:       status,
    source:       source,
    identities:   identities,
    firstname:    name.firstname,
    initials:     name.initials,
    lastname:     name.lastname,
    display_name: name.display_name,
    nickname:     name.nickname,
    email:        email,
    address_type: address.address_type,
    street:       address.street,
    city:         address.city,
    zipcode:      address.zipcode,
    country:      address.country,
    birthdate:    birthdate,
    gender:       gender,
    phone_cell:   phone_cell,
    medoq_data:   medoq_data
  }
end