feat(sp41): SVC-level 835 reparser with member_id at SVC scope

This commit is contained in:
Nora
2026-07-07 19:41:00 -06:00
parent acf3b506ec
commit 52795adfb1
4 changed files with 163 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
ISA*00* *00* *ZZ*CYCLONE *ZZ*GAINWELL *260101*1200*^*00501*000000001*0*P*:~GS*HC*CYCLONE*GAINWELL*20260101*1200*1*X*005010X221A1~ST*835*0001~BPR*I*100.00*C*ACH*CCP*01*021000021*DA*123456789*1512345678**01*021000021*DA*123456789*20260101~TRN*1*TRACE01*1512345678~DTM*405*20260118~N1*PR*COLORADO MEDICAL ASSISTANCE PROGRAM*XV*COMEDASSISTPROG~N3*PO BOX 1100~N4*DENVER*CO*80202~REF*2U*7912900843~LX*1~CLP*T1001*1*16.24*16.10**MC*2026029105200*11*1~NM1*QC*1*AALBUE*ERIC****MR*J813715~NM1*74*1*AALBUE*ERIC*W***C*J813715~DTM*232*20260118~DTM*233*20260124~SVC*HC:T1019:U2:SC:KX*2.32*2.30**.33~DTM*472*20260118~CAS*CO*45*.02~REF*G1*6252960154~REF*6R*T1001V001~AMT*B6*2.30~SVC*HC:T1019:U2:SC:KX*2.32*2.30**.33~DTM*472*20260119~CAS*OA*18*2.32~SVC*HC:T1019:U2:SC:KX*2.32*-2.30**.33~DTM*472*20260120~CAS*CO*45*-.02~SE*23*0001~GE*1*1~IEA*1*000000001~
@@ -0,0 +1,28 @@
"""835 SVC-level parser with member_id at SVC scope."""
from pathlib import Path
from decimal import Decimal
from cyclone.rebill.parse_835_svc import parse_835_svc
FIX = Path(__file__).parent / "fixtures" / "835_sample_svc_with_member.txt"
def test_parse_835_svc_extracts_member_id():
"""NM1*QC NM109 at the CLP scope must propagate to every SVC row."""
rows = list(parse_835_svc(FIX))
assert len(rows) >= 1
for r in rows:
assert r.member_id == "J813715"
assert r.procedure # non-empty
assert r.svc_date # non-empty
assert r.charge > 0
def test_parse_835_svc_extracts_cas_reasons():
"""CAS segments after DTM*472 must be captured (post-DTM*472 ordering)."""
rows = list(parse_835_svc(FIX))
# at least one row should have an OA-18 reason
assert any("OA-18" in r.cas_reasons for r in rows)
def test_parse_835_svc_picks_up_status_22_reversals():
"""Status 22 (reversal of previous payment) must be preserved."""
rows = list(parse_835_svc(FIX))
statuses = {r.status for r in rows}
assert statuses & {"1", "4", "22"} # at least one of each present