hippo 0.0.4

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 (203) hide show
  1. data/.gitignore +6 -0
  2. data/CHANGELOG +9 -0
  3. data/Gemfile +11 -0
  4. data/Guardfile +14 -0
  5. data/README.md +227 -0
  6. data/Rakefile +12 -0
  7. data/bin/demo_270.rb +280 -0
  8. data/bin/demo_276.rb +296 -0
  9. data/bin/demo_835.rb +170 -0
  10. data/hippo.gemspec +24 -0
  11. data/lib/hippo/exceptions.rb +8 -0
  12. data/lib/hippo/field.rb +6 -0
  13. data/lib/hippo/loop.rb +0 -0
  14. data/lib/hippo/parser.rb +92 -0
  15. data/lib/hippo/samples/835.edi +88 -0
  16. data/lib/hippo/samples/sample_835_with.rb +272 -0
  17. data/lib/hippo/samples/sample_parsed.rb +1162 -0
  18. data/lib/hippo/segments/AK1.rb +32 -0
  19. data/lib/hippo/segments/AK2.rb +31 -0
  20. data/lib/hippo/segments/AK9.rb +82 -0
  21. data/lib/hippo/segments/AMT.rb +31 -0
  22. data/lib/hippo/segments/BHT.rb +55 -0
  23. data/lib/hippo/segments/BPR.rb +175 -0
  24. data/lib/hippo/segments/CAS.rb +159 -0
  25. data/lib/hippo/segments/CL1.rb +39 -0
  26. data/lib/hippo/segments/CLM.rb +223 -0
  27. data/lib/hippo/segments/CLP.rb +119 -0
  28. data/lib/hippo/segments/CN1.rb +55 -0
  29. data/lib/hippo/segments/CR1.rb +87 -0
  30. data/lib/hippo/segments/CR2.rb +104 -0
  31. data/lib/hippo/segments/CR3.rb +47 -0
  32. data/lib/hippo/segments/CR4.rb +239 -0
  33. data/lib/hippo/segments/CR5.rb +151 -0
  34. data/lib/hippo/segments/CR6.rb +175 -0
  35. data/lib/hippo/segments/CR7.rb +33 -0
  36. data/lib/hippo/segments/CR8.rb +79 -0
  37. data/lib/hippo/segments/CRC.rb +63 -0
  38. data/lib/hippo/segments/CTP.rb +212 -0
  39. data/lib/hippo/segments/CTX.rb +105 -0
  40. data/lib/hippo/segments/CUR.rb +175 -0
  41. data/lib/hippo/segments/DMG.rb +115 -0
  42. data/lib/hippo/segments/DN1.rb +39 -0
  43. data/lib/hippo/segments/DN2.rb +55 -0
  44. data/lib/hippo/segments/DSB.rb +71 -0
  45. data/lib/hippo/segments/DTM.rb +55 -0
  46. data/lib/hippo/segments/DTP.rb +31 -0
  47. data/lib/hippo/segments/FRM.rb +47 -0
  48. data/lib/hippo/segments/GE.rb +19 -0
  49. data/lib/hippo/segments/GS.rb +52 -0
  50. data/lib/hippo/segments/HCP.rb +127 -0
  51. data/lib/hippo/segments/HI.rb +919 -0
  52. data/lib/hippo/segments/HL.rb +44 -0
  53. data/lib/hippo/segments/HSD.rb +72 -0
  54. data/lib/hippo/segments/IEA.rb +19 -0
  55. data/lib/hippo/segments/IK3.rb +40 -0
  56. data/lib/hippo/segments/IK4.rb +63 -0
  57. data/lib/hippo/segments/IK5.rb +55 -0
  58. data/lib/hippo/segments/IMM.rb +55 -0
  59. data/lib/hippo/segments/ISA.rb +95 -0
  60. data/lib/hippo/segments/K3.rb +147 -0
  61. data/lib/hippo/segments/LIN.rb +255 -0
  62. data/lib/hippo/segments/LQ.rb +23 -0
  63. data/lib/hippo/segments/LX.rb +21 -0
  64. data/lib/hippo/segments/MEA.rb +219 -0
  65. data/lib/hippo/segments/MIA.rb +199 -0
  66. data/lib/hippo/segments/MOA.rb +79 -0
  67. data/lib/hippo/segments/N1.rb +55 -0
  68. data/lib/hippo/segments/N2.rb +23 -0
  69. data/lib/hippo/segments/N3.rb +23 -0
  70. data/lib/hippo/segments/N4.rb +63 -0
  71. data/lib/hippo/segments/NM1.rb +103 -0
  72. data/lib/hippo/segments/NTE.rb +23 -0
  73. data/lib/hippo/segments/OI.rb +55 -0
  74. data/lib/hippo/segments/PAT.rb +79 -0
  75. data/lib/hippo/segments/PER.rb +79 -0
  76. data/lib/hippo/segments/PLB.rb +191 -0
  77. data/lib/hippo/segments/PRV.rb +75 -0
  78. data/lib/hippo/segments/PS1.rb +31 -0
  79. data/lib/hippo/segments/PWK.rb +116 -0
  80. data/lib/hippo/segments/QTY.rb +155 -0
  81. data/lib/hippo/segments/RDM.rb +135 -0
  82. data/lib/hippo/segments/REF.rb +83 -0
  83. data/lib/hippo/segments/SBR.rb +79 -0
  84. data/lib/hippo/segments/SE.rb +24 -0
  85. data/lib/hippo/segments/ST.rb +31 -0
  86. data/lib/hippo/segments/STC.rb +187 -0
  87. data/lib/hippo/segments/SV1.rb +267 -0
  88. data/lib/hippo/segments/SV2.rb +147 -0
  89. data/lib/hippo/segments/SV3.rb +223 -0
  90. data/lib/hippo/segments/SV4.rb +211 -0
  91. data/lib/hippo/segments/SV5.rb +123 -0
  92. data/lib/hippo/segments/SV6.rb +155 -0
  93. data/lib/hippo/segments/SV7.rb +55 -0
  94. data/lib/hippo/segments/SVC.rb +183 -0
  95. data/lib/hippo/segments/SVD.rb +116 -0
  96. data/lib/hippo/segments/TOO.rb +67 -0
  97. data/lib/hippo/segments/TRN.rb +39 -0
  98. data/lib/hippo/segments/TS2.rb +159 -0
  99. data/lib/hippo/segments/TS3.rb +199 -0
  100. data/lib/hippo/segments/UR.rb +23 -0
  101. data/lib/hippo/segments/base.rb +148 -0
  102. data/lib/hippo/segments.rb +85 -0
  103. data/lib/hippo/transaction_sets/HIPAA_276/L2000A.rb +28 -0
  104. data/lib/hippo/transaction_sets/HIPAA_276/L2000B.rb +28 -0
  105. data/lib/hippo/transaction_sets/HIPAA_276/L2000C.rb +28 -0
  106. data/lib/hippo/transaction_sets/HIPAA_276/L2000D.rb +45 -0
  107. data/lib/hippo/transaction_sets/HIPAA_276/L2000E.rb +45 -0
  108. data/lib/hippo/transaction_sets/HIPAA_276/L2100A.rb +20 -0
  109. data/lib/hippo/transaction_sets/HIPAA_276/L2100B.rb +20 -0
  110. data/lib/hippo/transaction_sets/HIPAA_276/L2100C.rb +19 -0
  111. data/lib/hippo/transaction_sets/HIPAA_276/L2100D.rb +19 -0
  112. data/lib/hippo/transaction_sets/HIPAA_276/L2100E.rb +20 -0
  113. data/lib/hippo/transaction_sets/HIPAA_276/L2200D.rb +116 -0
  114. data/lib/hippo/transaction_sets/HIPAA_276/L2200E.rb +116 -0
  115. data/lib/hippo/transaction_sets/HIPAA_276/L2210D.rb +36 -0
  116. data/lib/hippo/transaction_sets/HIPAA_276/L2210E.rb +36 -0
  117. data/lib/hippo/transaction_sets/HIPAA_276/base.rb +86 -0
  118. data/lib/hippo/transaction_sets/HIPAA_276.rb +21 -0
  119. data/lib/hippo/transaction_sets/HIPAA_277/L2000A.rb +35 -0
  120. data/lib/hippo/transaction_sets/HIPAA_277/L2000B.rb +35 -0
  121. data/lib/hippo/transaction_sets/HIPAA_277/L2000C.rb +35 -0
  122. data/lib/hippo/transaction_sets/HIPAA_277/L2000D.rb +35 -0
  123. data/lib/hippo/transaction_sets/HIPAA_277/L2000E.rb +35 -0
  124. data/lib/hippo/transaction_sets/HIPAA_277/L2100A.rb +19 -0
  125. data/lib/hippo/transaction_sets/HIPAA_277/L2100B.rb +20 -0
  126. data/lib/hippo/transaction_sets/HIPAA_277/L2100C.rb +19 -0
  127. data/lib/hippo/transaction_sets/HIPAA_277/L2100D.rb +20 -0
  128. data/lib/hippo/transaction_sets/HIPAA_277/L2100E.rb +20 -0
  129. data/lib/hippo/transaction_sets/HIPAA_277/L2200A.rb +41 -0
  130. data/lib/hippo/transaction_sets/HIPAA_277/L2200B.rb +66 -0
  131. data/lib/hippo/transaction_sets/HIPAA_277/L2200C.rb +73 -0
  132. data/lib/hippo/transaction_sets/HIPAA_277/L2200D.rb +73 -0
  133. data/lib/hippo/transaction_sets/HIPAA_277/L2200E.rb +103 -0
  134. data/lib/hippo/transaction_sets/HIPAA_277/L2220D.rb +56 -0
  135. data/lib/hippo/transaction_sets/HIPAA_277/L2220E.rb +43 -0
  136. data/lib/hippo/transaction_sets/HIPAA_277/base.rb +77 -0
  137. data/lib/hippo/transaction_sets/HIPAA_277.rb +24 -0
  138. data/lib/hippo/transaction_sets/HIPAA_835/L1000A.rb +71 -0
  139. data/lib/hippo/transaction_sets/HIPAA_835/L1000B.rb +47 -0
  140. data/lib/hippo/transaction_sets/HIPAA_835/L2000.rb +37 -0
  141. data/lib/hippo/transaction_sets/HIPAA_835/L2100.rb +182 -0
  142. data/lib/hippo/transaction_sets/HIPAA_835/L2110.rb +85 -0
  143. data/lib/hippo/transaction_sets/HIPAA_835/base.rb +112 -0
  144. data/lib/hippo/transaction_sets/HIPAA_835.rb +12 -0
  145. data/lib/hippo/transaction_sets/HIPAA_837/L1000A.rb +30 -0
  146. data/lib/hippo/transaction_sets/HIPAA_837/L1000B.rb +21 -0
  147. data/lib/hippo/transaction_sets/HIPAA_837/L2000A.rb +65 -0
  148. data/lib/hippo/transaction_sets/HIPAA_837/L2000B.rb +49 -0
  149. data/lib/hippo/transaction_sets/HIPAA_837/L2000C.rb +42 -0
  150. data/lib/hippo/transaction_sets/HIPAA_837/L2010AA.rb +57 -0
  151. data/lib/hippo/transaction_sets/HIPAA_837/L2010AB.rb +33 -0
  152. data/lib/hippo/transaction_sets/HIPAA_837/L2010AC.rb +51 -0
  153. data/lib/hippo/transaction_sets/HIPAA_837/L2010BA.rb +74 -0
  154. data/lib/hippo/transaction_sets/HIPAA_837/L2010BB.rb +48 -0
  155. data/lib/hippo/transaction_sets/HIPAA_837/L2010CA.rb +72 -0
  156. data/lib/hippo/transaction_sets/HIPAA_837/L2300.rb +510 -0
  157. data/lib/hippo/transaction_sets/HIPAA_837/L2310A.rb +26 -0
  158. data/lib/hippo/transaction_sets/HIPAA_837/L2310B.rb +37 -0
  159. data/lib/hippo/transaction_sets/HIPAA_837/L2310C.rb +52 -0
  160. data/lib/hippo/transaction_sets/HIPAA_837/L2310D.rb +27 -0
  161. data/lib/hippo/transaction_sets/HIPAA_837/L2310E.rb +34 -0
  162. data/lib/hippo/transaction_sets/HIPAA_837/L2310F.rb +34 -0
  163. data/lib/hippo/transaction_sets/HIPAA_837/L2320.rb +122 -0
  164. data/lib/hippo/transaction_sets/HIPAA_837/L2330A.rb +43 -0
  165. data/lib/hippo/transaction_sets/HIPAA_837/L2330B.rb +92 -0
  166. data/lib/hippo/transaction_sets/HIPAA_837/L2330C.rb +26 -0
  167. data/lib/hippo/transaction_sets/HIPAA_837/L2330D.rb +26 -0
  168. data/lib/hippo/transaction_sets/HIPAA_837/L2330E.rb +27 -0
  169. data/lib/hippo/transaction_sets/HIPAA_837/L2330F.rb +27 -0
  170. data/lib/hippo/transaction_sets/HIPAA_837/L2330G.rb +26 -0
  171. data/lib/hippo/transaction_sets/HIPAA_837/L2400.rb +475 -0
  172. data/lib/hippo/transaction_sets/HIPAA_837/L2410.rb +30 -0
  173. data/lib/hippo/transaction_sets/HIPAA_837/L2420A.rb +37 -0
  174. data/lib/hippo/transaction_sets/HIPAA_837/L2420B.rb +26 -0
  175. data/lib/hippo/transaction_sets/HIPAA_837/L2420C.rb +41 -0
  176. data/lib/hippo/transaction_sets/HIPAA_837/L2420D.rb +27 -0
  177. data/lib/hippo/transaction_sets/HIPAA_837/L2420E.rb +51 -0
  178. data/lib/hippo/transaction_sets/HIPAA_837/L2420F.rb +26 -0
  179. data/lib/hippo/transaction_sets/HIPAA_837/L2420G.rb +34 -0
  180. data/lib/hippo/transaction_sets/HIPAA_837/L2420H.rb +34 -0
  181. data/lib/hippo/transaction_sets/HIPAA_837/L2430.rb +44 -0
  182. data/lib/hippo/transaction_sets/HIPAA_837/L2440.rb +23 -0
  183. data/lib/hippo/transaction_sets/HIPAA_837/base.rb +81 -0
  184. data/lib/hippo/transaction_sets/HIPAA_837.rb +45 -0
  185. data/lib/hippo/transaction_sets/HIPAA_999/L2000 - AK2.rb +30 -0
  186. data/lib/hippo/transaction_sets/HIPAA_999/L2000AK2.rb +30 -0
  187. data/lib/hippo/transaction_sets/HIPAA_999/L2100 - AK2.rb +37 -0
  188. data/lib/hippo/transaction_sets/HIPAA_999/L2100AK2.rb +37 -0
  189. data/lib/hippo/transaction_sets/HIPAA_999/L2110 - AK2.rb +23 -0
  190. data/lib/hippo/transaction_sets/HIPAA_999/L2110AK2.rb +23 -0
  191. data/lib/hippo/transaction_sets/HIPAA_999/base.rb +46 -0
  192. data/lib/hippo/transaction_sets/HIPAA_999.rb +10 -0
  193. data/lib/hippo/transaction_sets/base.rb +136 -0
  194. data/lib/hippo/transaction_sets.rb +11 -0
  195. data/lib/hippo/version.rb +3 -0
  196. data/lib/hippo.rb +15 -0
  197. data/samples/835_4010.edi +1 -0
  198. data/samples/837_4010A1.edi +1 -0
  199. data/test/test_helper.rb +118 -0
  200. data/test/test_hipaa_837.rb +396 -0
  201. data/test/test_segments_base.rb +106 -0
  202. data/test/test_transaction_sets_base.rb +85 -0
  203. metadata +277 -0
