healthcare_phony 0.3.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +66 -0
- data/VERSION +1 -1
- data/examples/phony_adt_sender.rb +111 -0
- data/examples/phony_adt_sender.yml +10 -0
- data/lib/healthcare_phony.rb +38 -13
- data/lib/healthcare_phony/address.rb +1 -1
- data/lib/healthcare_phony/cell_phone_number.rb +1 -1
- data/lib/healthcare_phony/doctor.rb +3 -2
- data/lib/healthcare_phony/email.rb +1 -1
- data/lib/healthcare_phony/ethnic_group.rb +1 -1
- data/lib/healthcare_phony/gender.rb +1 -1
- data/lib/healthcare_phony/hl7_message.rb +72 -49
- data/lib/healthcare_phony/home_phone_number.rb +1 -1
- data/lib/healthcare_phony/identifier.rb +1 -1
- data/lib/healthcare_phony/language.rb +1 -1
- data/lib/healthcare_phony/patient.rb +7 -7
- data/lib/healthcare_phony/patient_visit.rb +9 -8
- data/lib/healthcare_phony/person_name.rb +5 -5
- data/lib/healthcare_phony/phone_number.rb +1 -1
- data/lib/healthcare_phony/race.rb +2 -1
- data/lib/healthcare_phony/religion.rb +1 -1
- data/lib/healthcare_phony/templates/adt_example.erb +3 -3
- data/lib/healthcare_phony/visit_admission.rb +4 -4
- data/lib/healthcare_phony/visit_discharge.rb +7 -7
- data/lib/healthcare_phony/visit_doctors.rb +5 -5
- data/lib/healthcare_phony/visit_location.rb +10 -10
- data/lib/healthcare_phony/visit_type.rb +9 -0
- data/lib/healthcare_phony/work_phone_number.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52179664ed49c4f5ddac39695bf24e697078ae4f9e860a2556374fd3cfe55d59
|
4
|
+
data.tar.gz: 47e45882af902b835ae546ff2d472da3270adf07f21d8987eb71bd9ef0001467
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af04102942b12b4a48732fec3ead0cc21285f21ae28f6c5606e96339079aad1fe4db3e83c80492f51a1a6968d060436cfa9f0420bc91fe21e51de24bc29d5af8
|
7
|
+
data.tar.gz: ebea7beb8d35daa149140de9c0409bfd0410bde1dac7ca8cbd935127d41fe2850e6fb9939b35d7f97d4422c853b0693af00cdd0a2eabf4e6edaec4ce1e4e5ae9
|
data/README.md
CHANGED
@@ -147,6 +147,7 @@ The creation of the Patient can be customized by sending the following parameter
|
|
147
147
|
* race_count → By default on Race is generated, this allows you to specify a number > 1.
|
148
148
|
* gender → A Gender object which will be used to generate a Male or Female name if specified.
|
149
149
|
* degree_data_file → Location of YAML file containing a list of potential degrees to choose from. By default the gem supplied file will be used. The default file [degree.yml](https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/degree.yml).
|
150
|
+
* visit_type → VisitType of this patient's visit
|
150
151
|
|
151
152
|
### Patient Visit
|
152
153
|
|
@@ -272,6 +273,71 @@ The creation of the PatientVisit can be customized by sending the following para
|
|
272
273
|
* discharge_location → Array of discharge locations to randomly choose from. Specified as comma separated String or Ruby array. Otherwise a string of data is generated with Faker::Lorem.sentence
|
273
274
|
* admit_datetime → The admit date/time associated with this visit. If not specified the current date/time is used.
|
274
275
|
|
276
|
+
### Hl7 Message
|
277
|
+
|
278
|
+
```ruby
|
279
|
+
hl7 = HealthcarePhony::Hl7Message.new
|
280
|
+
```
|
281
|
+
|
282
|
+
The above will give you a default Hl7Message object:
|
283
|
+
|
284
|
+
```
|
285
|
+
#<HealthcarePhony::Hl7Message:0x00007f81979beb58
|
286
|
+
@message_type="MDM",
|
287
|
+
@trigger_event="T04",
|
288
|
+
@message_control_id="PHONY8408942134",
|
289
|
+
@version="2.5.1", @sending_facility="",
|
290
|
+
@sending_application="",
|
291
|
+
@receiving_application="",
|
292
|
+
@receiving_facility="",
|
293
|
+
@message_datetime=2021-01-16 20:29:10 -0500,
|
294
|
+
@processing_id="P">
|
295
|
+
```
|
296
|
+
|
297
|
+
The creation of the Hl7Message object can be customized by sending the following parameters when initializing:
|
298
|
+
|
299
|
+
* message_version - HL7v2 version (MSH.12)
|
300
|
+
* message_processing_id - Typically P or T (MSH.11)
|
301
|
+
* message_types - Array of Message Types (MSH.9.1) to randomly choose from. Specified as comma separated String or Ruby array.
|
302
|
+
* message_type_file - Location of file containing Message Types (MSH.9.1). If not specified then included [hl7_message_types.yml](https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/hl7_message_types.yml) file will be used.
|
303
|
+
* message_events - Generic array of Trigger Events (MSH.9.2) to randomly choose from. Specified as command separated String or Ruby array.
|
304
|
+
* adt_events - Array of ADT Trigger Events (MSH.9.2) to randomly choose from. Used (if specified) if the Message type for the message is ADT. ADT events from [adt_event_types.yml](https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml) will be used by default.
|
305
|
+
* oru_events - Array of ORU Trigger Events (MSH.9.2) to randomly choose from. Used (if specified) if the Message type for the message is ORU. ORU events from [oru_event_types.yml](https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml) will be used by default.
|
306
|
+
* mdm_events - Array of MDM Trigger Events (MSH.9.2) to randomly choose from. Used (if specified) if the Message type for the message is MDM. MDM events from [mdm_event_types.yml](https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml) will be used by default.
|
307
|
+
* message_control_id_pattern - Regex pattern used to randomly generate MSH.10 values. Default is PHONY\d{10} which will generate a value like: PHONY6850295805
|
308
|
+
* message_sending_facility - Array of Sending Facilities (MSH.4) to randomly choose from. Specified as comma separated String or Ruby Array.
|
309
|
+
* message_sending_application - Array of Sending Applications (MSH.3) to randomly choose from. Specified as comma separated String or Ruby Array.
|
310
|
+
* message_receiving_application - Array of Receiving Applications (MSH.5) to randomly choose from. Specified as comma separated String or Ruby Array.
|
311
|
+
* message_receiving_facility - Array of Receiving Facilities (MSH.6) to randomly choose from. Specified as comma separated String or Ruby Array.
|
312
|
+
|
313
|
+
## Examples
|
314
|
+
|
315
|
+
See the examples directory.
|
316
|
+
|
317
|
+
So far there is only one script there, phony_adt_sender.rb. This script will generate a specified number of fake ADT messages and send them to the specified host and port using TCP/IP mllp.
|
318
|
+
|
319
|
+
Command line argument description:
|
320
|
+
|
321
|
+
```text
|
322
|
+
Usage: phony_adt_sender.rb [options]
|
323
|
+
|
324
|
+
-n, --number NUMBER Number of messages to send
|
325
|
+
-h, --host HOST IP or DNS for listening host
|
326
|
+
-p, --port PORT Listening port
|
327
|
+
-c, --config CONFIGFILE Path to configuration file (YAML) for message parameters
|
328
|
+
--mllp-start HEX Hex character(s) to denote start of message bytes. In form nn (example 0b for vertical tab) or nnnn (example 1c0d for file separator & carriage return)
|
329
|
+
--mllp-end HEX Hex character(s) to denote start of message bytes. In form nn (example 0b for vertical tab) or nnnn (example 1c0d for file separator & carriage return)
|
330
|
+
--help Show this message
|
331
|
+
```
|
332
|
+
|
333
|
+
An example config file is also in the examples directory.
|
334
|
+
|
335
|
+
So to send 100 messages to 192.168.1.50:3022 using a config file phony_adt_sender.yml with non-standard mllp beginning/ending.
|
336
|
+
|
337
|
+
```text
|
338
|
+
ruby phony_adt_sender.rb -h 192.168.1.50 --number 100 --port 3022 --config phony_adt_sender.yml --mllp-start 05 --mllp-end 0304
|
339
|
+
```
|
340
|
+
|
275
341
|
## Contributing
|
276
342
|
|
277
343
|
Bug reports and pull requests are welcome on GitHub at https://github.com/austinmoody/healthcare_phony. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/healthcare_phony/blob/master/CODE_OF_CONDUCT.md).
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'socket'
|
4
|
+
require 'healthcare_phony'
|
5
|
+
require 'optparse'
|
6
|
+
require 'psych'
|
7
|
+
|
8
|
+
class PhonyAdtSender
|
9
|
+
attr_reader :host, :port, :number_messages, :message_parameters, :mllp_start, :mllp_end
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@message_parameters = {}
|
13
|
+
parse
|
14
|
+
end
|
15
|
+
|
16
|
+
def send
|
17
|
+
puts "Sending #{@number_messages} messages to #{@host}:#{@port}"
|
18
|
+
|
19
|
+
@number_messages.to_i.times do
|
20
|
+
t = TCPSocket.new(@host, @port)
|
21
|
+
|
22
|
+
m = HealthcarePhony::Adt.new(@message_parameters)
|
23
|
+
# #{@mllp_start}
|
24
|
+
t.send "#{[@mllp_start].pack("H*")}#{m.to_s}#{[@mllp_end].pack("H*")}", 0
|
25
|
+
|
26
|
+
pp "Message With ID #{m.hl7_message.message_control_id} sent..."
|
27
|
+
|
28
|
+
reading_response = true
|
29
|
+
ack_response = ''
|
30
|
+
while reading_response
|
31
|
+
current_read = t.read(1)
|
32
|
+
ack_response += current_read unless current_read.nil?
|
33
|
+
reading_response = false if current_read.nil?
|
34
|
+
end
|
35
|
+
|
36
|
+
pp "ACK: #{ack_response}"
|
37
|
+
|
38
|
+
t.close
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def parse
|
45
|
+
options = {}
|
46
|
+
optparse = OptionParser.new do |parser|
|
47
|
+
parser.banner = 'Usage: phony_adt_sender.rb [options]'
|
48
|
+
parser.separator ''
|
49
|
+
|
50
|
+
parser.on('-n', '--number NUMBER', Integer, 'Number of messages to send') do |number_messages|
|
51
|
+
options[:number_messages] = number_messages
|
52
|
+
end
|
53
|
+
|
54
|
+
parser.on('-h', '--host HOST', String, 'IP or DNS for listening host') do |host|
|
55
|
+
options[:host] = host
|
56
|
+
end
|
57
|
+
|
58
|
+
parser.on('-p', '--port PORT', Integer, 'Listening port') do |port|
|
59
|
+
options[:port] = port
|
60
|
+
end
|
61
|
+
|
62
|
+
parser.on('-c', '--config CONFIGFILE', String, 'Path to configuration file (YAML) for message parameters') do |config|
|
63
|
+
options[:config] = config
|
64
|
+
end
|
65
|
+
|
66
|
+
parser.on('--mllp-start HEX',
|
67
|
+
'Hex character(s) to denote start of message bytes. In form nn (example 0b for vertical tab) or nnnn (example 1c0d for file separator & carriage return)') do |mllp_start|
|
68
|
+
options[:mllp_start] = mllp_start
|
69
|
+
end
|
70
|
+
|
71
|
+
parser.on('--mllp-end HEX', String,
|
72
|
+
'Hex character(s) to denote start of message bytes. In form nn (example 0b for vertical tab) or nnnn (example 1c0d for file separator & carriage return)') do |mllp_end|
|
73
|
+
options[:mllp_end] = mllp_end
|
74
|
+
end
|
75
|
+
|
76
|
+
parser.on('--help', 'Show this message') do
|
77
|
+
puts parser
|
78
|
+
exit
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
begin
|
83
|
+
optparse.parse!
|
84
|
+
mandatory = %i[host port number_messages]
|
85
|
+
missing = mandatory.select { |param| options[param].nil? }
|
86
|
+
raise OptionParser::MissingArgument, missing.join(', ') unless missing.empty?
|
87
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
88
|
+
puts $!.to_s
|
89
|
+
puts optparse
|
90
|
+
exit
|
91
|
+
end
|
92
|
+
|
93
|
+
@host = options[:host]
|
94
|
+
@port = options[:port]
|
95
|
+
@number_messages = options[:number_messages]
|
96
|
+
@message_parameters = Psych.load_file(options[:config]) unless options[:config].nil?
|
97
|
+
@mllp_start = if options[:mllp_start].nil?
|
98
|
+
'0b'
|
99
|
+
else
|
100
|
+
options[:mllp_start]
|
101
|
+
end
|
102
|
+
@mllp_end = if options[:mllp_end].nil?
|
103
|
+
'1c0d'
|
104
|
+
else
|
105
|
+
options[:mllp_end]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
pas = PhonyAdtSender.new
|
111
|
+
pas.send
|
@@ -0,0 +1,10 @@
|
|
1
|
+
---
|
2
|
+
:message_sending_facility: CLINIC1,CLINIC2,CLINIC3
|
3
|
+
:message_sending_application: RUBY
|
4
|
+
:message_receiving_application: MIRTH
|
5
|
+
:message_receiving_facility: HOSPITAL_ONE
|
6
|
+
:message_version: '2.3'
|
7
|
+
:patient_class: A,B,C,X
|
8
|
+
:adt_events: A99,A88
|
9
|
+
:message_control_id_pattern: HL7_\d{15}
|
10
|
+
:message_processing_id: X
|
data/lib/healthcare_phony.rb
CHANGED
@@ -11,22 +11,47 @@ Faker::Config.locale = 'en-US'
|
|
11
11
|
|
12
12
|
module HealthcarePhony
|
13
13
|
class Adt
|
14
|
-
attr_reader :
|
14
|
+
attr_reader :template, :adt_arguments, :hl7_message, :patient, :visit
|
15
15
|
|
16
|
-
def initialize(
|
17
|
-
@
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
16
|
+
def initialize(init_args = {})
|
17
|
+
@adt_arguments = init_args
|
18
|
+
@adt_arguments[:message_types] = 'ADT'
|
19
|
+
set_template
|
20
|
+
@hl7_message = Hl7Message.new(@adt_arguments)
|
21
|
+
@patient = Patient.new(@adt_arguments)
|
22
|
+
@visit = PatientVisit.new(@adt_arguments.merge({ visit_type: set_visit_type }))
|
22
23
|
end
|
23
24
|
|
24
25
|
def to_s
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
erb_template = ERB.new(@template)
|
27
|
+
erb_template.result_with_hash({ patient: @patient, hl7: @hl7_message, visit: @visit })
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def set_template
|
33
|
+
unless @adt_arguments[:template].nil?
|
34
|
+
@template = @adt_arguments[:template]
|
35
|
+
return
|
36
|
+
end
|
37
|
+
@template = if @adt_arguments[:template_file].nil?
|
38
|
+
File.read(File.join(File.dirname(__FILE__), 'healthcare_phony', 'templates', 'adt_example.erb'))
|
39
|
+
else
|
40
|
+
File.read(@adt_arguments[:template_file])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def set_visit_type
|
45
|
+
case @hl7_message.trigger_event
|
46
|
+
when 'A01'
|
47
|
+
HealthcarePhony::VisitType::ADMIT
|
48
|
+
when 'A03'
|
49
|
+
HealthcarePhony::VisitType::DISCHARGE
|
50
|
+
when 'A04'
|
51
|
+
HealthcarePhony::VisitType::REGISTRATION
|
52
|
+
else
|
53
|
+
HealthcarePhony::VisitType::OTHER
|
54
|
+
end
|
30
55
|
end
|
31
56
|
end
|
32
57
|
|
@@ -47,7 +72,7 @@ module HealthcarePhony
|
|
47
72
|
counter = 0
|
48
73
|
output_string = ''
|
49
74
|
while counter < @number_of_rows
|
50
|
-
output_string += template.result_with_hash({ patient: Patient.new, write_header: counter
|
75
|
+
output_string += "#{template.result_with_hash({ patient: Patient.new, write_header: counter.zero? })}\n"
|
51
76
|
counter += 1
|
52
77
|
end
|
53
78
|
output_string
|
@@ -13,7 +13,7 @@ module HealthcarePhony
|
|
13
13
|
# address_type_data_file - YAML file containing address types to randomly choose from if different options than
|
14
14
|
# those that come with gem are desired.
|
15
15
|
# See {address_type.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/address_type.yml]
|
16
|
-
def initialize(
|
16
|
+
def initialize(init_args = {})
|
17
17
|
@set_blank = !init_args[:blank].nil? && Helper.random_with_blank('X', init_args[:blank]) == ''
|
18
18
|
@state = init_args[:state]
|
19
19
|
@country = init_args[:country]
|
@@ -9,7 +9,7 @@ module HealthcarePhony
|
|
9
9
|
# blank - An integer representing the % of times phone number components should be blank.
|
10
10
|
# use_code - Allows specification of the phone use code (PID.13.2)
|
11
11
|
# equipment_type - Allows specification of the phone equipment type (PID.13.3)
|
12
|
-
def initialize(
|
12
|
+
def initialize(init_args = {})
|
13
13
|
super(init_args)
|
14
14
|
@use_code = init_args[:use_code].nil? ? 'ORN' : init_args[:use_code]
|
15
15
|
@use_code = '' unless @set_blank == false
|
@@ -11,7 +11,7 @@ module HealthcarePhony
|
|
11
11
|
# Public: Initialize a Doctor. Pass in hash of different parameters, currently this includes:
|
12
12
|
#
|
13
13
|
# identifier - Allows you to specify an identifier for this Doctor instead of having it randomly generated.
|
14
|
-
def initialize(
|
14
|
+
def initialize(init_args = {})
|
15
15
|
@identifier = if !init_args[:identifier].nil?
|
16
16
|
init_args[:identifier]
|
17
17
|
else
|
@@ -19,7 +19,8 @@ module HealthcarePhony
|
|
19
19
|
(pre_check_npi.to_s + Helper.get_npi_check_digit(pre_check_npi).to_s).to_i
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
init_args[:degree] = 'MD,DO'
|
23
|
+
@name = PersonName.new(init_args)
|
23
24
|
end
|
24
25
|
end
|
25
26
|
end
|
@@ -7,7 +7,7 @@ module HealthcarePhony
|
|
7
7
|
:use_code,
|
8
8
|
:equipment_type
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(init_args = {})
|
11
11
|
@set_blank = !init_args[:blank].nil? && Helper.random_with_blank('X', init_args[:blank]) == ''
|
12
12
|
@email_address = Faker::Internet.email
|
13
13
|
@email_address = '' unless @set_blank == false
|
@@ -12,7 +12,7 @@ module HealthcarePhony
|
|
12
12
|
# ethnic_group_data_file - YAML file containing ethnic group information to randomly choose from if different options than
|
13
13
|
# those that come with gem are desired. See {ethnic_group.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/ethnic_group.yml]
|
14
14
|
# for default values.
|
15
|
-
def initialize(
|
15
|
+
def initialize(init_args = {})
|
16
16
|
@set_blank = !init_args[:blank].nil? && Helper.random_with_blank('X', init_args[:blank]) == ''
|
17
17
|
data_file = if !init_args[:ethnic_group_data_file].nil?
|
18
18
|
init_args[:ethnic_group_data_file]
|
@@ -8,7 +8,7 @@ module HealthcarePhony
|
|
8
8
|
|
9
9
|
# Public: Initializes a Gender. Pass in hash of different parameters, currently this includes:
|
10
10
|
# blank - An integer representing the % of times Address components should be blank.
|
11
|
-
def initialize(
|
11
|
+
def initialize(init_args = {})
|
12
12
|
@description = %w[Female Male Unknown].sample
|
13
13
|
|
14
14
|
@description = if !init_args[:blank].nil?
|
@@ -15,35 +15,38 @@ module HealthcarePhony
|
|
15
15
|
:processing_id
|
16
16
|
|
17
17
|
# Public: Initializes an Address. Pass in hash of different parameters, currently this includes:
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
18
|
+
# message_version - HL7v2 version (MSH.12)
|
19
|
+
# message_processing_id - Typically P or T (MSH.11)
|
20
|
+
# message_types - Array of Message Types (MSH.9.1) to randomly choose from. Specified as comma separated String or
|
21
21
|
# Ruby array.
|
22
22
|
# message_type_file - Location of file containing Message Types (MSH.9.1). If not specified then included
|
23
23
|
# {hl7_message_types.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/hl7_message_types.yml] file will be used.
|
24
|
-
#
|
25
|
-
# Ruby array.
|
26
|
-
#
|
27
|
-
# {adt_event_types.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml]
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
24
|
+
# message_events - Generic array of Trigger Events (MSH.9.2) to randomly choose from. Specified as command
|
25
|
+
# separated String or Ruby array.
|
26
|
+
# adt_events - Array of ADT Trigger Events (MSH.9.2) to randomly choose from. Used (if specified) if the Message
|
27
|
+
# type for the message is ADT. ADT events from {adt_event_types.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml]
|
28
|
+
# will be used by default.
|
29
|
+
# oru_events - Array of ORU Trigger Events (MSH.9.2) to randomly choose from. Used (if specified) if the Message
|
30
|
+
# type for the message is ORU. ORU events from {oru_event_types.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml]
|
31
|
+
# will be used by default.
|
32
|
+
# mdm_events - Array of MDM Trigger Events (MSH.9.2) to randomly choose from. Used (if speciifed) if the Message
|
33
|
+
# type for the message is MDM. MDM events from {mdm_event_types.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/adt_event_types.yml]
|
34
|
+
# will be used by default.
|
35
|
+
# message_control_id_pattern - Regex pattern used to randomly generate MSH.10 values. Default is PHONY\d{10} which will
|
33
36
|
# generate a value like: PHONY6850295805
|
34
|
-
#
|
37
|
+
# message_sending_facility - Array of Sending Facilities (MSH.4) to randomly choose from. Specified as comma separated
|
35
38
|
# String or Ruby Array.
|
36
|
-
#
|
39
|
+
# message_sending_application - Array of Sending Applications (MSH.3) to randomly choose from. Specified as comma
|
37
40
|
# separated String or Ruby Array.
|
38
|
-
#
|
41
|
+
# message_receiving_application - Array of Receiving Applications (MSH.5) to randomly choose from. Specified as comma
|
39
42
|
# separated String or Ruby Array.
|
40
|
-
#
|
43
|
+
# message_receiving_facility - Array of Receiving Facilities (MSH.6) to randomly choose from. Specified as comma separated
|
41
44
|
# String or Ruby Array.
|
42
|
-
def initialize(
|
45
|
+
def initialize(init_args)
|
43
46
|
define_message_type(init_args)
|
44
47
|
define_trigger_event(init_args)
|
45
48
|
define_control_id(init_args)
|
46
|
-
@version = init_args[:
|
49
|
+
@version = init_args[:message_version].nil? ? '2.5.1' : init_args[:message_version]
|
47
50
|
define_sending_facility(init_args)
|
48
51
|
define_sending_application(init_args)
|
49
52
|
define_receiving_application(init_args)
|
@@ -52,84 +55,104 @@ module HealthcarePhony
|
|
52
55
|
# Potential use case to allow you to provide begin/end date?
|
53
56
|
@message_datetime = Time.now
|
54
57
|
|
55
|
-
@processing_id = init_args[:
|
58
|
+
@processing_id = init_args[:message_processing_id].nil? ? 'P' : init_args[:message_processing_id]
|
56
59
|
end
|
57
60
|
|
58
61
|
private
|
59
62
|
|
60
|
-
def define_message_type(
|
63
|
+
def define_message_type(init_args = {})
|
61
64
|
file_name = "#{::File.expand_path(::File.join("..", "data_files"), __FILE__)}/hl7_message_types.yml"
|
62
65
|
file_name = init_args[:message_type_file] unless init_args[:message_type_file].nil?
|
63
|
-
hl7_message_types = if !init_args[:
|
64
|
-
Helper.get_array(init_args[:
|
66
|
+
hl7_message_types = if !init_args[:message_types].nil?
|
67
|
+
Helper.get_array(init_args[:message_types])
|
65
68
|
else
|
66
69
|
Psych.load_file(file_name)
|
67
70
|
end
|
68
71
|
@message_type = hl7_message_types.nil? ? '' : hl7_message_types.sample
|
69
72
|
end
|
70
73
|
|
71
|
-
def define_trigger_event(
|
72
|
-
@trigger_event = Helper.get_array(init_args[:
|
73
|
-
|
74
|
-
|
75
|
-
|
74
|
+
def define_trigger_event(init_args = {})
|
75
|
+
@trigger_event = Helper.get_array(init_args[:message_events]).sample
|
76
|
+
return unless @trigger_event.nil?
|
77
|
+
|
78
|
+
case @message_type
|
79
|
+
when 'ADT'
|
80
|
+
@trigger_event = define_adt_trigger_event(init_args)
|
81
|
+
when 'ORU'
|
82
|
+
@trigger_event = define_oru_trigger_event(init_args)
|
83
|
+
when 'MDM'
|
84
|
+
@trigger_event = define_mdm_trigger_event(init_args)
|
85
|
+
end
|
76
86
|
end
|
77
87
|
|
78
|
-
def define_adt_trigger_event(
|
88
|
+
def define_adt_trigger_event(init_args = {})
|
79
89
|
event_types = get_adt_events(init_args)
|
80
90
|
event_types&.sample
|
81
91
|
end
|
82
92
|
|
83
|
-
def define_oru_trigger_event(
|
93
|
+
def define_oru_trigger_event(init_args = {})
|
84
94
|
event_types = get_oru_events(init_args)
|
85
95
|
event_types&.sample
|
86
96
|
end
|
87
97
|
|
88
|
-
def define_mdm_trigger_event(
|
98
|
+
def define_mdm_trigger_event(init_args = {})
|
89
99
|
event_types = get_mdm_events(init_args)
|
90
100
|
event_types&.sample
|
91
101
|
end
|
92
102
|
|
93
|
-
def get_adt_events(
|
103
|
+
def get_adt_events(init_args = {})
|
94
104
|
file_name = "#{::File.expand_path(::File.join("..", "data_files"), __FILE__)}/adt_event_types.yml"
|
95
|
-
|
96
|
-
|
105
|
+
if init_args[:adt_events].nil?
|
106
|
+
Psych.load_file(file_name)
|
107
|
+
else
|
108
|
+
Helper.get_array(init_args[:adt_events])
|
109
|
+
end
|
97
110
|
end
|
98
111
|
|
99
|
-
def get_oru_events(
|
112
|
+
def get_oru_events(init_args = {})
|
100
113
|
file_name = "#{::File.expand_path(::File.join("..", "data_files"), __FILE__)}/oru_event_types.yml"
|
101
|
-
|
102
|
-
|
114
|
+
if init_args[:oru_events].nil?
|
115
|
+
Psych.load_file(file_name)
|
116
|
+
else
|
117
|
+
Helper.get_array(init_args[:oru_events])
|
118
|
+
end
|
103
119
|
end
|
104
120
|
|
105
|
-
def get_mdm_events(
|
121
|
+
def get_mdm_events(init_args = {})
|
106
122
|
file_name = "#{::File.expand_path(::File.join("..", "data_files"), __FILE__)}/mdm_event_types.yml"
|
107
|
-
|
108
|
-
|
123
|
+
if init_args[:mdm_events].nil?
|
124
|
+
Psych.load_file(file_name)
|
125
|
+
else
|
126
|
+
Helper.get_array(init_args[:mdm_events])
|
127
|
+
end
|
109
128
|
end
|
110
129
|
|
111
|
-
def define_control_id(
|
112
|
-
control_id_pattern = init_args[:
|
130
|
+
def define_control_id(init_args = {})
|
131
|
+
control_id_pattern = if init_args[:message_control_id_pattern].nil?
|
132
|
+
'PHONY\d{10}'
|
133
|
+
else
|
134
|
+
init_args[:message_control_id_pattern]
|
135
|
+
end
|
113
136
|
@message_control_id = Regexp.new(control_id_pattern).random_example
|
114
137
|
end
|
115
138
|
|
116
|
-
def define_sending_facility(
|
117
|
-
sf_choices = Helper.get_array(init_args[:
|
139
|
+
def define_sending_facility(init_args = {})
|
140
|
+
sf_choices = Helper.get_array(init_args[:message_sending_facility])
|
118
141
|
@sending_facility = !sf_choices.empty? ? sf_choices.sample : ''
|
119
142
|
end
|
120
143
|
|
121
|
-
def define_sending_application(
|
122
|
-
sa_choices = Helper.get_array(init_args[:
|
144
|
+
def define_sending_application(init_args = {})
|
145
|
+
sa_choices = Helper.get_array(init_args[:message_sending_application])
|
123
146
|
@sending_application = !sa_choices.empty? ? sa_choices.sample : ''
|
124
147
|
end
|
125
148
|
|
126
|
-
def define_receiving_application(
|
127
|
-
ra_choices = Helper.get_array(init_args[:
|
149
|
+
def define_receiving_application(init_args = {})
|
150
|
+
ra_choices = Helper.get_array(init_args[:message_receiving_application])
|
128
151
|
@receiving_application = !ra_choices.empty? ? ra_choices.sample : ''
|
129
152
|
end
|
130
153
|
|
131
|
-
def define_receiving_facility(
|
132
|
-
rf_choices = Helper.get_array(init_args[:
|
154
|
+
def define_receiving_facility(init_args = {})
|
155
|
+
rf_choices = Helper.get_array(init_args[:message_receiving_facility])
|
133
156
|
@receiving_facility = !rf_choices.empty? ? rf_choices.sample : ''
|
134
157
|
end
|
135
158
|
end
|
@@ -9,7 +9,7 @@ module HealthcarePhony
|
|
9
9
|
# blank - An integer representing the % of times phone number components should be blank.
|
10
10
|
# use_code - Allows specification of the phone use code (PID.13.2)
|
11
11
|
# equipment_type - Allows specification of the phone equipment type (PID.13.3)
|
12
|
-
def initialize(
|
12
|
+
def initialize(init_args = {})
|
13
13
|
super(init_args)
|
14
14
|
@use_code = init_args[:use_code].nil? ? 'PRN' : init_args[:use_code]
|
15
15
|
@use_code = '' unless @set_blank == false
|
@@ -12,7 +12,7 @@ module HealthcarePhony
|
|
12
12
|
# type_code - Identifier Type Code, example PID.3.5. HL7 Data Table 0203
|
13
13
|
# pattern - Regex pattern used to randomly generate the identifier. Default is \d{10} which would generate an
|
14
14
|
# identifier like 5992657933.
|
15
|
-
def initialize(
|
15
|
+
def initialize(init_args = {})
|
16
16
|
@identifier_type_code = init_args[:type_code].nil? ? '' : init_args[:type_code]
|
17
17
|
|
18
18
|
identifier_pattern = init_args[:pattern].nil? ? '\d{10}' : init_args[:pattern]
|
@@ -10,7 +10,7 @@ module HealthcarePhony
|
|
10
10
|
# Public: Initializes an Address. Pass in hash of different parameters, currently this includes:
|
11
11
|
# language_data_file - Location of YAML file containing Language data (Code, Description, and Coding System) if a
|
12
12
|
# different set of random values is desired. Otherwise the default file {language.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/language.yml] will be used.
|
13
|
-
def initialize(
|
13
|
+
def initialize(init_args = {})
|
14
14
|
# TODO: allow a way for caller to pass in a custom set of codes to choose from.
|
15
15
|
# TODO: allow a way for caller to pass in % blank
|
16
16
|
|
@@ -25,7 +25,7 @@ module HealthcarePhony
|
|
25
25
|
:death_indicator,
|
26
26
|
:death_datetime
|
27
27
|
|
28
|
-
def initialize(
|
28
|
+
def initialize(init_args = {})
|
29
29
|
define_gender(init_args)
|
30
30
|
define_names(init_args)
|
31
31
|
define_addresses(init_args)
|
@@ -40,7 +40,7 @@ module HealthcarePhony
|
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
|
-
def define_gender(
|
43
|
+
def define_gender(init_args = {})
|
44
44
|
@gender = if !init_args[:gender].nil? && init_args[:gender].is_a?(HealthcarePhony::Gender)
|
45
45
|
init_args[:gender]
|
46
46
|
else
|
@@ -48,7 +48,7 @@ module HealthcarePhony
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
def define_names(
|
51
|
+
def define_names(init_args = {})
|
52
52
|
init_args[:gender] = @gender
|
53
53
|
names_count = init_args[:names_count].nil? || init_args[:names_count] < 1 ? 1 : init_args[:names_count]
|
54
54
|
@names = []
|
@@ -58,7 +58,7 @@ module HealthcarePhony
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
-
def define_addresses(
|
61
|
+
def define_addresses(init_args = {})
|
62
62
|
address_count = init_args[:address_count].nil? || init_args[:address_count] < 1 ? 1 : init_args[:address_count]
|
63
63
|
@addresses = []
|
64
64
|
while address_count.positive?
|
@@ -67,19 +67,19 @@ module HealthcarePhony
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
def define_phones(
|
70
|
+
def define_phones(init_args = {})
|
71
71
|
@home_phone = HomePhoneNumber.new(init_args)
|
72
72
|
@cell_phone = CellPhoneNumber.new(init_args)
|
73
73
|
@work_phone = WorkPhoneNumber.new(init_args)
|
74
74
|
end
|
75
75
|
|
76
|
-
def define_dob(
|
76
|
+
def define_dob(init_args = {})
|
77
77
|
min_age = init_args[:min_age].nil? ? 1 : init_args[:min_age]
|
78
78
|
max_age = init_args[:max_age].nil? ? 99 : init_args[:max_age]
|
79
79
|
@date_of_birth = Faker::Date.birthday(min_age: min_age, max_age: max_age)
|
80
80
|
end
|
81
81
|
|
82
|
-
def define_race(
|
82
|
+
def define_race(init_args = {})
|
83
83
|
races_count = init_args[:race_count].nil? || init_args[:race_count] < 1 ? 1 : init_args[:race_count]
|
84
84
|
@races = []
|
85
85
|
while races_count.positive?
|
@@ -23,8 +23,9 @@ module HealthcarePhony
|
|
23
23
|
# or Ruby array. Otherwise this field is left blank.
|
24
24
|
# vip_indicator - Array of Patient Type codes (PV1.18) to randomly choose from. Specified as comma separated String
|
25
25
|
# or Ruby array. Otherwise this field is left blank.
|
26
|
-
|
27
|
-
|
26
|
+
# visit_type - VisitType of the patient's visit
|
27
|
+
def initialize(init_args = {})
|
28
|
+
@doctors = VisitDoctors.new(init_args)
|
28
29
|
@location = VisitLocation.new(init_args)
|
29
30
|
@admission = VisitAdmission.new(init_args)
|
30
31
|
@bed_status = define_bed_status(init_args)
|
@@ -40,7 +41,7 @@ module HealthcarePhony
|
|
40
41
|
|
41
42
|
private
|
42
43
|
|
43
|
-
def define_hospital_service(
|
44
|
+
def define_hospital_service(init_args = {})
|
44
45
|
standard_hospital_service = %w[CAR MED PUL SUR URO]
|
45
46
|
hs_choices = Helper.get_array(init_args[:hospital_service])
|
46
47
|
if !hs_choices.empty?
|
@@ -50,13 +51,13 @@ module HealthcarePhony
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
def define_patient_class(
|
54
|
+
def define_patient_class(init_args = {})
|
54
55
|
standard_pc_choices = %w[B C E I N O P R U]
|
55
56
|
pc_choices = Helper.get_array(init_args[:patient_class])
|
56
57
|
!pc_choices.empty? ? pc_choices.sample : standard_pc_choices.sample
|
57
58
|
end
|
58
59
|
|
59
|
-
def define_ambulatory_status(
|
60
|
+
def define_ambulatory_status(init_args = {})
|
60
61
|
standard_ambulatory_status = %w[A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B1 B2 B3 B4 B5 B6]
|
61
62
|
as_choices = Helper.get_array(init_args[:ambulatory_status])
|
62
63
|
if !as_choices.empty?
|
@@ -66,7 +67,7 @@ module HealthcarePhony
|
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
69
|
-
def define_bed_status(
|
70
|
+
def define_bed_status(init_args = {})
|
70
71
|
bs_choices = Helper.get_array(init_args[:bed_status])
|
71
72
|
if !bs_choices.empty?
|
72
73
|
bs_choices.sample
|
@@ -75,7 +76,7 @@ module HealthcarePhony
|
|
75
76
|
end
|
76
77
|
end
|
77
78
|
|
78
|
-
def define_patient_type(
|
79
|
+
def define_patient_type(init_args = {})
|
79
80
|
pt_choices = Helper.get_array(init_args[:patient_type])
|
80
81
|
if !pt_choices.empty?
|
81
82
|
pt_choices.sample
|
@@ -84,7 +85,7 @@ module HealthcarePhony
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
87
|
-
def define_vip(
|
88
|
+
def define_vip(init_args = {})
|
88
89
|
vip_choices = Helper.get_array(init_args[:vip_indicator])
|
89
90
|
if !vip_choices.empty?
|
90
91
|
vip_choices.sample
|
@@ -15,12 +15,12 @@ module HealthcarePhony
|
|
15
15
|
# gender - A Gender object which will be used to generate a Male or Female name if specified.
|
16
16
|
# degree_data_file - Location of YAML file containing a list of potential degrees to choose from. By default the
|
17
17
|
# gem supplied file will be used. The default file {degree.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/degree.yml].
|
18
|
-
def initialize(
|
18
|
+
def initialize(init_args = {})
|
19
19
|
@set_blank = !init_args[:blank].nil? && Helper.random_with_blank('X', init_args[:blank]) == ''
|
20
20
|
@gender = init_args[:gender]
|
21
21
|
@degree_data_file = get_degree_data_file(init_args)
|
22
|
-
@given_name = define_given_name
|
23
|
-
@family_name = define_family_name
|
22
|
+
@given_name = (init_args[:given_name_append].nil? ? '' : init_args[:given_name_append]) + define_given_name
|
23
|
+
@family_name = (init_args[:family_name_append].nil? ? '' : init_args[:family_name_append]) + define_family_name
|
24
24
|
@middle_name = define_middle_name
|
25
25
|
@suffix = define_suffix
|
26
26
|
@prefix = define_prefix
|
@@ -33,7 +33,7 @@ module HealthcarePhony
|
|
33
33
|
attr_accessor :set_blank
|
34
34
|
attr_accessor :degree_data_file
|
35
35
|
|
36
|
-
def get_degree_data_file(
|
36
|
+
def get_degree_data_file(init_args = {})
|
37
37
|
if !init_args[:degree_data_file].nil?
|
38
38
|
init_args[:degree_data_file]
|
39
39
|
else
|
@@ -85,7 +85,7 @@ module HealthcarePhony
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
def define_degree(
|
88
|
+
def define_degree(init_args = {})
|
89
89
|
if @set_blank
|
90
90
|
''
|
91
91
|
elsif !init_args[:degree].nil?
|
@@ -11,7 +11,7 @@ module HealthcarePhony
|
|
11
11
|
:use_code,
|
12
12
|
:equipment_type
|
13
13
|
|
14
|
-
def initialize(
|
14
|
+
def initialize(init_args = {})
|
15
15
|
# Public: Initializes a home phone number. Pass in hash of different parameters, currently this includes:
|
16
16
|
# blank - An integer representing the % of times phone number components should be blank.
|
17
17
|
# use_code_data_file - YAML file containing use codes to randomly choose from. If not specified then values from
|
@@ -6,10 +6,11 @@ module HealthcarePhony
|
|
6
6
|
attr_accessor :code,
|
7
7
|
:description,
|
8
8
|
:coding_system
|
9
|
+
|
9
10
|
# Public: Initializes an Address. Pass in hash of different parameters, currently this includes:
|
10
11
|
# race_data_file - Location of YAML file containing a list of potential degrees to choose from. By default the
|
11
12
|
# gem supplied file will be used. The default file {race.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/race.yml].
|
12
|
-
def initialize(
|
13
|
+
def initialize(init_args = {})
|
13
14
|
# TODO: allow a way for caller to pass in % blank
|
14
15
|
# TODO: set coding system
|
15
16
|
|
@@ -11,7 +11,7 @@ module HealthcarePhony
|
|
11
11
|
# religion_data_file - YAML file containing religion information to randomly choose from if different options than
|
12
12
|
# those that come with gem are desired. See {religion.yml}[https://github.com/austinmoody/healthcare_phony/blob/main/lib/healthcare_phony/data_files/religion.yml]
|
13
13
|
# for default values.
|
14
|
-
def initialize(
|
14
|
+
def initialize(init_args = {})
|
15
15
|
# TODO: allow a way for caller to pass in a custom set of codes to choose from
|
16
16
|
# TODO: allow a way for caller to pass in % blank
|
17
17
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
MSH|^~\&|<%= hl7.sending_application %>|<%= hl7.sending_facility %>|<%= hl7.receiving_application %>|<%= hl7.receiving_facility %>|<%= hl7.message_datetime.to_hl7datetime() %>||<%= hl7.message_type %>^<%= hl7.trigger_event %>|<%= hl7.message_control_id %>|<%= hl7.processing_id %>|<%= hl7.version %>
|
2
2
|
EVN|<%= hl7.trigger_event %>|<%= hl7.message_datetime.to_hl7datetime() %>
|
3
|
-
PID|||<%= patient.medical_record_number.identifier %>||<%= patient.names[0].family_name %>^<%= patient.names[0].given_name %>^<%= patient.names[0].middle_name%>^||<%= patient.date_of_birth.to_hl7date %>|<%= patient.gender.code %>||<%= patient.races[0].code %>|<%= patient.addresses[0].address_line1 %>^<%= patient.addresses[0].address_line2 %>^<%= patient.addresses[0].city %>^<%= patient.addresses[0].state %>^<%= patient.addresses[0].postal_code %>||(<%= patient.home_phone.area_code %>)<%= patient.home_phone.exchange_code %>-<%= patient.home_phone.subscriber_number %>~(<%= patient.cell_phone.area_code %>)<%= patient.cell_phone.exchange_code %>-<%= patient.cell_phone.subscriber_number %>|(<%= patient.work_phone.area_code %>)<%= patient.work_phone.exchange_code %>-<%= patient.work_phone.subscriber_number
|
4
|
-
PV1||<%= visit.patient_class %>
|
5
|
-
|
3
|
+
PID|||<%= patient.medical_record_number.identifier %>||<%= patient.names[0].family_name %>^<%= patient.names[0].given_name %>^<%= patient.names[0].middle_name%>^||<%= patient.date_of_birth.to_hl7date %>|<%= patient.gender.code %>||<%= patient.races[0].code %>|<%= patient.addresses[0].address_line1 %>^<%= patient.addresses[0].address_line2 %>^<%= patient.addresses[0].city %>^<%= patient.addresses[0].state %>^<%= patient.addresses[0].postal_code %>||(<%= patient.home_phone.area_code %>)<%= patient.home_phone.exchange_code %>-<%= patient.home_phone.subscriber_number %>~(<%= patient.cell_phone.area_code %>)<%= patient.cell_phone.exchange_code %>-<%= patient.cell_phone.subscriber_number %>|(<%= patient.work_phone.area_code %>)<%= patient.work_phone.exchange_code %>-<%= patient.work_phone.subscriber_number %>|<%= patient.language.code %>^<%= patient.language.description %>^<%= patient.language.coding_system %>|<%= patient.marital_status.code %>^<%= patient.marital_status.description %>^<%= patient.marital_status.coding_system %>|<%= patient.religion.code %>^<%= patient.religion.description %>^<%= patient.religion.coding_system %>|<%= patient.account_number.identifier %>|<%= patient.ssn %>
|
4
|
+
PV1||<%= visit.patient_class %>|<%= visit.location.point_of_care %>^<%= visit.location.room %>^<%= visit.location.bed %>^<%= visit.location.facility %>^<%= visit.location.status %>^<%= visit.location.type %>^<%= visit.location.building %>^<%= visit.location.floor %>^<%= visit.location.description %>|<%= visit.admission.type %>|||<%= visit.doctors.attending.identifier %>^<%= visit.doctors.attending.name.family_name %>^<%= visit.doctors.attending.name.given_name %>^<%= visit.doctors.attending.name.middle_name %>^<%= visit.doctors.attending.name.suffix %>^<%= visit.doctors.attending.name.prefix %>^<%= visit.doctors.attending.name.degree %>|<%= visit.doctors.referring.identifier %>^<%= visit.doctors.referring.name.family_name %>^<%= visit.doctors.referring.name.given_name %>^<%= visit.doctors.referring.name.middle_name %>^<%= visit.doctors.referring.name.suffix %>^<%= visit.doctors.referring.name.prefix %>^<%= visit.doctors.referring.name.degree %>|<%= visit.doctors.consulting.identifier %>^<%= visit.doctors.consulting.name.family_name %>^<%= visit.doctors.consulting.name.given_name %>^<%= visit.doctors.consulting.name.middle_name %>^<%= visit.doctors.consulting.name.suffix %>^<%= visit.doctors.consulting.name.prefix %>^<%= visit.doctors.consulting.name.degree %>|<%= visit.hospital_service %>|11|12|<%= visit.readmission_indicator %>|<%= visit.admission.source %>|15|16|<%= visit.doctors.admitting.identifier %>^<%= visit.doctors.admitting.name.family_name %>^<%= visit.doctors.admitting.name.given_name %>^<%= visit.doctors.admitting.name.middle_name %>^<%= visit.doctors.admitting.name.suffix %>^<%= visit.doctors.admitting.name.prefix %>^<%= visit.doctors.admitting.name.degree %>|<%= visit.patient_type %>|<%= visit.visit_number.identifier %>^^^^<%= visit.visit_number.identifier_type_code %>|||||||||||||||||<%= visit.discharge.disposition %>|<%= visit.discharge.location %>|38|39|40|41|42|43|<%= visit.admission.datetime.to_hl7datetime() %>|<%= visit.discharge.datetime.to_hl7datetime() %>
|
5
|
+
PV2|||^<%= visit.admission.reason %>
|
6
6
|
|
@@ -12,7 +12,7 @@ module HealthcarePhony
|
|
12
12
|
# Ruby array. Otherwise default HL7 v2.5.1. Table 0007 values are used.
|
13
13
|
# admit_reason - Array of values to use as Admit Reason (PV2.3) to randomly choose from. Specified as comma
|
14
14
|
# separated String or Ruby array. Otherwise a string of data is generated with Faker::Lorem.sentence
|
15
|
-
def initialize(
|
15
|
+
def initialize(init_args = {})
|
16
16
|
@source = define_source(init_args)
|
17
17
|
@type = define_type(init_args)
|
18
18
|
@datetime = Faker::Time.backward(days: Faker::Number.number(digits: 1))
|
@@ -21,7 +21,7 @@ module HealthcarePhony
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
-
def define_source(
|
24
|
+
def define_source(init_args = {})
|
25
25
|
standard_admit_source = '123456789'.split('')
|
26
26
|
as_choices = Helper.get_array(init_args[:admit_source])
|
27
27
|
if !as_choices.empty?
|
@@ -31,7 +31,7 @@ module HealthcarePhony
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
def define_type(
|
34
|
+
def define_type(init_args = {})
|
35
35
|
standard_admission_types = %w[A C E L N R U]
|
36
36
|
at_choices = Helper.get_array(init_args[:admission_type])
|
37
37
|
if !at_choices.empty?
|
@@ -41,7 +41,7 @@ module HealthcarePhony
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def define_reason(
|
44
|
+
def define_reason(init_args = {})
|
45
45
|
ar_choices = Helper.get_array(init_args[:admit_reason])
|
46
46
|
if !ar_choices.empty?
|
47
47
|
ar_choices.sample
|
@@ -8,14 +8,14 @@ module HealthcarePhony
|
|
8
8
|
:datetime
|
9
9
|
|
10
10
|
# Public: Initializes an EthnicGroup. Pass in hash of different parameters, currently this includes:
|
11
|
-
#
|
11
|
+
# visit_type - VisitType of this patient's visit
|
12
12
|
# discharge_disposition - Array of discharge disposition codes (PV1.36) to randomly choose from. Specified as comma
|
13
13
|
# separated String or Ruby array. Otherwise default HL7 v2.5.1 Table 0112 values are used.
|
14
14
|
# discharge_location - Array of discharge locations to randomly choose from. Specified as comma separated String or
|
15
15
|
# Ruby array. Otherwise a string of data is generated with Faker::Lorem.sentence
|
16
16
|
# admit_datetime - The admit date/time associated with this visit. If not specified the current date/time is used.
|
17
|
-
def initialize(
|
18
|
-
if init_args[:event_type] == 'A03'
|
17
|
+
def initialize(init_args = {})
|
18
|
+
if init_args[:visit_type] == HealthcarePhony::VisitType::DISCHARGE # init_args[:event_type] == 'A03'
|
19
19
|
@disposition = define_discharge_disposition(init_args)
|
20
20
|
@location = define_discharge_location(init_args)
|
21
21
|
@datetime = define_discharge_datetime(init_args)
|
@@ -28,9 +28,9 @@ module HealthcarePhony
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
def define_discharge_disposition(
|
31
|
+
def define_discharge_disposition(init_args = {})
|
32
32
|
dd_choices = Helper.get_array(init_args[:discharge_disposition])
|
33
|
-
if init_args[:event_type] != 'A03'
|
33
|
+
if init_args[:visit_type] != HealthcarePhony::VisitType::DISCHARGE # init_args[:event_type] != 'A03'
|
34
34
|
''
|
35
35
|
elsif !dd_choices.empty?
|
36
36
|
dd_choices.sample
|
@@ -41,7 +41,7 @@ module HealthcarePhony
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
def define_discharge_location(
|
44
|
+
def define_discharge_location(init_args = {})
|
45
45
|
dl_choices = Helper.get_array(init_args[:discharge_location])
|
46
46
|
if !dl_choices.empty?
|
47
47
|
dl_choices.sample
|
@@ -50,7 +50,7 @@ module HealthcarePhony
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
def define_discharge_datetime(
|
53
|
+
def define_discharge_datetime(init_args = {})
|
54
54
|
from_datetime = if init_args[:admit_datetime].nil?
|
55
55
|
Time.now
|
56
56
|
else
|
@@ -9,11 +9,11 @@ module HealthcarePhony
|
|
9
9
|
:consulting,
|
10
10
|
:admitting
|
11
11
|
|
12
|
-
def initialize
|
13
|
-
@attending = Doctor.new
|
14
|
-
@referring = Doctor.new
|
15
|
-
@consulting = Doctor.new
|
16
|
-
@admitting = Doctor.new
|
12
|
+
def initialize(init_args = {})
|
13
|
+
@attending = Doctor.new(init_args)
|
14
|
+
@referring = Doctor.new(init_args)
|
15
|
+
@consulting = Doctor.new(init_args)
|
16
|
+
@admitting = Doctor.new(init_args)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -32,7 +32,7 @@ module HealthcarePhony
|
|
32
32
|
# String or Ruby array. Otherwise a random 2 digit number is used.
|
33
33
|
# location_description - Array of potential location descriptions (PV1.3.9) to randomly choose from. Specified as
|
34
34
|
# a comma separated String or Ruby array. Otherwise a random string is generated.
|
35
|
-
def initialize(
|
35
|
+
def initialize(init_args = {})
|
36
36
|
@point_of_care = define_point_of_care(init_args)
|
37
37
|
@room = define_room(init_args)
|
38
38
|
@bed = define_bed(init_args)
|
@@ -46,12 +46,12 @@ module HealthcarePhony
|
|
46
46
|
|
47
47
|
private
|
48
48
|
|
49
|
-
def define_point_of_care(
|
49
|
+
def define_point_of_care(init_args = {})
|
50
50
|
poc_choices = Helper.get_array(init_args[:point_of_care])
|
51
51
|
!poc_choices.empty? ? poc_choices.sample : /[A-Z]{10}/.random_example
|
52
52
|
end
|
53
53
|
|
54
|
-
def define_room(
|
54
|
+
def define_room(init_args = {})
|
55
55
|
room_choices = Helper.get_array(init_args[:room])
|
56
56
|
if !room_choices.empty?
|
57
57
|
room_choices.sample
|
@@ -60,7 +60,7 @@ module HealthcarePhony
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
def define_bed(
|
63
|
+
def define_bed(init_args = {})
|
64
64
|
bed_choices = Helper.get_array(init_args[:bed])
|
65
65
|
if !bed_choices.empty?
|
66
66
|
bed_choices.sample
|
@@ -69,32 +69,32 @@ module HealthcarePhony
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
def define_facility(
|
72
|
+
def define_facility(init_args = {})
|
73
73
|
fac_choices = Helper.get_array(init_args[:facility])
|
74
74
|
!fac_choices.empty? ? fac_choices.sample : Faker::Lorem.sentence
|
75
75
|
end
|
76
76
|
|
77
|
-
def define_status(
|
77
|
+
def define_status(init_args = {})
|
78
78
|
ls_choices = Helper.get_array(init_args[:location_status])
|
79
79
|
!ls_choices.empty? ? ls_choices.sample : /[A-Z]/.random_example
|
80
80
|
end
|
81
81
|
|
82
|
-
def define_type(
|
82
|
+
def define_type(init_args = {})
|
83
83
|
plt_choices = Helper.get_array(init_args[:person_location_type])
|
84
84
|
!plt_choices.empty? ? plt_choices.sample : %w[C D H N O P S].sample
|
85
85
|
end
|
86
86
|
|
87
|
-
def define_building(
|
87
|
+
def define_building(init_args = {})
|
88
88
|
building_choices = Helper.get_array(init_args[:building])
|
89
89
|
!building_choices.empty? ? building_choices.sample : /[1-9]/.random_example
|
90
90
|
end
|
91
91
|
|
92
|
-
def define_floor(
|
92
|
+
def define_floor(init_args = {})
|
93
93
|
floor_choices = Helper.get_array(init_args[:floor])
|
94
94
|
!floor_choices.empty? ? floor_choices.sample : /[0-9]{2}/.random_example
|
95
95
|
end
|
96
96
|
|
97
|
-
def define_description(
|
97
|
+
def define_description(init_args = {})
|
98
98
|
ld_choices = Helper.get_array(init_args[:location_description])
|
99
99
|
if !ld_choices.empty?
|
100
100
|
ld_choices.sample
|
@@ -9,7 +9,7 @@ module HealthcarePhony
|
|
9
9
|
# blank - An integer representing the % of times phone number components should be blank.
|
10
10
|
# use_code - Allows specification of the phone use code (PID.13.2)
|
11
11
|
# equipment_type - Allows specification of the phone equipment type (PID.13.3)
|
12
|
-
def initialize(
|
12
|
+
def initialize(init_args = {})
|
13
13
|
super(init_args)
|
14
14
|
@use_code = init_args[:use_code].nil? ? 'WPN' : init_args[:use_code]
|
15
15
|
@use_code = '' unless @set_blank == false
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: healthcare_phony
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Austin Moody
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-01
|
11
|
+
date: 2021-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -113,6 +113,8 @@ files:
|
|
113
113
|
- README.md
|
114
114
|
- Rakefile
|
115
115
|
- VERSION
|
116
|
+
- examples/phony_adt_sender.rb
|
117
|
+
- examples/phony_adt_sender.yml
|
116
118
|
- healthcare_phony.gemspec
|
117
119
|
- lib/healthcare_phony.rb
|
118
120
|
- lib/healthcare_phony/address.rb
|
@@ -158,6 +160,7 @@ files:
|
|
158
160
|
- lib/healthcare_phony/visit_discharge.rb
|
159
161
|
- lib/healthcare_phony/visit_doctors.rb
|
160
162
|
- lib/healthcare_phony/visit_location.rb
|
163
|
+
- lib/healthcare_phony/visit_type.rb
|
161
164
|
- lib/healthcare_phony/work_phone_number.rb
|
162
165
|
homepage: http://github.com/austinmoody/healthcare_phony
|
163
166
|
licenses:
|