Skip to content

Commit 32463ef

Browse files
Institutional Claims Implementation (837i) (#84)
* institutional claims sample file Signed-off-by: Dixon Whitmire <[email protected]> * institutional claims sample file Signed-off-by: Dixon Whitmire <[email protected]> * 837i sample files Signed-off-by: Dixon Whitmire <[email protected]> * 837i template Signed-off-by: Dixon Whitmire <[email protected]> * wip 837i Signed-off-by: Dixon Whitmire <[email protected]> * loops and segments for 837i Signed-off-by: Dixon Whitmire <[email protected]> * 837i parsing rules Signed-off-by: Dixon Whitmire <[email protected]> * 837i test case iteration Signed-off-by: Dixon Whitmire <[email protected]> * institutional claims test case Signed-off-by: Dixon Whitmire <[email protected]> * out of network repriced claim transaction Signed-off-by: Dixon Whitmire <[email protected]> * 837i with working test cases Signed-off-by: Dixon Whitmire <[email protected]> * updating 837i demo file Signed-off-by: Dixon Whitmire <[email protected]> * updating README Signed-off-by: Dixon Whitmire <[email protected]>
1 parent cbfc236 commit 32463ef

22 files changed

+2965
-27
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ venv/
110110
ENV/
111111
env.bak/
112112
venv.bak/
113+
cli-test/
113114

114115
# Spyder project settings
115116
.spyderproject

Diff for: README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ Implemented formats include:
1616
* 005010X212 Claim Status
1717
* 005010X221 Claim Payment
1818
* 005010X222 Professional Claim
19+
* 05010X223 Institutional Claim
1920
* 005010X279 Eligibility
2021

2122
Future formats include:
2223
* 005010X217 Services Review
2324
* 005010X218 Premium Payment
2425
* 005010X220 Enrollment and Maintenance
25-
* 05010X223 Institutional Claim
2626
* 005010X224 Dental Claim
2727

2828
This project is currently under construction. Please refer to the [LinuxForHealth X12 Issue Board](https://github.com/LinuxForHealth/x12/issues) to review current issues and progress.

Diff for: demo-file/demo.837i

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
ISA*03*9876543210*01*9876543210*30*000000005 *30*12345 *131031*1147*^*00501*000000907*1*T*:~
2+
GS*HC*000000005*54321*20131031*1147*1*X*005010X223A3~
3+
ST*837*987654*005010X223A3~
4+
BHT*0019*00*0123*19960918*0932*CH~
5+
NM1*41*2*JONES HOSPITAL*****46*12345~
6+
PER*IC*JANE DOE*TE*9005555555~
7+
NM1*40*2*MEDICARE*****46*00120~
8+
HL*1**20*1~
9+
PRV*BI*PXC*203BA0200N~
10+
NM1*85*2*JONES HOSPITAL*****XX*9876540809~
11+
N3*225 MAIN STREET BARKLEY BUILDING~
12+
N4*CENTERVILLE*PA*17111~
13+
REF*EI*567891234~
14+
HL*2*1*22*0~
15+
SBR*P*18*******MB~
16+
NM1*IL*1*DOE*JON*T***MI*030005074A~
17+
N3*125 CITY AVENUE~
18+
N4*CENTERVILLE*PA*17111~
19+
DMG*D8*19261111*M~
20+
NM1*PR*2*MEDICARE B*****PI*00435~
21+
REF*G2*330127~
22+
CLM*756048Q*89.93***14:A:1*Y*A*Y*Y~
23+
DTP*434*D8*19960911~
24+
CL1*3**01~
25+
HI*BK:3669~
26+
HI*BF:4019*BF:79431~
27+
HI*BH:A1:D8:19261111*BH:A2:D8:19911101*BH:B1:D8:19261111*BH:B2:D8:19870101~
28+
HI*BE:A2:::15.31~
29+
HI*BG:09~
30+
NM1*71*1*JONES*JOHN*J~
31+
REF*1G*B99937~
32+
SBR*S*01*351630*STATE TEACHERS*****CI~
33+
OI***Y***Y~
34+
NM1*IL*1*DOE*JANE*S***MI*222004433~
35+
N3*125 CITY AVENUE~
36+
N4*CENTERVILLE*PA*17111~
37+
NM1*PR*2*STATE TEACHERS*****PI*1135~
38+
LX*1~
39+
SV2*0305*HC:85025*13.39*UN*1.00~
40+
DTP*472*D8*19960911~
41+
LX*2~
42+
SV2*0730*HC:93005*76.54*UN*3.00~
43+
DTP*472*D8*19960911~
44+
SE*42*987654~
45+
GE*1*1~
46+
IEA*1*000000907~

Diff for: src/tests/eligibility/test_270_005010X279A1.py

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
Tests use-cases for the 270 005010X279A1 (Eligibility Inquiry) transaction
33
"""
44

5-
from x12.io import X12ModelReader
65
import pytest
76
from tests.support import assert_eq_model, resources_directory
87
import os

Diff for: src/tests/eligibility/test_271_005010X279A1.py

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
"""
22
Tests use-cases for the 271 005010X279A1 (Eligibility Benefit Response) transaction
33
"""
4-
from x12.io import X12ModelReader
54
import pytest
65
from tests.support import assert_eq_model, resources_directory
76
import os

Diff for: src/tests/healthcare_claim_institutional/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
"""
2+
test_837_005010XX223A3.py
3+
"""
4+
import pytest
5+
from tests.support import assert_eq_model, resources_directory
6+
import os
7+
8+
9+
@pytest.fixture
10+
def resource_path() -> str:
11+
return os.path.join(resources_directory, "837_005010X223A3")
12+
13+
14+
@pytest.mark.parametrize(
15+
"file_name",
16+
[
17+
"institutional-claim.837i",
18+
"out-of-network-repriced-claim.837i",
19+
"ppo-repriced-claim.837i",
20+
"two-claims-single-provider.837i",
21+
],
22+
)
23+
def test_837i_model(resource_path, file_name: str):
24+
x12_file_path = os.path.join(resource_path, file_name)
25+
assert os.path.exists(x12_file_path)
26+
assert_eq_model(x12_file_path)

Diff for: src/tests/healthcare_claim_professional/test_837_005010X222A2.py

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import pytest
55
from tests.support import assert_eq_model, resources_directory
66
import os
7-
from x12.io import X12ModelReader
87

98

109
@pytest.fixture
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
ISA*03*9876543210*01*9876543210*30*000000005 *30*12345 *131031*1147*^*00501*000000907*1*T*:~
2+
GS*HC*000000005*54321*20131031*1147*1*X*005010X223A3~
3+
ST*837*987654*005010X223A3~
4+
BHT*0019*00*0123*19960918*0932*CH~
5+
NM1*41*2*JONES HOSPITAL*****46*12345~
6+
PER*IC*JANE DOE*TE*9005555555~
7+
NM1*40*2*MEDICARE*****46*00120~
8+
HL*1**20*1~
9+
PRV*BI*PXC*203BA0200N~
10+
NM1*85*2*JONES HOSPITAL*****XX*9876540809~
11+
N3*225 MAIN STREET BARKLEY BUILDING~
12+
N4*CENTERVILLE*PA*17111~
13+
REF*EI*567891234~
14+
HL*2*1*22*0~
15+
SBR*P*18*******MB~
16+
NM1*IL*1*DOE*JON*T***MI*030005074A~
17+
N3*125 CITY AVENUE~
18+
N4*CENTERVILLE*PA*17111~
19+
DMG*D8*19261111*M~
20+
NM1*PR*2*MEDICARE B*****PI*00435~
21+
REF*G2*330127~
22+
CLM*756048Q*89.93***14:A:1*Y*A*Y*Y~
23+
DTP*434*D8*19960911~
24+
CL1*3**01~
25+
HI*BK:3669~
26+
HI*BF:4019*BF:79431~
27+
HI*BH:A1:D8:19261111*BH:A2:D8:19911101*BH:B1:D8:19261111*BH:B2:D8:19870101~
28+
HI*BE:A2:::15.31~
29+
HI*BG:09~
30+
NM1*71*1*JONES*JOHN*J~
31+
REF*1G*B99937~
32+
SBR*S*01*351630*STATE TEACHERS*****CI~
33+
OI***Y***Y~
34+
NM1*IL*1*DOE*JANE*S***MI*222004433~
35+
N3*125 CITY AVENUE~
36+
N4*CENTERVILLE*PA*17111~
37+
NM1*PR*2*STATE TEACHERS*****PI*1135~
38+
LX*1~
39+
SV2*0305*HC:85025*13.39*UN*1.00~
40+
DTP*472*D8*19960911~
41+
LX*2~
42+
SV2*0730*HC:93005*76.54*UN*3.00~
43+
DTP*472*D8*19960911~
44+
SE*42*987654~
45+
GE*1*1~
46+
IEA*1*000000907~
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
ISA*03*9876543210*01*9876543210*30*000000005 *30*12345 *131031*1147*^*00501*000000907*1*T*:~
2+
GS*HC*000000005*54321*20131031*1147*1*X*005010X223A3~
3+
ST*837*1024*005010X223A3~
4+
BHT*0019*00*1024*20050711*1335*CH~
5+
NM1*41*2*REGIONAL PPO NETWORK*****46*123456789~
6+
PER*IC*SUBMITTER CONTACT INFO*TE*8001231234~
7+
NM1*40*2*CONSERVATIVE INSURANCE COMPANY*****46*000110002~
8+
HL*1**20*1~
9+
NM1*85*2*LOCAL HOSPITAL*****XX*1122334455~
10+
N3*3423 SMALL STREET~
11+
N4*COLUMBUS*OH*432150000~
12+
REF*EI*111002222~
13+
HL*2*1*22*0~
14+
SBR*P*18*34561W******CI~
15+
NM1*IL*1*SMITH*JAMES*A***MI*34902390F~
16+
N3*934 NORTH STREET~
17+
N4*COLUMBUS*OH*432150000~
18+
DMG*D8*19621015*M~
19+
NM1*PR*2*CONSERVATIVE INSURANCE*****PI*0012~
20+
CLM*W392-49141*14.84***13>A>1*Y*A*Y*Y~
21+
DTP*434*RD8*20050617-20050617~
22+
DTP*435*DT*200506170800~
23+
CL1*1*1*01~
24+
AMT*F3*14.84~
25+
REF*9A*459804390823~
26+
REF*D9*32423466233~
27+
HI*BK>53081~
28+
HCP*00*0.00**333001234*********T1~
29+
NM1*71*1*RIVERS*DAWN****XX*2244224455~
30+
LX*1~
31+
SV2*0301*HC>82270*14.84*UN*1.00~
32+
DTP*472*D8*20050617~
33+
SE*31*1024~
34+
GE*1*1~
35+
IEA*1*000000907~
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
ISA*03*9876543210*01*9876543210*30*000000005 *30*12345 *131031*1147*^*00501*000000907*1*T*:~
2+
GS*HC*000000005*54321*20131031*1147*1*X*005010X223A3~
3+
ST*837*1002*005010X223A3~
4+
BHT*0019*00*1002*20050721*09460000*CH~
5+
NM1*41*2*REGIONAL PPO NETWORK*****46*123456789~
6+
PER*IC*SUBMITTER CONTACT INFO*TE*8001231234~
7+
NM1*40*2*LOCAL INSURANCE COMPANY*****46*54334452~
8+
HL*1**20*1~
9+
NM1*85*2*GOOD HEALTH HOSPITAL*****XX*1257234346~
10+
N3*592 NORTH ELM STREET~
11+
N4*EDGEWOOD*AZ*860015590~
12+
REF*EI*344232321~
13+
HL*2*1*22*1~
14+
SBR*P**46522567AW******CI~
15+
NM1*IL*1*JONES*JENNY****MI*345U8423H~
16+
N3*4512 WEST AVENUE~
17+
N4*EVANSVILLE*AZ*863030000~
18+
DMG*D8*19690731*F~
19+
NM1*PR*2*LOCAL INSURANCE COMPANY*****PI*7452723~
20+
HL*3*2*23*0~
21+
PAT*19~
22+
NM1*QC*1*JONES*JOY~
23+
N3*4512 WEST AVENUE~
24+
N4*EVANSVILLE*AZ*863030000~
25+
DMG*D8*19980820*F~
26+
CLM*456DFH43*237.50***13>A>1*Y*A*Y*Y~
27+
DTP*434*RD8*20050706-20050706~
28+
DTP*435*DT*200507060800~
29+
CL1*1*2*01~
30+
AMT*F3*237.50~
31+
REF*9A*09459034092~
32+
REF*D9*04566877634343456~
33+
HI*BK>38181~
34+
HI*BF>38900~
35+
HI*BH>11>D8>20050706~
36+
HCP*03*182.88*54.62*123456789~
37+
NM1*71*1*JOHNSON*SIMON****XX*5544332211~
38+
SBR*S*19*T&T PLUMBING COMPANY******CI~
39+
OI***Y***Y~
40+
NM1*IL*1*JONES*GEORGE****MI*56454566~
41+
NM1*PR*2*OTHER COVERAGE COMPANY*****PI*534524~
42+
LX*1~
43+
SV2*0471*HC>92557*178.00*UN*1.00~
44+
DTP*472*D8*20050706~
45+
HCP*03*137.06*40.94~
46+
LX*2~
47+
SV2*0471*HC>92567*59.50*UN*1.00~
48+
DTP*472*D8*20050706~
49+
HCP*03*45.82*13.68~
50+
SE*48*1002~
51+
GE*1*1~
52+
IEA*1*000000907~
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
ISA*03*9876543210*01*9876543210*30*000000005 *30*12345 *131031*1147*^*00501*000000907*1*T*:~
2+
GS*HC*000000005*54321*20131031*1147*1*X*005010X223A3~
3+
ST*837*987654*005010X223A3~
4+
BHT*0019*00*0123*20050630*0932*CH~
5+
NM1*41*2*JONES HOSPITAL*****46*12345~
6+
PER*IC*JANE DOE*TE*1112223333~
7+
NM1*40*2*TRICARE*****46*99999~
8+
HL*1**20*1~
9+
PRV*BI*PXC*282N00000X~
10+
NM1*85*2*JONES HOSPITAL*****XX*1234567890~
11+
N3*225 MAIN STREET~
12+
N4*ANYWHERE*PA*17111~
13+
REF*EI*123456789~
14+
HL*2*1*22*0~
15+
SBR*P*18*******CH~
16+
NM1*IL*1*DOE*JON*T***MI*030005074~
17+
N3*125 CITY AVENUE~
18+
N4*CENTERVILLE*PA*17111~
19+
DMG*D8*19681111*M~
20+
NM1*PR*2*TRICARE*****PI*99999~
21+
CLM*756048Q*89.95***13:A:1*Y*C*Y*Y~
22+
DTP*434*RD8*20050315-20050315~
23+
CL1*1**01~
24+
HI*BK:3669~
25+
HI*BF:4019*BF:79431~
26+
NM1*71*1*JONES*JOHN*J***XX*1122334455~
27+
REF*1G*U12345~
28+
LX*1~
29+
SV2*0305*HC:85025*13.39*UN*1.00~
30+
DTP*472*D8*20050315~
31+
LX*2~
32+
SV2*0730*HC:93005*76.56*UN*3.00~
33+
DTP*472*D8*20050315~
34+
HL*3*1*22*0~
35+
SBR*P*18*******CH~
36+
NM1*IL*1*SMITH*JOE****MI*123405074~
37+
N3*5 MAIN STREET~
38+
N4*ANYWHERE*PA*17111~
39+
DMG*D8*19621210*M~
40+
NM1*PR*2*TRICARE*****PI*99999~
41+
CLM*756049Q*50.00***13:A:1*Y*C*Y*Y~
42+
DTP*434*RD8*20050401-20050401~
43+
CL1*1**01~
44+
HI*BK:30000~
45+
NM1*71*1*JONES*JUDY*J***XX*9999999999~
46+
PRV*AT*PXC*363LP0200N~
47+
LX*1~
48+
SV2*0300*HC:85087*50.00*UN*1.00~
49+
DTP*472*D8*20050401~
50+
SE*48*987654~
51+
GE*1*1~
52+
IEA*1*000000907~

Diff for: src/tests/test_segments.py

+22
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ def test_clp_segment():
106106
assert clp_segment.x12() == "CLP*7722337*1*211366.97*138018.40**12*119932404007801~"
107107

108108

109+
def test_cl1_segment():
110+
segment_data = {
111+
"admission_type_code": "1",
112+
"admission_source_code": "7",
113+
"patient_status_code": "30",
114+
}
115+
116+
cl1_segment: Cl1Segment = Cl1Segment(**segment_data)
117+
assert cl1_segment.x12() == "CL1*1*7*30~"
118+
119+
109120
def test_cn1_segment():
110121
segment_data = {"contract_type_code": "02", "contract_amount": "550"}
111122

@@ -636,6 +647,17 @@ def test_sv1_segment():
636647
assert sv1_segment.x12() == "SV1*HC:99213*40.00*UN*1.00***1~"
637648

638649

650+
def test_sv2_segment():
651+
segment_data = {
652+
"service_line_revenue_code": "0120",
653+
"line_item_charge_amount": "1500.00",
654+
"measurement_code": "DA",
655+
"service_unit_count": "5.00",
656+
}
657+
sv2_segment: Sv2Segment = Sv2Segment(**segment_data)
658+
assert sv2_segment.x12() == "SV2*0120**1500.00*DA*5.00~"
659+
660+
639661
def test_sv5_segment():
640662
segment_data = {
641663
"product_service_id_qualifier": "HC:A4631",

Diff for: src/tests/test_support.py

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ def test_parser_interchange_date():
6868

6969
def test_parse_x12_date():
7070
assert parse_x12_date("20120501") == datetime.date(2012, 5, 1)
71+
assert parse_x12_date("201205011010") == datetime.datetime(2012, 5, 1, 10, 10)
7172
assert parse_x12_date("") is None
7273
assert parse_x12_date(None) is None
7374

Diff for: src/x12/models.py

+4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class X12SegmentName(str, Enum):
4040
CAS = "CAS"
4141
CLM = "CLM"
4242
CLP = "CLP"
43+
CL1 = "CL1"
4344
CN1 = "CN1"
4445
CR1 = "CR1"
4546
CR2 = "CR2"
@@ -95,6 +96,7 @@ class X12SegmentName(str, Enum):
9596
STC = "STC"
9697
SVC = "SVC"
9798
SV1 = "SV1"
99+
SV2 = "SV2"
98100
SV5 = "SV5"
99101
SVD = "SVD"
100102
TRN = "TRN"
@@ -149,6 +151,8 @@ def x12(self) -> str:
149151
x12_values.append(v)
150152
elif isinstance(v, list):
151153
x12_values.append(self._process_multivalue_field(k, v))
154+
elif isinstance(v, datetime.datetime):
155+
x12_values.append(v.strftime("%Y%m%d%H%M"))
152156
elif isinstance(v, datetime.date):
153157
x12_values.append(v.strftime("%Y%m%d"))
154158
elif isinstance(v, datetime.time):

0 commit comments

Comments
 (0)