feat(sp10): 277CA parser + Payer-Rejected Inbox lane
- Add cyclone.parsers.models_277ca + parse_277ca (X12 005010X214)
- Per-Patient HL ClaimStatus with REF*1K (PCN), REF*EJ (tax ID),
STC category code, amount, service date
- STC classifier: A1-A3 accepted, A4/A6/A7 rejected, A8/A9 pended,
P1-P5 paid, anything else unknown
- Multiple STCs per Patient HL: last wins (canonical pattern for
'first pended, then paid' acknowledgments)
- Subscriber-level STCs surface in unscoped_statuses
- Add apply_277ca_rejections — stamps Claim.payer_rejected_* fields on
matching rows (lookup by patient_control_number, mirrors 999 path)
- New /api/parse-277ca, /api/277ca-acks, /api/277ca-acks/{id} endpoints
- New two77ca_acks table + Two77caAck ORM model
- New Claim columns: payer_rejected_at, _reason, _status_code, _by_277ca_id
- New payer_rejected lane in /api/inbox/lanes (distinct from 999
envelope rejected lane)
- New PayerConfig277CA block in config/payers.yaml + Pydantic model
- Migration 0008 bumps user_version to 8
Tests: 654 -> 688 (parser 22 + apply 6 + API 8 + config 6 + adjustments).
All 688 backend tests pass; 1 pre-existing skipped test class unaffected.
This commit is contained in:
@@ -47,11 +47,14 @@ def _seed_batch() -> None:
|
||||
s.commit()
|
||||
|
||||
|
||||
def test_lanes_endpoint_returns_four_keys(client: TestClient):
|
||||
def test_lanes_endpoint_returns_five_keys(client: TestClient):
|
||||
"""SP10 added the payer_rejected lane (distinct from 999 envelope rejection)."""
|
||||
r = client.get("/api/inbox/lanes")
|
||||
assert r.status_code == 200
|
||||
body = r.json()
|
||||
assert set(body.keys()) == {"rejected", "candidates", "unmatched", "done_today"}
|
||||
assert set(body.keys()) == {
|
||||
"rejected", "payer_rejected", "candidates", "unmatched", "done_today",
|
||||
}
|
||||
for v in body.values():
|
||||
assert isinstance(v, list)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user