ez7gen 1.0.1

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.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/bin/ez7gen +6 -0
  3. data/lib/ez7gen.rb +23 -0
  4. data/lib/ez7gen/config/schema/2.4/2.4.HL7.xml +13904 -0
  5. data/lib/ez7gen/config/schema/2.4/VAZ2.4.HL7.xml +3085 -0
  6. data/lib/ez7gen/config/schema/2.4/added/coded-tables.xml +730 -0
  7. data/lib/ez7gen/config/schema/2.4/rules/2.4.HL7.yml +4 -0
  8. data/lib/ez7gen/config/schema/2.4/rules/VAZ2.4.HL7.yml +6 -0
  9. data/lib/ez7gen/config/schema/2.5/2.5.HL7.xml +10008 -0
  10. data/lib/ez7gen/config/schema/2.5/VAZ2.5.HL7.xml +7 -0
  11. data/lib/ez7gen/config/schema/2.5/added/coded-tables.xml +549 -0
  12. data/lib/ez7gen/config/schema/readme.txt +0 -0
  13. data/lib/ez7gen/config/templates/2.4/eiv table update-mfn_m01 20151201.xml +416 -0
  14. data/lib/ez7gen/config/templates/2.4/eiv table update-mfn_y01.xml +416 -0
  15. data/lib/ez7gen/config/templates/2.4/eiv-ec-MFN_X01_reg request 20160126.xml +659 -0
  16. data/lib/ez7gen/config/templates/2.4/examples/ADT_A60.txt +69 -0
  17. data/lib/ez7gen/config/templates/2.4/examples/eiv table update-mfn_m01 20151201.txt +21 -0
  18. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_dss_units-query_qbp_q13-qbp_q13.txt +26 -0
  19. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_ecs_procedures_query_qbp_q13-qbp_q13.txt +26 -0
  20. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_patient eligibility_response-rsp_k11-080714.txt +44 -0
  21. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_diagnosis_query_qbp_q11-qbp_q11.txt +21 -0
  22. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_diagnosis_response_rsp_k11-rsp_k11.txt +42 -0
  23. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_dss_units_response_rtb_k13-rtb_k13.txt +49 -0
  24. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_ecs_filer_request_dft_p03-dft_p03-080714.txt +31 -0
  25. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_ecs_filer_response_ack_p03-ack_p03.txt +21 -0
  26. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_esc_procedures_response_rtb_k13-rtb_k13.txt +40 -0
  27. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_patient_eclass_query_qbp_q11-qbp_q11.txt +21 -0
  28. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_patient_problems_query_qbp_q11-qbp_q11.txt +21 -0
  29. data/lib/ez7gen/config/templates/2.4/examples/mhvsm_standardhl7lib_patinet_problems_response_rsp_k11-rsp_k11.txt +33 -0
  30. data/lib/ez7gen/config/templates/2.4/examples/orur01rvbecv2.txt +31 -0
  31. data/lib/ez7gen/config/templates/2.4/examples/sqwm vitals-oru_ro1.txt +52 -0
  32. data/lib/ez7gen/config/templates/2.4/examples/vista sqwm-adt_a60.txt +40 -0
  33. data/lib/ez7gen/config/templates/2.4/mhvsm_dss_units_query_qbp_q13-qbp_q13.xml +312 -0
  34. data/lib/ez7gen/config/templates/2.4/mhvsm_ecs_procedures_query_qbp_q13-qbp_q13.xml +314 -0
  35. data/lib/ez7gen/config/templates/2.4/mhvsm_patient eligibility_response-rsp_k11-080714.xml +640 -0
  36. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_diagnosis_query_qbp_q11-qbp_q11.xml +284 -0
  37. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_diagnosis_response_rsp_k11-rsp_k11-rsp_k11.xml +563 -0
  38. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_dss_units_response_rtb_k13-rtb_k13-rtb_k13.xml +365 -0
  39. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_ecs_filer_request_dft_p03-dft_p03-080714.xml +2172 -0
  40. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_ecs_filer_response_ack_p03-ack_p03.xml +269 -0
  41. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_ecs_procedures_response_rtb_k13-rtb_k13-rtb_k13.xml +354 -0
  42. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_patient_eclass_query_qbp_q11-qbp_q11.xml +284 -0
  43. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_patient_problems_query_qbp_q11-qbp_q11.xml +282 -0
  44. data/lib/ez7gen/config/templates/2.4/mhvsm_standardhl7lib_patient_problems_response_rsp_k11-rsp_k11-rsp_k11.xml +565 -0
  45. data/lib/ez7gen/config/templates/2.4/orur01rvbecv2.xml +1529 -0
  46. data/lib/ez7gen/config/templates/2.4/sqwm vitals-oru_r01.xml +2975 -0
  47. data/lib/ez7gen/config/templates/2.4/vista sqwm-adt_a60.xml +1360 -0
  48. data/lib/ez7gen/message_factory.rb +142 -0
  49. data/lib/ez7gen/msg_error_handler.rb +33 -0
  50. data/lib/ez7gen/profile_parser.rb +321 -0
  51. data/lib/ez7gen/resources/properties-with-comments.yml +51 -0
  52. data/lib/ez7gen/resources/properties.yml +325 -0
  53. data/lib/ez7gen/service/2.4/dynamic_field_generator.rb +45 -0
  54. data/lib/ez7gen/service/2.4/field_generator.rb +1586 -0
  55. data/lib/ez7gen/service/2.5/field_generator.rb +75 -0
  56. data/lib/ez7gen/service/base_field_generator.rb +451 -0
  57. data/lib/ez7gen/service/segment_generator.rb +218 -0
  58. data/lib/ez7gen/service/segment_picker.rb +147 -0
  59. data/lib/ez7gen/service/template_generator.rb +213 -0
  60. data/lib/ez7gen/service/type_aware_field_generator.rb +1583 -0
  61. data/lib/ez7gen/service/utils.rb +75 -0
  62. data/lib/ez7gen/structure_parser.rb +331 -0
  63. data/lib/ez7gen/version.rb +38 -0
  64. data/test/Additional Tables with values_v1.1.txt +1653 -0
  65. data/test/added_shema_test.rb +143 -0
  66. data/test/app-tmp.rb +225 -0
  67. data/test/at.txt +1 -0
  68. data/test/backburner.zip +0 -0
  69. data/test/codes.txt +262 -0
  70. data/test/codes1.txt +1240 -0
  71. data/test/data_types_exploration_test.rb +213 -0
  72. data/test/dynamic_field_generated_test.rb +292 -0
  73. data/test/message_factory_24_custom_test.rb +648 -0
  74. data/test/message_factory_25_test.rb +50 -0
  75. data/test/message_factory_adm_test.rb +558 -0
  76. data/test/message_factory_gen_test.rb +63 -0
  77. data/test/message_factory_lab_test.rb +107 -0
  78. data/test/message_factory_pharm_test.rb +121 -0
  79. data/test/message_factory_template_24_test.rb +730 -0
  80. data/test/message_factory_test.rb +220 -0
  81. data/test/msg_error_handler_test.rb +59 -0
  82. data/test/profile_parser_test.rb +542 -0
  83. data/test/quick_run.rb +880 -0
  84. data/test/segment_generator_test.rb +656 -0
  85. data/test/segment_picker_test.rb +279 -0
  86. data/test/structrure_parser_test.rb +355 -0
  87. data/test/template_generator_test.rb +164 -0
  88. data/test/type_aware_field_generator_test.rb +582 -0
  89. data/test/utils_test.rb +97 -0
  90. metadata +215 -0
