ez7gen 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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