@@ -0,0 +1,11 @@
1
+ module Hippo
2
+ module TransactionSets
3
+
4
+ autoload :Base, 'hippo/transaction_sets/base'
5
+ autoload :HIPAA_276, 'hippo/transaction_sets/HIPAA_276'
6
+ autoload :HIPAA_277, 'hippo/transaction_sets/HIPAA_277'
7
+ autoload :HIPAA_835, 'hippo/transaction_sets/HIPAA_835'
8
+ autoload :HIPAA_837, 'hippo/transaction_sets/HIPAA_837'
9
+ autoload :HIPAA_999, 'hippo/transaction_sets/HIPAA_999'
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Hippo
2
+ VERSION = "0.0.4"
3
+ end
data/lib/hippo.rb ADDED
@@ -0,0 +1,15 @@
1
+ libdir = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
+
4
+ module Hippo
5
+ autoload :Exceptions, 'hippo/exceptions'
6
+ autoload :Segments, 'hippo/segments'
7
+ autoload :TransactionSets, 'hippo/transaction_sets'
8
+ autoload :Field, 'hippo/field'
9
+ autoload :CompositeField, 'hippo/composite_field'
10
+ autoload :Parser, 'hippo/parser'
11
+
12
+ FieldSeparator = '*'
13
+ CompositeSeparator = ':'
14
+ SegmentSeparator = '~'
15
+ end
@@ -0,0 +1 @@
1
+ ISA*00* *00* *ZZ*EMEDNYBAT *ZZ*530 *080716*1801*U*00401*198000001*0*T*:~GS*HP*EMEDNYBAT*530*20080716*18011900*198000001*X*004010X091A1~ST*835*159900001~BPR*H*0*C*NON************20080716~TRN*1*NO PAYMENT*1141797357~REF*EV*530~REF*F2*004010X091A1~DTM*405*20080716~N1*PR*NYSDOH~N3*OFFICE OF MEDICAID MANAGEMENT*CORNING TOWER, EMPIRE STATE PLAZA~N4*ALBANY*NY*122370080~N1*PE*ST ELSEWARE HSP MED CTR NY*XX*1234567890~REF*TJ*111991234~LX*1~CLP*0711000004462420*22*-123.86*-134.7**MC*0712000000015920*13*7~CAS*CR*A2*10.84*0~NM1*QC*1*PATIENT*ANNIBEL*X***MI*AA00000Z~NM1*82*1******XX*1234567890~REF*EA*607887001~REF*9A*4303~DTM*232*20070413~DTM*233*20070413~PER*CX*RETRO RATE REVERSAL~CLP*0711000004462420*1*123.86*130.7**MC*0712000000015920*13*7~CAS*CO*A2*-6.84*0~NM1*QC*1*PATIENT*ANNIBEL*X***MI*AA00000Z~NM1*82*1******XX*1234567890~REF*EA*607887001~REF*9A*4303~DTM*232*20070413~DTM*233*20070413~PER*CX*RETRO RATE CORRECTION~PLB*1234567890*20081231*FB:000000000000000000000000000000*-4~SE*32*159900001~GE*1*198000001~IEA*1*198000001~
@@ -0,0 +1 @@
1
+ ISA*00* *00* *ZZ*498 *ZZ*123456789 *070814*1741*U*00401*000001234*0*P*:~GS*HC*123*123456789*20070814*1741*2353*X*004010X098A1~ST*837*0001~BHT*0019*00*1*20070814*1741*CH~REF*87*004010X098A1~NM1*41*2*John Doe Clinic*****46*498~PER*IC*John Doe Clinic*TE*1305862479~NM1*40*2*NONEBLUE CROSS OF OKLAHOMA*****00*1301112222~HL*1**20*1~NM1*85*2*John Doe Clinic*****XX*1134125735~N3*12 MAIN STREET~N4*CITY*ST*56789~REF*EI*76053151601~HL*2*1*22*1~SBR*P**702510******CI~NM1*IL*1*DOE*JOHN****ST*123456789~N3*123 DOE ST~N4*CITY*ST*12345~DMG*D8*20020202*M~NM1*PR*2*NONEBLUE CROSS OF OKLAHOMA*****PI*12345~N3*P O BOX 000000~N4*CITY*ST*77210~HL*3*2*23*0~PAT*19******01*239~NM1*QC*1*SMITH*DOE Q****MI*123456789~N3*12 MAIN STREET~N4*CITY*ST*56789~CLM*968928879*45***12::1*Y*A*Y*Y*C~REF*9F*2417401094~REF*D9*26485~HI*BK:8489~NM1*DN*1*DOE*JANE~REF*1G*F01234~LX*1~SV1*HC:E0114:NU*45.00*UN*1***1~DTP*472*RD8*20070515-20070515~NM1*DK*1*DOE*JANE~N3*1234 NOWHERE SUITE 100~N4*CITY*ST*56789~REF*1G*F12345~PER*IC*JOHN DOLITTLE*TE*1301112222~SE*40*0001~GE*1*2353~IEA*1*000001234~
@@ -0,0 +1,118 @@
1
+ require 'rubygems'
2
+ gem 'minitest'
3
+ require 'minitest/autorun'
4
+
5
+ require_relative '../lib/hippo'
6
+ require 'pp'
7
+
8
+ module Hippo::Segments
9
+ class TestSimpleSegment < Hippo::Segments::Base
10
+ segment_identifier 'TSS'
11
+
12
+ field :name => 'Field1'
13
+ field :name => 'Field2'
14
+ field :name => 'Field3'
15
+ field :name => 'Field4'
16
+ field :name => 'CommonName'
17
+ field :name => 'CommonName'
18
+ end
19
+
20
+ class TestCompoundSegment < Hippo::Segments::Base
21
+ segment_identifier 'TCS'
22
+
23
+ composite_field 'CompositeField' do
24
+ field :name => 'Field1'
25
+ field :name => 'Field2'
26
+ field :name => 'Field3'
27
+ field :name => 'CompositeCommonName'
28
+ end
29
+
30
+ composite_field 'CompositeField' do
31
+ field :name => 'Field4'
32
+ field :name => 'Field5'
33
+ field :name => 'Field6'
34
+ field :name => 'CompositeCommonName'
35
+ end
36
+
37
+ field :name => 'Field7'
38
+ end
39
+ end
40
+
41
+ module Hippo::TransactionSets
42
+ module Test
43
+ class L0001 < Hippo::TransactionSets::Base
44
+ loop_name 'L0001'
45
+
46
+ segment Hippo::Segments::TestSimpleSegment,
47
+ :name => 'Test Simple Segment #1',
48
+ :minimum => 1,
49
+ :maximum => 1,
50
+ :position => 50
51
+ end
52
+
53
+ class L0002 < Hippo::TransactionSets::Base
54
+ loop_name 'L0002'
55
+
56
+ segment Hippo::Segments::TestCompoundSegment,
57
+ :name => 'Test Compound Segment #4',
58
+ :minimum => 1,
59
+ :maximum => 1,
60
+ :position => 100,
61
+ :defaults => {
62
+ 'Field7' => 'Preset Field 7'
63
+ }
64
+
65
+ segment Hippo::Segments::TestSimpleSegment,
66
+ :name => 'Test Simple Segment #5',
67
+ :minimum => 1,
68
+ :maximum => 1,
69
+ :position => 50,
70
+ :defaults => {
71
+ 'TSS01' => 'Last Segment'
72
+ }
73
+ end
74
+
75
+ class Base < Hippo::TransactionSets::Base
76
+
77
+ segment Hippo::Segments::TestSimpleSegment,
78
+ :name => 'Test Simple Segment #1',
79
+ :minimum => 1,
80
+ :maximum => 5,
81
+ :position => 50,
82
+ :defaults => {
83
+ 'TSS01' => 'Blah'
84
+ }
85
+
86
+ segment Hippo::Segments::TestCompoundSegment,
87
+ :name => 'Test Compound Segment #2',
88
+ :minimum => 1,
89
+ :maximum => 1,
90
+ :position => 100,
91
+ :defaults => {
92
+ 'Field7' => 'Preset Field 7'
93
+ }
94
+
95
+ segment Hippo::Segments::TestSimpleSegment,
96
+ :name => 'Test Simple Segment #3',
97
+ :minimum => 1,
98
+ :maximum => 1,
99
+ :position => 50,
100
+ :defaults => {
101
+ 'TSS01' => 'Last Segment'
102
+ }
103
+
104
+ loop Hippo::TransactionSets::Test::L0001,
105
+ :name => 'Test Sub-Loop',
106
+ :identified_by => {
107
+ 'TSS.TSS01' => 'Foo'
108
+ }
109
+
110
+ loop Hippo::TransactionSets::Test::L0002,
111
+ :name => 'Test Sub-Loop',
112
+ :maximum => 5,
113
+ :identified_by => {
114
+ 'TCS.Field7' => 'Foo2'
115
+ }
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,396 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative 'test_helper'
4
+
5
+ class TestHIPAA837 < MiniTest::Unit::TestCase
6
+
7
+ def test_commercial_health_insurance
8
+ =begin
9
+ This example file is based on the Commercial Health Insurance example (3.1.1) published in the 5010X222A1 TR3.
10
+
11
+ Patient is a different person than the Subscriber. Payer is commercial health insurance company.
12
+
13
+ SUBSCRIBER: Jane Smith
14
+ PATIENT ADDRESS:236 N. Main St., Miami, Fl, 33413
15
+ TELEPHONE NUMBER: 305-555-1111
16
+ SEX: F
17
+ DOB: 05/01/43
18
+ EMPLOYER: ACME Inc.
19
+ GROUP #: 2222-SJ
20
+ KEY INSURANCE COMPANY ID #: JS00111223333
21
+
22
+ PATIENT: Ted Smith
23
+ PATIENT ADDRESS:236 N. Main St., Miami, Fl, 33413
24
+ TELEPHONE NUMBER: 305-555-1111
25
+ SEX: M
26
+ DOB: 05/01/73
27
+ KEY INSURANCE COMPANY ID #: JS01111223333
28
+
29
+ DESTINATION PAYER: Key Insurance Company
30
+ PAYER ADDRESS: 3333 Ocean St. South Miami, FL 33000
31
+ PAYER ID: 999996666
32
+
33
+ SUBMITTER: Premier Billing Service
34
+ EDI#: TGJ23
35
+ CONTACT PERSON AND PHONE NUMBER: JERRY, 305-555-2222 ext. 231
36
+
37
+ RECEIVER: Key Insurance Company
38
+ EDI #:66783JJT
39
+
40
+ BILLING PROVIDER: Dr. Ben Kildare,
41
+ ADDRESS: 234 Seaway St, Miami, FL, 33111
42
+ NPI: 9876543210
43
+ TIN: 587654321
44
+ KEY INSURANCE COMPANY PROVIDER ID #: KA6663
45
+ Taxonomy Code: 203BF0100Y
46
+
47
+ PAY-TO PROVIDER: Kildare Associates,
48
+ PROVIDER ADDRESS: 2345 Ocean Blvd, Miami, Fl 33111
49
+ RENDERING PROVIDER: Dr. Ben Kildare
50
+
51
+ PATIENT ACCOUNT NUMBER: 2-646-3774
52
+ CASE: Patient has sore throat.
53
+
54
+ INITIAL VISIT: DOS=10/03/06. POS=Office
55
+ SERVICES: Office visit, intermediate service, established patient, throat culture.
56
+ CHARGES: Office first visit = $40.00, Lab test for strep = $15.00
57
+
58
+ FOLLOW-UP VISIT: DOS=10/10/06 POS=Office
59
+ Antibiotics didn’t work (pain continues).
60
+ SERVICES: Office visit, intermediate service, established patient, mono screening.
61
+ CHARGES: Follow-up visit = $35.00, lab test for mono = $10.00.
62
+
63
+ TOTAL CHARGES: $100.00.
64
+ ELECTRONIC ROUTE: Billing provider (sender), to VAN to Key Insurance Company (receiver).
65
+ VAN claim identification number = 17312345600006351.
66
+
67
+ =end
68
+
69
+ ts = Hippo::TransactionSets::HIPAA_837::Base.new
70
+
71
+ ts.ST do |st|
72
+ st.TransactionSetControlNumber = '0021'
73
+ st.ImplementationConventionReference = '005010X222A1'
74
+ end
75
+
76
+ ts.BHT do |bht|
77
+ bht.TransactionSetPurposeCode = '00'
78
+ bht.ReferenceIdentification = '244579'
79
+ bht.Date = '20061015'
80
+ bht.Time = '1023'
81
+ bht.TransactionTypeCode = 'CH'
82
+ end
83
+
84
+ ts.L1000A do |l1000a|
85
+ l1000a.NM1 do |nm1|
86
+ nm1.EntityTypeQualifier = '2'
87
+ nm1.NameLastOrOrganizationName = 'PREMIER BILLING SERVICE'
88
+ nm1.IdentificationCode = 'TGJ23'
89
+ end
90
+
91
+ l1000a.PER do |per|
92
+ per.Name = 'JERRY'
93
+ per.CommunicationNumberQualifier_01 = 'TE'
94
+ per.CommunicationNumber_01 = '3055552222'
95
+ per.CommunicationNumberQualifier_02 = 'EX'
96
+ per.CommunicationNumber_02 = '231'
97
+ end
98
+ end
99
+
100
+ ts.L1000B do |l1000b|
101
+ l1000b.NM1 do |nm1|
102
+ nm1.EntityTypeQualifier = '2'
103
+ nm1.NameLastOrOrganizationName = 'KEY INSURANCE COMPANY'
104
+ nm1.IdentificationCode = '66783JJT'
105
+ end
106
+ end
107
+
108
+ ts.L2000A do |l2000a|
109
+ l2000a.HL do |hl|
110
+ hl.HL01 = hl.class.increment_sequence_number
111
+ hl.HL04 = 1
112
+ end
113
+
114
+ l2000a.PRV do |prv|
115
+ prv.ReferenceIdentification = '203BF0100Y'
116
+ end
117
+
118
+ l2000a.L2010AA do |l2010aa|
119
+
120
+ l2010aa.NM1 do |nm1|
121
+ nm1.EntityTypeQualifier = '2'
122
+ nm1.NameLastOrOrganizationName = 'BEN KILDARE SERVICE'
123
+ nm1.IdentificationCodeQualifier = 'XX'
124
+ nm1.IdentificationCode = '9876543210'
125
+ end
126
+
127
+ l2010aa.N3 do |n3|
128
+ n3.AddressInformation = '234 SEAWAY ST'
129
+ end
130
+
131
+ l2010aa.N4 do |n4|
132
+ n4.CityName = 'MIAMI'
133
+ n4.StateOrProvinceCode = 'FL'
134
+ n4.PostalCode = '33111'
135
+ end
136
+
137
+ l2010aa.REF do |ref|
138
+ ref.ReferenceIdentificationQualifier = 'EI'
139
+ ref.ReferenceIdentification = '587654321'
140
+ end
141
+ end
142
+
143
+ l2000a.L2010AB do |l2010ab|
144
+ l2010ab.NM1 do |nm1|
145
+ nm1.EntityTypeQualifier = '2'
146
+ end
147
+
148
+ l2010ab.N3 do |n3|
149
+ n3.AddressInformation = '2345 OCEAN BLVD'
150
+ end
151
+
152
+ l2010ab.N4 do |n4|
153
+ n4.CityName = 'MIAMI'
154
+ n4.StateOrProvinceCode = 'FL'
155
+ n4.PostalCode = '33111'
156
+ end
157
+ end
158
+
159
+ ts.L2000B do |l2000b|
160
+ l2000b.HL do |hl|
161
+ hl.HL01 = hl.class.increment_sequence_number
162
+ hl.HL02 = l2000a.HL.HL01
163
+ hl.HL04 = 1
164
+ end
165
+
166
+ l2000b.SBR do |sbr|
167
+ sbr.PayerResponsibilitySequenceNumberCode = 'P'
168
+ sbr.ReferenceIdentification = '2222-SJ'
169
+ sbr.ClaimFilingIndicatorCode = 'CI'
170
+ end
171
+
172
+ l2000b.L2010BA do |l2010ba|
173
+ l2010ba.NM1 do |nm1|
174
+ nm1.EntityTypeQualifier = '1'
175
+ nm1.NameLastOrOrganizationName = 'SMITH'
176
+ nm1.NameFirst = 'JANE'
177
+ nm1.IdentificationCodeQualifier = 'MI'
178
+ nm1.IdentificationCode = 'JS00111223333'
179
+ end
180
+
181
+ l2010ba.DMG do |dmg|
182
+ dmg.DateTimePeriod = '19430501'
183
+ dmg.GenderCode = 'F'
184
+ end
185
+ end
186
+
187
+ l2000b.L2010BB do |l2010bb|
188
+ l2010bb.NM1 do |nm1|
189
+ nm1.EntityTypeQualifier = '2'
190
+ nm1.NameLastOrOrganizationName = 'KEY INSURANCE COMPANY'
191
+ nm1.IdentificationCodeQualifier = 'PI'
192
+ nm1.IdentificationCode = '999996666'
193
+ end
194
+
195
+ # second ref segment in L2010BB
196
+ l2010bb.REF_02 do |ref|
197
+ ref.ReferenceIdentificationQualifier = 'G2'
198
+ ref.ReferenceIdentification = 'KA6663'
199
+ end
200
+ end
201
+
202
+ ts.L2000C do |l2000c|
203
+ l2000c.HL do |hl|
204
+ hl.HL01 = hl.class.increment_sequence_number
205
+ hl.HL02 = l2000b.HL.HL01
206
+ hl.HL04 = 0
207
+ end
208
+
209
+ l2000c.PAT do |pat|
210
+ pat.IndividualRelationshipCode = '19'
211
+ end
212
+
213
+ l2000c.L2010CA do |l2010ca|
214
+ l2010ca.NM1 do |nm1|
215
+ nm1.NameLastOrOrganizationName = 'SMITH'
216
+ nm1.NameFirst = 'TED'
217
+ end
218
+
219
+ l2010ca.N3 do |n3|
220
+ n3.AddressInformation = '236 N MAIN ST'
221
+ end
222
+
223
+ l2010ca.N4 do |n4|
224
+ n4.CityName = 'MIAMI'
225
+ n4.StateOrProvinceCode = 'FL'
226
+ n4.PostalCode = '33413'
227
+ end
228
+
229
+ l2010ca.DMG do |dmg|
230
+ dmg.DateTimePeriod = '19730501'
231
+ dmg.GenderCode = 'M'
232
+ end
233
+ end
234
+
235
+ l2000c.L2300 do |l2300|
236
+ l2300.CLM do |clm|
237
+ clm.ClaimSubmitterSIdentifier = '26463774'
238
+ clm.MonetaryAmount = '100'
239
+ clm.FacilityCodeValue = '11'
240
+ clm.FacilityCodeQualifier = 'B'
241
+ clm.ClaimFrequencyTypeCode = '1'
242
+ clm.YesNoConditionOrResponseCode = 'Y'
243
+ clm.ProviderAcceptAssignmentCode = 'A'
244
+ clm.YesNoConditionOrResponseCode_02 = 'Y'
245
+ clm.ReleaseOfInformationCode = 'I'
246
+ end
247
+
248
+ l2300.REF_11 do |ref| #('Claim Identifier For Transmission Intermediaries') do |ref|
249
+ ref.ReferenceIdentification = '17312345600006351'
250
+ end
251
+
252
+ l2300.HI do |hi|
253
+ hi.CodeListQualifierCode_01 = 'BK'
254
+ hi.IndustryCode_01 = '0340'
255
+
256
+ hi.CodeListQualifierCode_02 = 'BF'
257
+ hi.IndustryCode_03 = 'V7389'
258
+ end
259
+
260
+ l2300.L2400.build do |l2400|
261
+ l2400.LX.LX01 = Hippo::Segments::LX.increment_sequence_number
262
+
263
+ l2400.SV1 do |sv1|
264
+ sv1.ProductServiceIdQualifier = 'HC'
265
+ sv1.ProductServiceId = '99213'
266
+ sv1.MonetaryAmount = '40'
267
+ sv1.UnitOrBasisForMeasurementCode = 'UN'
268
+ sv1.Quantity = '1'
269
+ sv1.DiagnosisCodePointer = 1
270
+ end
271
+
272
+ l2400.DTP('Date - Service Date') do |dtp|
273
+ dtp.DateTimePeriodFormatQualifier = 'D8'
274
+ dtp.DateTimePeriod = '20061003'
275
+ end
276
+ end
277
+
278
+ l2300.L2400.build do |l2400|
279
+ l2400.LX.LX01 = Hippo::Segments::LX.increment_sequence_number
280
+
281
+ l2400.SV1 do |sv1|
282
+ sv1.ProductServiceIdQualifier = 'HC'
283
+ sv1.ProductServiceId = '87070'
284
+ sv1.MonetaryAmount = '15'
285
+ sv1.UnitOrBasisForMeasurementCode = 'UN'
286
+ sv1.Quantity = '1'
287
+ sv1.DiagnosisCodePointer = 1
288
+ end
289
+
290
+ l2400.DTP('Date - Service Date') do |dtp|
291
+ dtp.DateTimePeriodFormatQualifier = 'D8'
292
+ dtp.DateTimePeriod = '20061003'
293
+ end
294
+ end
295
+
296
+ l2300.L2400.build do |l2400|
297
+ l2400.LX.LX01 = Hippo::Segments::LX.increment_sequence_number
298
+
299
+ l2400.SV1 do |sv1|
300
+ sv1.ProductServiceIdQualifier = 'HC'
301
+ sv1.ProductServiceId = '99214'
302
+ sv1.MonetaryAmount = '35'
303
+ sv1.UnitOrBasisForMeasurementCode = 'UN'
304
+ sv1.Quantity = '1'
305
+ sv1.DiagnosisCodePointer = 2
306
+ end
307
+
308
+ l2400.DTP('Date - Service Date') do |dtp|
309
+ dtp.DateTimePeriodFormatQualifier = 'D8'
310
+ dtp.DateTimePeriod = '20061010'
311
+ end
312
+ end
313
+
314
+ l2300.L2400.build do |l2400|
315
+ l2400.LX.LX01 = Hippo::Segments::LX.increment_sequence_number
316
+
317
+ l2400.SV1 do |sv1|
318
+ sv1.ProductServiceIdQualifier = 'HC'
319
+ sv1.ProductServiceId = '86663'
320
+ sv1.MonetaryAmount = '10'
321
+ sv1.UnitOrBasisForMeasurementCode = 'UN'
322
+ sv1.Quantity = '1'
323
+ sv1.DiagnosisCodePointer = 2
324
+ end
325
+
326
+ l2400.DTP('Date - Service Date') do |dtp|
327
+ dtp.DateTimePeriodFormatQualifier = 'D8'
328
+ dtp.DateTimePeriod = '20061010'
329
+ end
330
+ end
331
+ end
332
+ end
333
+ end
334
+ end
335
+
336
+
337
+ ts.SE do |se|
338
+ se.TransactionSetControlNumber = ts.ST.TransactionSetControlNumber
339
+ end
340
+
341
+ ts.SE.NumberOfIncludedSegments = ts.segment_count
342
+
343
+ published_answer = <<EOF
344
+ ST*837*0021*005010X222A1~
345
+ BHT*0019*00*244579*20061015*1023*CH~
346
+ NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~
347
+ PER*IC*JERRY*TE*3055552222*EX*231~
348
+ NM1*40*2*KEY INSURANCE COMPANY*****46*66783JJT~
349
+ HL*1**20*1~
350
+ PRV*BI*PXC*203BF0100Y~
351
+ NM1*85*2*BEN KILDARE SERVICE*****XX*9876543210~
352
+ N3*234 SEAWAY ST~
353
+ N4*MIAMI*FL*33111~
354
+ REF*EI*587654321~
355
+ NM1*87*2~
356
+ N3*2345 OCEAN BLVD~
357
+ N4*MIAMI*FL*33111~
358
+ HL*2*1*22*1~
359
+ SBR*P**2222-SJ******CI~
360
+ NM1*IL*1*SMITH*JANE****MI*JS00111223333~
361
+ DMG*D8*19430501*F~
362
+ NM1*PR*2*KEY INSURANCE COMPANY*****PI*999996666~
363
+ REF*G2*KA6663~
364
+ HL*3*2*23*0~
365
+ PAT*19~
366
+ NM1*QC*1*SMITH*TED~
367
+ N3*236 N MAIN ST~
368
+ N4*MIAMI*FL*33413~
369
+ DMG*D8*19730501*M~
370
+ CLM*26463774*100***11:B:1*Y*A*Y*I~
371
+ REF*D9*17312345600006351~
372
+ HI*BK:0340*BF:V7389~
373
+ LX*1~
374
+ SV1*HC:99213*40*UN*1***1~
375
+ DTP*472*D8*20061003~
376
+ LX*2~
377
+ SV1*HC:87070*15*UN*1***1~
378
+ DTP*472*D8*20061003~
379
+ LX*3~
380
+ SV1*HC:99214*35*UN*1***2~
381
+ DTP*472*D8*20061010~
382
+ LX*4~
383
+ SV1*HC:86663*10*UN*1***2~
384
+ DTP*472*D8*20061010~
385
+ SE*42*0021~
386
+ EOF
387
+
388
+ assert_equal published_answer, ts.to_s.split('~').join("~\n") + "~\n"
389
+
390
+ #* not printing LX segments for each service line
391
+ #* HL parent/child references wrong
392
+ #* HL total segments counts should only be counting direct children
393
+
394
+ end
395
+
396
+ end
@@ -0,0 +1,106 @@
1
+ require_relative './test_helper'
2
+
3
+ class TestSegmentsBase < MiniTest::Unit::TestCase
4
+ def setup; end;
5
+ def teardown; end;
6
+
7
+ def test_empty_segment
8
+ seg = Hippo::Segments::TestSimpleSegment.new
9
+
10
+ assert_equal 'TSS~', seg.to_s
11
+ end
12
+
13
+ def test_basic_populated_segment
14
+ seg = Hippo::Segments::TestSimpleSegment.new
15
+
16
+ seg.Field1 = 'TestField1'
17
+ seg.Field2 = 'TestField2'
18
+ seg.Field3 = 'TestField3'
19
+ seg.Field4 = 'TestField4'
20
+
21
+ assert_equal 'TSS*TestField1*TestField2*TestField3*TestField4~', seg.to_s
22
+ end
23
+
24
+ def test_empty_field_in_segment
25
+ seg = Hippo::Segments::TestSimpleSegment.new
26
+
27
+ seg.Field2 = 'TestField2'
28
+ seg.Field3 = 'TestField3'
29
+ seg.Field4 = 'TestField4'
30
+
31
+ assert_equal 'TSS**TestField2*TestField3*TestField4~', seg.to_s
32
+
33
+ seg = Hippo::Segments::TestSimpleSegment.new
34
+
35
+ seg.Field2 = 'TestField2'
36
+
37
+ assert_equal 'TSS**TestField2~', seg.to_s
38
+ end
39
+
40
+ def test_segment_orders_properly
41
+ seg = Hippo::Segments::TestSimpleSegment.new
42
+
43
+ seg.Field3 = 'TestField3'
44
+ seg.Field2 = 'TestField2'
45
+ seg.Field1 = 'TestField1'
46
+ seg.Field4 = 'TestField4'
47
+
48
+ assert_equal 'TSS*TestField1*TestField2*TestField3*TestField4~', seg.to_s
49
+ end
50
+
51
+ def test_assign_values_with_same_field_names
52
+ seg = Hippo::Segments::TestSimpleSegment.new
53
+ seg.CommonName = 'Value1'
54
+ seg.CommonName_02 = 'Value2'
55
+
56
+ assert_equal 'TSS*****Value1*Value2~', seg.to_s
57
+
58
+ seg.CommonName_01 = 'Value3'
59
+ seg.CommonName_02 = 'Value4'
60
+
61
+ assert_equal 'TSS*****Value3*Value4~', seg.to_s
62
+ end
63
+
64
+ def test_compound_segment
65
+ seg = Hippo::Segments::TestCompoundSegment.new
66
+
67
+ seg.Field1 = 'Comp1Field1'
68
+ seg.Field2 = 'Comp1Field2'
69
+
70
+ assert_equal 'TCS*Comp1Field1:Comp1Field2~', seg.to_s
71
+
72
+ seg.Field7 = 'Field7'
73
+
74
+ assert_equal 'TCS*Comp1Field1:Comp1Field2**Field7~', seg.to_s
75
+ end
76
+
77
+ def test_compound_segment_with_empty_initial_fields
78
+ seg = Hippo::Segments::TestCompoundSegment.new
79
+
80
+ seg.Field2 = 'Comp1Field2'
81
+
82
+ assert_equal 'TCS*:Comp1Field2~', seg.to_s
83
+ end
84
+
85
+ def test_compound_segment_assign_values_with_same_field_names
86
+
87
+ seg = Hippo::Segments::TestCompoundSegment.new
88
+
89
+ seg.CompositeCommonName = 'CompVal1'
90
+ seg.CompositeCommonName_02 = 'CompVal2'
91
+
92
+ assert_equal 'TCS*:::CompVal1*:::CompVal2~', seg.to_s
93
+
94
+ seg.CompositeCommonName_1 = 'CompVal3'
95
+ seg.CompositeCommonName_2 = 'CompVal4'
96
+
97
+ assert_equal 'TCS*:::CompVal3*:::CompVal4~', seg.to_s
98
+ end
99
+
100
+ def test_assign_invalid_field_throws_error
101
+ assert_raises(Hippo::Exceptions::InvalidField) do
102
+ seg = Hippo::Segments::NM1.new
103
+ seg.InvalidField = 'Error should be raised.'
104
+ end
105
+ end
106
+ end