@@ -0,0 +1,213 @@
1
+ require 'test/unit'
2
+ require 'ox'
3
+ require 'set'
4
+
5
+ class DataTypesExploration < Test::Unit::TestCase
6
+
7
+ dynamic_types = ["DT", "DTN", "FT", "ID", "IS", "JCC", "MO", "MOP", "NM", "NR", "OCD", "PT", "QIP", "RI", "SCV", "SI", "SRT", "ST", "TM", "TN", "TS", "TX", "TXCHALLENGE", "UVC", "VR", "WVI", "WVS"]
8
+
9
+ def test_SN
10
+ snipet = "<Export>
11
+ <Document version='2.4'>
12
+ <Category>
13
+ <DataType name='SN' description='structured numeric'>
14
+ <DataSubType piece='1' description='comparator'datatype='ST' />
15
+ <DataSubType piece='2' description='num1' datatype='NM' />
16
+ <DataSubType piece='3' description='separator/suffix' datatype='ST' />
17
+ <DataSubType piece='4' description='num2' datatype='NM' />
18
+ </DataType>
19
+ </Category>
20
+ </Document>
21
+ </Export>"
22
+
23
+ xml = Ox.parse(snipet)
24
+ assert_not_nil (xml)
25
+ name = 'SN'
26
+ # dt = xml.Document.Category.locate('DataType').select{|it| it.attributes[:name] == 'SN' }.first
27
+ dt = xml.Document.Category.locate('DataType').select{|it| it.attributes[:name] == name}.first
28
+ p dt.attributes[:name]
29
+ dts = dt.locate('DataSubType')
30
+ p dts
31
+ values=[]
32
+ dts.each{|it|
33
+ values << it.attributes[:datatype]
34
+ }
35
+ values.join('~')
36
+ # p values
37
+ assert_equal ["ST", "NM", "ST", "NM"], values
38
+ end
39
+
40
+ def test_base_types_no_subtypes_dt
41
+ templatePath = File.path('test-config/schema/2.5/2.5.HL7.xml')
42
+ xml = Ox.parse(IO.read(templatePath))
43
+ assert_not_nil (xml)
44
+
45
+ # dt = xml.Export.Document.Category.DataType.locate('DataSubType').select{|it| it.nodes.size == 1}
46
+ dt = xml.Export.Document.Category.locate('DataType').select{|it| it.nodes.size == 1}
47
+ data_types = []
48
+ dt.each{ |it|
49
+ data_types << it.attributes[:name]
50
+ # p it
51
+ }
52
+ assert_equal 11, dt.size
53
+ # base_dt = ["DT", "FT", "ID", "IS", "NM", "SI", "ST", "TM", "TN", "TX"]
54
+ base_dt = ["DT", "DTM", "FT", "GTS", "ID", "IS", "NM", "SI", "ST", "TM", "TX"]
55
+
56
+ assert_equal base_dt, data_types
57
+
58
+ dt = xml.Export.Document.Category.locate('DataType')
59
+ # dt
60
+ # p dt.locate('DataSubType/@description')
61
+ # p dt.locate('DataSubType/@datatype').size
62
+
63
+ # data_types = []
64
+ dt.each{ |it|
65
+ if (it.locate('DataSubType/@description').size != it.locate('DataSubType/@datatype').size) then p it[:name] end
66
+ }
67
+ # "AD"
68
+ # "DT"
69
+ # "DTM"
70
+ # "FT"
71
+ # "GTS"
72
+ # "ID"
73
+ # "IS"
74
+ # "NM"
75
+ # "SI"
76
+ # "ST"
77
+ # "TM"
78
+ # "TX"
79
+
80
+ end
81
+
82
+
83
+ def test_base_types
84
+ templatePath = File.path('test-config/schema/2.4/2.4.HL7.xml')
85
+ xml = Ox.parse(IO.read(templatePath))
86
+ assert_not_nil (xml)
87
+
88
+ dt = xml.Export.Document.Category.locate('DataType').select{|it| it.nodes.size == 1}
89
+ data_types = []
90
+ dt.each{ |it|
91
+ data_types << it.attributes[:name]
92
+ }
93
+ assert_equal 10, dt.size
94
+ base_dt = ["DT", "FT", "ID", "IS", "NM", "SI", "ST", "TM", "TN", "TX"]
95
+ assert_equal base_dt, data_types
96
+
97
+ end
98
+
99
+ def test_base_types_2
100
+ base_dt = ["DT", "FT", "ID", "IS", "NM", "SI", "ST", "TM", "TN", "TX"]
101
+ templatePath = File.path('test-config/schema/2.4/2.4.HL7.xml')
102
+ xml = Ox.parse(IO.read(templatePath))
103
+ assert_not_nil (xml)
104
+
105
+ dt = xml.Export.Document.Category.locate('DataType').select{|it| it.nodes.size == 2}
106
+ data_types = []
107
+ cnt=0
108
+ base_dt2 =[]
109
+ dt.each{ |it|
110
+ data_types << it.attributes[:name]
111
+ puts it.attributes[:name]
112
+ puts '+++++'
113
+ t = it.locate('DataSubType/@datatype')
114
+ ct = it.locate('DataSubType/@codetable')
115
+ h = Hash[t.zip(ct)]
116
+ puts h
117
+ # delta = t - base_dt
118
+ if ((t - base_dt).empty?) then puts 'All'; base_dt2 << it.attributes[:name] end
119
+ puts '~~~~~~~~~~~~~~~~~~~~~~~~~~'
120
+ }
121
+ assert_equal 25, dt.size
122
+ assert_equal 17,base_dt2.size
123
+ expected = ["CCD", "CQ", "DIN", "DLD", "DR", "DTN", "EIP", "FC", "JCC", "MO", "MOC", "MOP", "NR", "OCD", "PT", "QIP", "RI", "SCV", "SRT", "TS", "TXCHALLENGE", "UVC", "VR", "WVI", "WVS"]
124
+ assert_equal expected, data_types.sort()
125
+ bdt = (base_dt + base_dt2).sort
126
+ assert_equal 27, bdt.size
127
+
128
+ dt.each{ |it|
129
+ data_types << it.attributes[:name]
130
+ t = it.locate('DataSubType/@datatype')
131
+ if ((t - base_dt).empty?) then bdt << it.attributes[:name] end
132
+ }
133
+ # bdt = (base_dt + base_dt2).sort
134
+ assert_equal 27, bdt.to_set.size
135
+
136
+ end
137
+
138
+ def test_dynamic_base_dt
139
+ # base_dt = ["DT", "FT", "ID", "IS", "NM", "SI", "ST", "TM", "TN", "TX"]
140
+
141
+ templatePath = File.path('test-config/schema/2.4/2.4.HL7.xml')
142
+ xml = Ox.parse(IO.read(templatePath))
143
+ assert_not_nil (xml)
144
+
145
+ sub_comp_cnt = 1
146
+ # total = -1
147
+ bdt =[]
148
+ x = []
149
+ while sub_comp_cnt < 20 do
150
+ dt = xml.Export.Document.Category.locate('DataType').select{|it| it.nodes.size == sub_comp_cnt}
151
+ # total = -1
152
+ if( dt.empty?)
153
+ sub_comp_cnt +=1
154
+ next
155
+ end
156
+ st_count = bdt.size
157
+ end_count = -1
158
+
159
+ while st_count != end_count do
160
+ st_count = end_count
161
+ dt.each{ |it|
162
+ t = it.attributes[:name]
163
+ st = it.locate('DataSubType/@datatype')
164
+ # if (!st.empty? && (st - bdt).empty?)
165
+ if ((st - bdt).empty?)
166
+ # bdt << t unless bdt.include?(t)
167
+ if(!bdt.include?(t))
168
+ bdt << t
169
+ end
170
+ elsif !x.include?(t)
171
+ x << t
172
+ end
173
+
174
+ }
175
+ end_count = bdt.size
176
+
177
+ end
178
+
179
+ sub_comp_cnt+=1
180
+ end
181
+ p bdt.sort
182
+ p bdt.size
183
+
184
+ p x.sort
185
+ p x.size
186
+
187
+ unresolved = x - bdt
188
+ p unresolved.sort
189
+ p unresolved.size
190
+ # 81 ["AD", "AUI", "CCD", "CCP", "CE", "CE013602620263", "CF", "CK", "CN", "CNE", "CNN", "CP", "CSU", "CWE", "CX", "DDI", "DLD", "DLN", "DLT", "DR", "DT", "DTN", "ED", "EI", "FC", "FN", "FT", "HD", "ID", "IS", "JCC", "LA1", "LA2", "MA", "MO", "MOP", "MSG", "NA", "NDL", "NM", "NR", "OCD", "OSD", "PCF", "PI", "PL", "PLN", "PN", "PPN", "PT", "PTA", "QIP", "QSC", "RCD", "RFR", "RI", "RMC", "RP", "SAD", "SCV", "SI", "SN", "SPD", "SPS", "SRT", "ST", "TM", "TN", "TS", "TX", "TXCHALLENGE", "UVC", "VH", "VR", "WVI", "WVS", "XAD", "XCN", "XON", "XPN", "XTN"]
191
+
192
+ #11 ["CD", "CQ", "DIN", "EIP", "ELD", "MOC", "OSP", "PIP", "PRL", "TQ", "VID"]
193
+
194
+
195
+ end
196
+
197
+ def test_all_datatypes
198
+
199
+ templatePath = File.path('test-config/schema/2.4/2.4.HL7.xml')
200
+ xml = Ox.parse(IO.read(templatePath))
201
+ assert_not_nil (xml)
202
+ data_types = []
203
+ dt = xml.Export.Document.Category.locate('DataType')
204
+ dt.each{ |it|
205
+ data_types << it.attributes[:name]
206
+ }
207
+ assert_equal 92, dt.size
208
+ p data_types.sort()
209
+ expected = ["AD", "AUI", "CCD", "CCP", "CD", "CE", "CE013602620263", "CF", "CK", "CN", "CNE", "CNN", "CP", "CQ", "CSU", "CWE", "CX", "DDI", "DIN", "DLD", "DLN", "DLT", "DR", "DT", "DTN", "ED", "EI", "EIP", "ELD", "FC", "FN", "FT", "HD", "ID", "IS", "JCC", "LA1", "LA2", "MA", "MO", "MOC", "MOP", "MSG", "NA", "NDL", "NM", "NR", "OCD", "OSD", "OSP", "PCF", "PI", "PIP", "PL", "PLN", "PN", "PPN", "PRL", "PT", "PTA", "QIP", "QSC", "RCD", "RFR", "RI", "RMC", "RP", "SAD", "SCV", "SI", "SN", "SPD", "SPS", "SRT", "ST", "TM", "TN", "TQ", "TS", "TX", "TXCHALLENGE", "UVC", "VH", "VID", "VR", "WVI", "WVS", "XAD", "XCN", "XON", "XPN", "XTN"]
210
+ assert_equal expected, data_types.sort()
211
+ end
212
+
213
+ end
@@ -0,0 +1,292 @@
1
+ require 'test/unit'
2
+ require 'ox'
3
+ require 'set'
4
+ require_relative '../lib/ez7gen/service/2.4/dynamic_field_generator'
5
+
6
+ class DynamicFieldGeneratorTest < Test::Unit::TestCase
7
+
8
+ # 27
9
+ vs =
10
+ [
11
+ {:std=>"2.4", :path=>"../test/test-config/schema/2.4", :profiles=>[{:doc=>"2.4.HL7", :name=>"2.4", :std=>"1", :path=>"../test/test-config/schema/2.4/2.4.HL7.xml"}, {:doc=>"VAZ2.4.HL7", :name=>"VAZ2.4", :description=>"2.4 schema with VA defined tables and Z segments", :base=>"2.4", :path=>"../test/test-config/schema/2.4/VAZ2.4.HL7.xml.bkp"}]},
12
+ {:std=>"2.5", :path=>"../test/test-config/schema/2.5", :profiles=>[{:doc=>"2.5.HL7", :name=>"2.5", :std=>"1", :path=>"../test/test-config/schema/2.5/2.5.HL7.xml"}, {:doc=>"TEST2.5.HL7", :name=>"TEST2.5", :description=>"2.5 mockup schema for testing", :base=>"2.4", :path=>"../test/test-config/schema/2.5/VAZ2.5.HL7.xml"}]}
13
+ ]
14
+ attrs = {std: '2.4', version: '2.4.HL7', event: 'ADT_A01', version_store: vs}
15
+
16
+ #parse xml once
17
+ @@pp = ProfileParser.new(attrs)
18
+
19
+ #helper method
20
+ def lineToHash(line)
21
+ hash = line.gsub(/(\[|\])/,'').gsub(':',',').split(',').map{|it| it.strip()}.each_slice(2).to_a.to_h
22
+ return Hash[hash.map{|(k,v)| [k.to_sym,v]}]
23
+
24
+ end
25
+
26
+ def setup
27
+ @fldGenerator = DynamicFieldGenerator.new(@@pp)
28
+
29
+ end
30
+
31
+ def teardown
32
+ @fieldGenerator = nil
33
+ end
34
+
35
+ def test_init
36
+ assert_equal 'Odysseus', @fldGenerator.yml['person.names.first'][0]
37
+ end
38
+
39
+ def test_base_types
40
+
41
+ dt = @fldGenerator.DT({},true)
42
+ p dt
43
+ assert_not_nil dt
44
+
45
+ dt = @fldGenerator.FT({},true)
46
+ p dt
47
+ assert_not_nil dt
48
+
49
+ dt = @fldGenerator.ID({},true)
50
+ p dt
51
+ assert_not_nil dt
52
+
53
+ dt = @fldGenerator.IS({},true)
54
+ p dt
55
+ assert_not_nil dt
56
+
57
+ dt = @fldGenerator.NM({},true)
58
+ p dt
59
+ assert_not_nil dt
60
+
61
+ dt = @fldGenerator.SI({},true)
62
+ p dt
63
+ assert_not_nil dt
64
+
65
+ dt = @fldGenerator.ST({},true)
66
+ p dt
67
+ assert_not_nil dt
68
+
69
+ dt = @fldGenerator.SAD({},true)
70
+ assert_not_nil dt
71
+
72
+ dt = @fldGenerator.TM({},true)
73
+ p dt
74
+ assert_not_nil dt
75
+
76
+ dt = @fldGenerator.TN({},true)
77
+ p dt
78
+ assert_not_nil dt
79
+
80
+ dt = @fldGenerator.TX({},true)
81
+ p dt
82
+ assert_not_nil dt
83
+ end
84
+
85
+ def test_property_types
86
+ dt = @fldGenerator.FN({},true)
87
+ p dt
88
+ assert_not_nil dt
89
+ end
90
+
91
+ # <DataType name='FN' description='familiy name'>
92
+ # <DataSubType piece='1' description='surname' datatype='ST' />
93
+ # <DataSubType piece='2' description='own surname prefix' datatype='ST' />
94
+ # <DataSubType piece='3' description='own surname' datatype='ST' />
95
+ # <DataSubType piece='4' description='surname prefix from partner/spouse' datatype='ST' />
96
+ # <DataSubType piece='5' description='surname from partner/spouse' datatype='ST' />
97
+ # </DataType>
98
+
99
+
100
+ def test_dynamic_SN
101
+ #2.4
102
+ # <DataType name='SN' description='structured numeric'>
103
+ # <DataSubType piece='1' description='comparator'datatype='ST' />
104
+ # <DataSubType piece='2' description='num1' datatype='NM' />
105
+ # <DataSubType piece='3' description='separator/suffix' datatype='ST' />
106
+ # <DataSubType piece='4' description='num2' datatype='NM' />
107
+ # </DataType>
108
+
109
+ #2.5
110
+ # <DataType name='SN' description='Structured Numeric'>
111
+ # <DataSubType piece='1' description='Comparator' datatype='ST' max_length='2' required='O'/>
112
+ # <DataSubType piece='2' description='Num1' datatype='NM' max_length='15' required='O'/>
113
+ # <DataSubType piece='3' description='Separator/Suffix' datatype='ST' max_length='1' required='O'/>
114
+ # <DataSubType piece='4' description='Num2' datatype='NM' max_length='15' required='O'/>
115
+ # </DataType>
116
+ dt = @fldGenerator.dynamic('SN',{},true)
117
+ p dt
118
+ end
119
+
120
+ def test_dynamic_CE
121
+ # <DataType name='CE' description='coded element'>
122
+ # <DataSubType piece='1' description='identifier (ST)' datatype='ST' />
123
+ # <DataSubType piece='2' description='text' datatype='ST' />
124
+ # <DataSubType piece='3' description='name of coding system' datatype='IS' codetable='396' />
125
+ # <DataSubType piece='4' description='alternate identifier (ST)' datatype='ST' />
126
+ # <DataSubType piece='5' description='alternate text' datatype='ST' />
127
+ # <DataSubType piece='6' description='name of alternate coding system' datatype='IS' codetable='396' />
128
+ # </DataType>
129
+ dt = @fldGenerator.dynamic('CE',{},true)
130
+ p dt
131
+ end
132
+
133
+ def test_dynamic_XPN
134
+ # <DataType name='XPN' description='extended person name'>
135
+ # <DataSubType piece='1' description='family name' datatype='FN' />
136
+ # <DataSubType piece='2' description='given name' datatype='ST' />
137
+ # <DataSubType piece='3' description='second and further given names or initials thereof' datatype='ST' />
138
+ # <DataSubType piece='4' description='suffix (e.g., JR or III)' datatype='ST' />
139
+ # <DataSubType piece='5' description='prefix (e.g., DR)' datatype='ST' />
140
+ # <DataSubType piece='6' description='degree (e.g., MD)' datatype='IS' codetable='360' />
141
+ # <DataSubType piece='7' description='name type code' datatype='ID' codetable='200' />
142
+ # <DataSubType piece='8' description='Name Representation code' datatype='ID' codetable='465' />
143
+ # <DataSubType piece='9' description='name context' datatype='CE' codetable='448' />
144
+ # <DataSubType piece='10' description='name validity range' datatype='DR' />
145
+ # <DataSubType piece='11' description='name assembly order' datatype='ID' codetable='444' />
146
+ # </DataType>
147
+ dt = @fldGenerator.dynamic('XPN',{},true)
148
+ p dt
149
+ end
150
+
151
+
152
+ def _test_dynamic_PID
153
+ pid = [
154
+ {:Name=>"Patient Identifier List", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CX", :Length=>"250", :ItemNo=>"00106", :Pos=>2, :components=>[{:Name=>"ID", :Usage=>"R", :Datatype=>"ST", :Length=>"60", :Pos=>0}, {:Name=>"code identifying the check digit scheme employed", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0061", :Pos=>2}, {:Name=>"assigning authority", :Usage=>"R", :Datatype=>"HD", :Length=>"8", :Pos=>3, :subComponents=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"5", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"1", :Table=>"0301", :Pos=>2}]}, {:Name=>"identifier type code (ID)", :Usage=>"R", :Datatype=>"ID", :Length=>"2", :Table=>"0203", :Pos=>4}]},
155
+ {:Name=>"Patient Name", :Usage=>"R", :Min=>"1", :Max=>"*", :Datatype=>"XPN", :Length=>"250", :ItemNo=>"00108", :Pos=>4, :components=>[{:Name=>"family name", :Usage=>"R", :Datatype=>"FN", :Length=>"60", :Pos=>0, :subComponents=>[{:Name=>"surname", :Usage=>"R", :Datatype=>"ST", :Length=>"35", :Pos=>0}]}, {:Name=>"given name", :Usage=>"R", :Datatype=>"ST", :Length=>"25", :Pos=>1}]},
156
+ {:Name=>"Date/Time Of Birth", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :ItemNo=>"00110", :Pos=>6, :components=>[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"20", :Pos=>0}]},
157
+ {:Name=>"Administrative Sex", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"IS", :Length=>"1", :Table=>"0001", :ItemNo=>"00111", :Pos=>7}
158
+ ]
159
+
160
+ #Patient Identifier List"
161
+ pil = [
162
+ {:Name=>"Patient Identifier List", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CX", :Length=>"250", :ItemNo=>"00106", :Pos=>2,
163
+ :components=>[
164
+ {:Name=>"ID", :Usage=>"R", :Datatype=>"ST", :Length=>"60", :Pos=>0},
165
+ {:Name=>"code identifying the check digit scheme employed", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0061", :Pos=>2},
166
+ {:Name=>"assigning authority", :Usage=>"R", :Datatype=>"HD", :Length=>"8", :Pos=>3,
167
+ :subComponents=>[
168
+ {:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"5", :Table=>"0363", :Pos=>0},
169
+ {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Table=>"0301", :Pos=>2} #:Length=>"1"
170
+ ]
171
+ },
172
+ {:Name=>"identifier type code (ID)", :Usage=>"R", :Datatype=>"ID", :Length=>"2", :Table=>"0203", :Pos=>4}]}
173
+ ]
174
+
175
+ aa = [ {:Name=>"assigning authority", :Usage=>"R", :Datatype=>"HD", :Length=>"8", :Pos=>3,
176
+ :subComponents=>[
177
+ {:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"5", :Table=>"0363", :Pos=>0},
178
+ {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Table=>"0301", :Pos=>2} #:Length=>"1"
179
+ ]
180
+ }]
181
+
182
+ #CANAB&&ISO&&HC : CANAB & &ISO & &HC
183
+ #MWB
184
+ #CANON&&UUID: CANON & &UUID
185
+ #CANON&&UUID
186
+ # 12345^4^NPI^CANPE&&GUID^MA^^20140325
187
+ # 12345 <Component Name="ID" Usage="R" Datatype="ST" Length="60"
188
+ # 4 <Component Name="Check digit" Usage="RE" Datatype="ST" Length="1"
189
+ # NPI Component Name="code identifying the check digit scheme employed" Usage="R" Datatype="ID" Length="3" Table="0061"
190
+ # CANPE&&GUID <Component Name="assigning authority" Usage="R" Datatype="HD" Length="8 : NOTE: length 11
191
+ # CANPE <SubComponent Name="namespace ID" Usage="R" Datatype="IS" Length="5" Table="0363"
192
+ # '' <SubComponent Name="universal ID" Usage="X" Datatype="ST"> NOTE: blank Usage X
193
+ # GUID <SubComponent Name="universal ID type" Usage="R" Datatype="ID" Length="1" Table="0301"
194
+
195
+ pn =[{:Name=>"Patient Name", :Usage=>"R", :Min=>"1", :Max=>"*", :Datatype=>"XPN", :Length=>"250", :ItemNo=>"00108", :Pos=>4, :components=>[{:Name=>"family name", :Usage=>"R", :Datatype=>"FN", :Length=>"60", :Pos=>0, :subComponents=>[{:Name=>"surname", :Usage=>"R", :Datatype=>"ST", :Length=>"35", :Pos=>0}]}, {:Name=>"given name", :Usage=>"R", :Datatype=>"ST", :Length=>"25", :Pos=>1}]}]
196
+
197
+ # PID with R and RE
198
+ pid_re = [{:Name=>"Patient Identifier List", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CX", :Length=>"250", :ItemNo=>"00106", :Pos=>2, :components=>[{:Name=>"ID", :Usage=>"R", :Datatype=>"ST", :Length=>"60", :Pos=>0}, {:Name=>"Check digit", :Usage=>"RE", :Datatype=>"ST", :Length=>"1", :Pos=>1}, {:Name=>"code identifying the check digit scheme employed", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0061", :Pos=>2}, {:Name=>"assigning authority", :Usage=>"R", :Datatype=>"HD", :Length=>"8", :Pos=>3, :subComponents=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"5", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"1", :Table=>"0301", :Pos=>2}]}, {:Name=>"identifier type code (ID)", :Usage=>"R", :Datatype=>"ID", :Length=>"2", :Table=>"0203", :Pos=>4}, {:Name=>"assigning facility", :Usage=>"RE", :Datatype=>"HD", :Length=>"14", :Pos=>5, :subComponents=>[{:Name=>"namespace ID", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0363", :Pos=>0}]}, {:Name=>"effective date (DT)", :Usage=>"RE", :Datatype=>"DT", :Length=>"8", :Pos=>6}]},
199
+ {:Name=>"Patient Name", :Usage=>"R", :Min=>"1", :Max=>"*", :Datatype=>"XPN", :Length=>"250", :ItemNo=>"00108", :Pos=>4, :components=>[{:Name=>"family name", :Usage=>"R", :Datatype=>"FN", :Length=>"60", :Pos=>0, :subComponents=>[{:Name=>"surname", :Usage=>"R", :Datatype=>"ST", :Length=>"35", :Pos=>0}]}, {:Name=>"given name", :Usage=>"R", :Datatype=>"ST", :Length=>"25", :Pos=>1}, {:Name=>"second and further given names or initials thereof", :Usage=>"RE", :Datatype=>"ST", :Length=>"25", :Pos=>2}]},
200
+ {:Name=>"Date/Time Of Birth", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :ItemNo=>"00110", :Pos=>6, :components=>[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"20", :Pos=>0}]},
201
+ {:Name=>"Administrative Sex", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"IS", :Length=>"1", :Table=>"0001", :ItemNo=>"00111", :Pos=>7},
202
+ {:Name=>"Race", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0005", :ItemNo=>"00113", :Pos=>9, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"10", :Table=>"0005", :Pos=>0}, {:Name=>"name of coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0396", :Pos=>2}, {:Name=>"alternate identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"6", :Pos=>3}, {:Name=>"name of alternate coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"3", :Table=>"0396", :Pos=>5}]},
203
+ {:Name=>"Patient Address", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"XAD", :Length=>"250", :ItemNo=>"00114", :Pos=>10, :components=>[{:Name=>"street address (SAD)", :Usage=>"RE", :Datatype=>"SAD", :Length=>"49", :Pos=>0, :subComponents=>[{:Name=>"street or mailing address", :Usage=>"RE", :Datatype=>"ST", :Length=>"35", :Pos=>0}]}, {:Name=>"city", :Usage=>"RE", :Datatype=>"ST", :Length=>"15", :Pos=>2}, {:Name=>"state or province", :Usage=>"RE", :Datatype=>"ST", :Length=>"5", :Pos=>3}, {:Name=>"zip or postal code", :Usage=>"RE", :Datatype=>"ST", :Length=>"5", :Pos=>4}]},
204
+ {:Name=>"Marital Status", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0002", :ItemNo=>"00119", :Pos=>15, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"1", :Table=>"0002", :Pos=>0}]},
205
+ {:Name=>"Religion", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0006", :ItemNo=>"00120", :Pos=>16, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"2", :Table=>"0006", :Pos=>0}]},
206
+ {:Name=>"Ethnic Group", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0189", :ItemNo=>"00125", :Pos=>21, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"10", :Table=>"0189", :Pos=>0}, {:Name=>"name of coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0396", :Pos=>2}, {:Name=>"alternate identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"6", :Pos=>3}, {:Name=>"name of alternate coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0396", :Pos=>5}]}]
207
+
208
+
209
+ flds = []
210
+ pid_re.each{|f|
211
+ dt_partials = []
212
+ dt_partials << process_partials(f)
213
+ flds[f[:Pos].to_i] = dt_partials.join('^')
214
+ puts f.to_s
215
+ # puts flds
216
+ puts flds.last
217
+ }
218
+ puts flds.join('|')
219
+
220
+ # AETNA18^^M11^CANON&&UUID^VA-EDI^CANYT
221
+ # "834^^ISO^CANYT&&^PI"
222
+
223
+ # PID|||607^1^M11^CANMB&&^AN^CANQC^20150615||Harper^Octavius^Stewart||2016-03-25T20:17:16-10:00|F||2106-3^^I9C^497^^ICS|359^^466^150^366|||||W||||||N^^E7^675^^CAS
224
+ # PID|||AETNA18^ ^M11^CANON&&UUID^VA-EDI^CANYT||HL7PFSSZELSURNAME^HL7ZPDFIRSTNAME||199901101410|F||2028-9^^^CST^^MVX|^^BROOKSVILLE^^38221|||||W|REC|||||^^DCL^NDC^^ACR
225
+
226
+ # PID|||607 ^1^M11^CANMB&& ^AN ^CANQC^20150615||Harper ^Octavius ^Stewart||2016-03-25T20:17:16-10:00|F||2106-3^^I9C^497^^ICS|359^^466^150^366 |||||W| |||||N^^E7^675^^CAS
227
+ # PID|||AETNA18^ ^M11^CANON&&UUID^VA-EDI^CANYT ||HL7PFSSZELSURNAME^HL7ZPDFIRSTNAME ||199901101410 |F||2028-9^^^CST^^MVX |^^BROOKSVILLE^^38221|||||W|REC|||||^^DCL^NDC^^ACR
228
+ # |9999999^4^M11^CANAB&&x400^PEN ^AUSHIC^20140325
229
+
230
+ # PID|1||211||Farrell^Castor^X|Meyer^Octavius^G|19751028175300.644|||2106-3^White|7061 Iron Blossom Ridge^^Owl^MS^38889-6760^USA||(601)110-8688||||SOU^Christian: Southern Baptist|468|||||620||||||20160320175300.676|N||||562||||
231
+ # PID|||607^1^M11^CANMB&&^AN^CANQC^20150615||Harper^Octavius^Stewart||2016-03-25T20:17:16-10:00|F||2106-3^^I9C^497^^ICS|359^^466^150^366|||||W||||||N^^E7^675^^CAS
232
+
233
+ end
234
+
235
+ def _test_dynamic_MSH
236
+ msh = [
237
+ {:Name=>"Field Separator", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ST", :Length=>"1", :ItemNo=>"00001", :Pos=>0},
238
+ {:Name=>"Encoding Characters", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ST", :Length=>"4", :ItemNo=>"00002", :Pos=>1},
239
+ {:Name=>"Sending Application", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0361", :ItemNo=>"00003", :Pos=>2, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"120", :Table=>"0363", :Pos=>0}]},
240
+ {:Name=>"Sending Facility", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0362", :ItemNo=>"00004", :Pos=>3, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"3", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID", :Usage=>"R", :Datatype=>"ST", :Length=>"120", :Pos=>1}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0301", :Pos=>2}]},
241
+ {:Name=>"Receiving Application", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0361", :ItemNo=>"00005", :Pos=>4, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"120", :Table=>"0363", :Pos=>0}]},
242
+ {:Name=>"Receiving Facility", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0362", :ItemNo=>"00006", :Pos=>5, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"3", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID", :Usage=>"R", :Datatype=>"ST", :Length=>"120", :Pos=>1}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0301", :Pos=>2}]},
243
+ {:Name=>"Date/Time Of Message", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :Pos=>6, :components=>[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"26", :Pos=>0}]},
244
+ {:Name=>"Message Type", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CM_MSG", :Length=>"15", :Table=>"0076", :ItemNo=>"00009", :Pos=>8, :components=>[{:Name=>"message type", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0076", :Pos=>0}, {:Name=>"trigger event", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0003", :Pos=>1}, {:Name=>"message structure", :Usage=>"R", :Datatype=>"ID", :Length=>"7", :Table=>"0354", :Pos=>2}]},
245
+ {:Name=>"Message Control ID", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ST", :Length=>"20", :ItemNo=>"00010", :Pos=>9},
246
+ {:Name=>"Processing ID", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"PT", :Length=>"7", :ItemNo=>"00011", :Pos=>10, :components=>[{:Name=>"processing ID", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0103", :Pos=>0}]},
247
+ {:Name=>"Version ID", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"VID", :Length=>"60", :Table=>"0104", :ItemNo=>"00012", :Pos=>11, :components=>[{:Name=>"version ID", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0104", :Pos=>0}]},
248
+ {:Name=>"Accept Acknowledgment Type", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ID", :Length=>"2", :Table=>"0155", :ItemNo=>"00015", :Pos=>14},
249
+ {:Name=>"Application Acknowledgment Type", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ID", :Length=>"2", :Table=>"0155", :ItemNo=>"00016", :Pos=>15}
250
+ ]
251
+ # MSH|9|117|CANMB|^861^DNS|CANBC|^477^DNS|2016-01-30T15:36:08-10:00||RTB^P02^MFN_M01|741|P|2.1|||ER|ER
252
+ # MSH|^~\&|VISTA SQWM|442^HL7.CHEYENNE.MED.VA.GOV:5274^DNS|SQWM|442^VAAUSSQWAPP80:8010^DNS|20160520160008.812-0400||ADT^A60^ADT_A60|B9D3F122897A4707|T|2.4|||AL|NE
253
+
254
+ flds = []
255
+
256
+ msh.each{|f|
257
+ dt_partials = []
258
+ dt_partials << process_partials(f)
259
+ flds[f[:Pos].to_i] = dt_partials.join('^')
260
+ }
261
+ puts flds.join('|')
262
+
263
+ end
264
+
265
+ def _test_dymamic_ADT_60
266
+
267
+ adt_60 = {"MSH"=>[{:Name=>"Field Separator", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ST", :Length=>"1", :ItemNo=>"00001", :Pos=>0}, {:Name=>"Encoding Characters", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ST", :Length=>"4", :ItemNo=>"00002", :Pos=>1}, {:Name=>"Sending Application", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0361", :ItemNo=>"00003", :Pos=>2, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"120", :Table=>"0363", :Pos=>0}]}, {:Name=>"Sending Facility", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0362", :ItemNo=>"00004", :Pos=>3, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"3", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID", :Usage=>"R", :Datatype=>"ST", :Length=>"120", :Pos=>1}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0301", :Pos=>2}]}, {:Name=>"Receiving Application", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0361", :ItemNo=>"00005", :Pos=>4, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"120", :Table=>"0363", :Pos=>0}]}, {:Name=>"Receiving Facility", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"HD", :Length=>"180", :Table=>"0362", :ItemNo=>"00006", :Pos=>5, :components=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"3", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID", :Usage=>"R", :Datatype=>"ST", :Length=>"120", :Pos=>1}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0301", :Pos=>2}]}, {:Name=>"Date/Time Of Message", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :Pos=>6, :components=>[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"26", :Pos=>0}]}, {:Name=>"Message Type", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CM_MSG", :Length=>"15", :Table=>"0076", :ItemNo=>"00009", :Pos=>8, :components=>[{:Name=>"message type", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0076", :Pos=>0}, {:Name=>"trigger event", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0003", :Pos=>1}, {:Name=>"message structure", :Usage=>"R", :Datatype=>"ID", :Length=>"7", :Table=>"0354", :Pos=>2}]}, {:Name=>"Message Control ID", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ST", :Length=>"20", :ItemNo=>"00010", :Pos=>9}, {:Name=>"Processing ID", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"PT", :Length=>"7", :ItemNo=>"00011", :Pos=>10, :components=>[{:Name=>"processing ID", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0103", :Pos=>0}]}, {:Name=>"Version ID", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"VID", :Length=>"60", :Table=>"0104", :ItemNo=>"00012", :Pos=>11, :components=>[{:Name=>"version ID", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0104", :Pos=>0}]}, {:Name=>"Accept Acknowledgment Type", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ID", :Length=>"2", :Table=>"0155", :ItemNo=>"00015", :Pos=>14}, {:Name=>"Application Acknowledgment Type", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"ID", :Length=>"2", :Table=>"0155", :ItemNo=>"00016", :Pos=>15}], "EVN"=>[{:Name=>"Recorded Date/Time", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :ItemNo=>"00100", :Pos=>1, :components=>[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"20", :Pos=>0}]}], "PID"=>[{:Name=>"Patient Identifier List", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CX", :Length=>"250", :ItemNo=>"00106", :Pos=>2, :components=>[{:Name=>"ID", :Usage=>"R", :Datatype=>"ST", :Length=>"60", :Pos=>0}, {:Name=>"Check digit", :Usage=>"RE", :Datatype=>"ST", :Length=>"1", :Pos=>1}, {:Name=>"code identifying the check digit scheme employed", :Usage=>"R", :Datatype=>"ID", :Length=>"3", :Table=>"0061", :Pos=>2}, {:Name=>"assigning authority", :Usage=>"R", :Datatype=>"HD", :Length=>"8", :Pos=>3, :subComponents=>[{:Name=>"namespace ID", :Usage=>"R", :Datatype=>"IS", :Length=>"5", :Table=>"0363", :Pos=>0}, {:Name=>"universal ID type", :Usage=>"R", :Datatype=>"ID", :Length=>"1", :Table=>"0301", :Pos=>2}]}, {:Name=>"identifier type code (ID)", :Usage=>"R", :Datatype=>"ID", :Length=>"2", :Table=>"0203", :Pos=>4}, {:Name=>"assigning facility", :Usage=>"RE", :Datatype=>"HD", :Length=>"14", :Pos=>5, :subComponents=>[{:Name=>"namespace ID", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0363", :Pos=>0}]}, {:Name=>"effective date (DT)", :Usage=>"RE", :Datatype=>"DT", :Length=>"8", :Pos=>6}]}, {:Name=>"Patient Name", :Usage=>"R", :Min=>"1", :Max=>"*", :Datatype=>"XPN", :Length=>"250", :ItemNo=>"00108", :Pos=>4, :components=>[{:Name=>"family name", :Usage=>"R", :Datatype=>"FN", :Length=>"60", :Pos=>0, :subComponents=>[{:Name=>"surname", :Usage=>"R", :Datatype=>"ST", :Length=>"35", :Pos=>0}]}, {:Name=>"given name", :Usage=>"R", :Datatype=>"ST", :Length=>"25", :Pos=>1}, {:Name=>"second and further given names or initials thereof", :Usage=>"RE", :Datatype=>"ST", :Length=>"25", :Pos=>2}]}, {:Name=>"Date/Time Of Birth", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"TS", :Length=>"26", :ItemNo=>"00110", :Pos=>6, :components=>[{:Name=>"Date/Time", :Usage=>"R", :Datatype=>"NM", :Length=>"20", :Pos=>0}]}, {:Name=>"Administrative Sex", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"IS", :Length=>"1", :Table=>"0001", :ItemNo=>"00111", :Pos=>7}, {:Name=>"Race", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0005", :ItemNo=>"00113", :Pos=>9, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"10", :Table=>"0005", :Pos=>0}, {:Name=>"name of coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0396", :Pos=>2}, {:Name=>"alternate identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"6", :Pos=>3}, {:Name=>"name of alternate coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"3", :Table=>"0396", :Pos=>5}]}, {:Name=>"Patient Address", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"XAD", :Length=>"250", :ItemNo=>"00114", :Pos=>10, :components=>[{:Name=>"street address (SAD)", :Usage=>"RE", :Datatype=>"SAD", :Length=>"49", :Pos=>0, :subComponents=>[{:Name=>"street or mailing address", :Usage=>"RE", :Datatype=>"ST", :Length=>"35", :Pos=>0}]}, {:Name=>"city", :Usage=>"RE", :Datatype=>"ST", :Length=>"15", :Pos=>2}, {:Name=>"state or province", :Usage=>"RE", :Datatype=>"ST", :Length=>"5", :Pos=>3}, {:Name=>"zip or postal code", :Usage=>"RE", :Datatype=>"ST", :Length=>"5", :Pos=>4}]}, {:Name=>"Marital Status", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0002", :ItemNo=>"00119", :Pos=>15, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"1", :Table=>"0002", :Pos=>0}]}, {:Name=>"Religion", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0006", :ItemNo=>"00120", :Pos=>16, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"2", :Table=>"0006", :Pos=>0}]}, {:Name=>"Ethnic Group", :Usage=>"RE", :Min=>"0", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0189", :ItemNo=>"00125", :Pos=>21, :components=>[{:Name=>"identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"10", :Table=>"0189", :Pos=>0}, {:Name=>"name of coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0396", :Pos=>2}, {:Name=>"alternate identifier", :Usage=>"RE", :Datatype=>"ST", :Length=>"6", :Pos=>3}, {:Name=>"name of alternate coding system", :Usage=>"RE", :Datatype=>"IS", :Length=>"6", :Table=>"0396", :Pos=>5}]}], "IAM"=>[{:Name=>"Set ID - IAM", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"SI", :Length=>"4", :ItemNo=>"01612", :Pos=>0}, {:Name=>"Allergen Type Code", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0127", :ItemNo=>"00204", :Pos=>1, :components=>[{:Name=>"identifier", :Usage=>"R", :Datatype=>"ST", :Length=>"3", :Table=>"0127", :Pos=>0}]}, {:Name=>"Allergen Code/Mnemonic/Description", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CE", :Length=>"250", :ItemNo=>"00205", :Pos=>2, :components=>[{:Name=>"identifier", :Usage=>"R", :Datatype=>"ST", :Length=>"60", :Pos=>0}]}, {:Name=>"Allergy Severity Code", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CE", :Length=>"250", :Table=>"0128", :ItemNo=>"00206", :Pos=>3, :components=>[{:Name=>"identifier", :Usage=>"R", :Datatype=>"ST", :Length=>"2", :Table=>"0128", :Pos=>0}]}, {:Name=>"Allergy Reaction Code", :Usage=>"RE", :Min=>"0", :Max=>"*", :Datatype=>"ST", :Length=>"15", :ItemNo=>"00207", :Pos=>4}, {:Name=>"Allergy Action Code", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"CNE", :Length=>"250", :Table=>"0323", :ItemNo=>"01551", :Pos=>5, :components=>[{:Name=>"identifier (ST)", :Usage=>"R", :Datatype=>"ST", :Length=>"3", :Table=>"0323", :Pos=>0}]}, {:Name=>"Allergy Unique Identifier", :Usage=>"R", :Min=>"1", :Max=>"1", :Datatype=>"EI", :Length=>"80", :ItemNo=>"01552", :Pos=>6, :components=>[{:Name=>"entity identifier", :Usage=>"R", :Datatype=>"ST", :Length=>"80", :Pos=>0}]}]}
268
+
269
+ segments = adt_60.keys
270
+ flds = []
271
+
272
+ segments.each{|s|
273
+ f = adt_60[s]
274
+
275
+ dt_partials = []
276
+ dt_partials << process_partials(f)
277
+
278
+ # flds[f[:Pos].to_i] = dt_partials.join('^')
279
+ flds << dt_partials.join('|')
280
+
281
+ puts f
282
+ puts flds.last
283
+ }
284
+
285
+ flds.each_with_index{|f, idx|
286
+ puts segments[idx] + '|' + f
287
+ }
288
+
289
+ end
290
+
291
+
292
+ end