diff --git a/docs/reference/835.md b/docs/reference/835.md new file mode 100644 index 0000000..ab069dc --- /dev/null +++ b/docs/reference/835.md @@ -0,0 +1,86 @@ +# 835 — Electronic Remittance Advice (005010X221A1) + +The 835 transaction set carries payment and remittance information from a +payer (or its clearinghouse) to a provider, in response to previously +submitted 837P claims. Cyclone parses it into a `ParseResult835` and surfaces +the per-claim payment breakdown. + +## File format + +Same as 837P — ASCII text with the same four delimiters declared in `ISA`. + +## Envelope + +Same as 837P (`ISA/IEA/GS/GE/ST/SE`). + +## Loops + +| Loop | Contents | +|---|---| +| 1000A | Payer (N1*PR) | +| 1000B | Payee (N1*PE) | +| 2100 | Claim payment (CLP) | +| 2110 | Service payment (SVC) | + +## Header segments + +- `BPR` — financial information (credit/debit flag, total paid amount, account details) +- `TRN` — reassociation trace number +- `DTM` — production date + +## CLP — claim payment + +`CLP01` = payer claim control number; `CLP02` = status code; `CLP03` = total +claim charge; `CLP04` = total claim paid amount. + +| CLP02 | Meaning | +|---|---| +| 1 | Processed as Primary | +| 2 | Processed as Secondary | +| 3 | Processed as Tertiary | +| 4 | Denied | +| 19 | Processed as Primary, Forwarded | +| 20 | Processed as Secondary, Forwarded | +| 21 | Reversal of Previous Payment | +| 22 | Reversal of Previous Payment (Secondary) | +| 23 | Not Our Claim, Forwarded | +| 25 | Predetermination Pricing Only - No Payment | + +## Validation rules Cyclone enforces + +Rules are defined in `cyclone/parsers/validator_835.py` and registered on +`PayerConfig835` for the active payer. + +| Rule | Severity | Description | +|---|---|---| +| `R835_BPR01_handling_code_allowed` | error | `BPR01` ∈ `allowed_handling_codes` (e.g. `C`, `D`, `I`, `X`) | +| `R835_BPR02_positive` | error | `BPR02` (paid amount) must be `> 0` | +| `R835_BAL_BPR_vs_CLP04` | error | `BPR02` equals the sum of all `CLP04` (±$0.01) | +| `R835_BAL_CLP04_vs_SVC03` | error | Each `CLP04` equals the sum of its `SVC03` amounts (±$0.01) | +| `R835_CLP01_present` | error | `CLP01` (payer claim control number) is non-empty | +| `R835_CLP02_status_allowed` | error | `CLP02` ∈ `allowed_status_codes` | +| `R835_CLP03_present` | error | `CLP03` (total claim charge) must be `> 0` | +| `R835_PAYER_TAX_ID_matches` | warning | `BPR10` ∈ `expected_payer_tax_ids` | +| `R835_PAYER_HEALTH_PLAN_ID_matches` | warning | `N1*PR N104` matches `expected_payer_health_plan_id` | +| `R835_PAYEE_NPI_format` | error | Payee NPI must be 10 digits | +| `R835_REGN01_trn02_present` | error | `TRN02` (originating company id / payee TPID) is non-empty | + +## CAS — claim/service adjustment + +`CAS` segments carry reason codes (`CO` contractual obligation, `PR` patient +responsibility, `OA` other adjustments, `PI` payer-initiated reduction). +Cyclone preserves the raw `CAS` text in `raw_segments`; deep-parsing of +reason codes is sub-project 3. + +## CO Medicaid specifics + +- `BPR10` = `"81-1725341"` (TXIX / Medicaid) or `"84-0644739"` (BHA / behavioral health) +- `N1*PR` `N104` = `"7912900843"` — payer ID (Health Plan ID) +- `N1*PR` `N102` = `"CO_TXIX"` or `"CO_BHA"` — payer name +- Allowed `CLP02` codes: `{1, 2, 3, 4, 19, 20, 21, 22, 23, 25}` + +## Reconciliation (sub-project 2) + +Matching 835 payouts back to 837P submissions by patient control number + +date of service is deferred to sub-project 2. Cyclone currently stores the +835 output as-is.