diff --git a/src/types/index.ts b/src/types/index.ts index 6daabc3..7ae5af6 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -69,6 +69,19 @@ export interface Remittance { * payload small; the detail endpoint (`/api/remittances/{id}`) populates it. */ adjustments?: CasAdjustment[]; + /** + * SP7: per-line 835 SVC composites on this remittance. Ordered by + * ``lineNumber``. Each SLP carries the per-line CAS adjustments under + * ``serviceLinePayments[i].adjustments`` via the line-reconciliation + * endpoint, or via a follow-up CAS query in the remit drawer. + */ + serviceLinePayments?: ServiceLinePayment[]; + /** + * SP7: CLP-level (claim-level) CAS bucket — adjustments that were + * not attached to any SVC composite. Powers the ClaimLevelAdjustments + * panel in the remit drawer. + */ + claimLevelAdjustments?: RemittanceClaimLevelAdjustment[]; } /** @@ -563,6 +576,15 @@ export interface ClaimDetail { rawSegments: string[][]; matchedRemittance: ClaimDetailMatchedRemittance | null; stateHistory: ClaimDetailStateHistoryEvent[]; + /** + * SP7: per-line reconciliation slim projection. Parallel to + * ``serviceLines`` and indexed by ``lineNumber``. Populated by the + * claim-detail endpoint so the ServiceLinesTable can render Paid + + * Adjustments columns without a second fetch. ``paid`` / + * ``adjustmentsSum`` are null when the line has no matched 835 SVC + * composite. + */ + lineReconciliation: ClaimDetailLineReconciliation[]; } // --------------------------------------------------------------------------- @@ -640,3 +662,116 @@ export interface BatchDiff { changed: BatchDiffChangedRow[]; summary: BatchDiffSummary; } + +// --------------------------------------------------------------------------- +// SP7 — Per-Service-Line Adjustment Audit types. +// See docs/superpowers/specs/2026-06-20-cyclone-line-reconciliation-design.md +// --------------------------------------------------------------------------- + +/** One 835 SVC composite (Loop 2110) projected to wire shape. */ +export interface ServiceLinePayment { + id: number; + lineNumber: number; + procedureQualifier: string; + procedureCode: string; + modifiers: string[]; + charge: string; + payment: string; + units: string | null; + unitType: string | null; + serviceDate: string | null; +} + +/** Status of one line on either side of a reconciliation. */ +export type LineReconciliationStatus = + | "matched" + | "unmatched_835_only" + | "unmatched_837_only" + | "superseded"; + +/** Slim per-line projection embedded in `GET /api/claims/{id}`. */ +export interface ClaimDetailLineReconciliation { + lineNumber: number; + status: LineReconciliationStatus; + paid: string | null; + adjustmentsSum: string | null; +} + +/** Summary block at the top of the line-reconciliation response. */ +export interface LineReconciliationSummary { + billedTotal: string; + paidTotal: string; + adjustmentTotal: string; + matchedLines: number; + totalLines: number; +} + +/** One line in the line-reconciliation response. */ +export interface LineReconciliationRow { + claimServiceLine: { + lineNumber: number; + procedureQualifier: string; + procedureCode: string; + modifiers: string[]; + charge: string; + units: string | null; + unitType: string | null; + serviceDate: string | null; + } | null; + serviceLinePayment: ServiceLinePayment | null; + status: LineReconciliationStatus; + adjustments: Array<{ + groupCode: string; + reasonCode: string; + amount: string; + }>; +} + +/** Top-level shape of `GET /api/claims/{id}/line-reconciliation`. */ +export interface LineReconciliationResponse { + claimId: string; + summary: LineReconciliationSummary; + lines: LineReconciliationRow[]; +} + +/** One CLP-level (claim-level) CAS adjustment on a remittance. */ +export interface RemittanceClaimLevelAdjustment { + id: number; + groupCode: string; + reasonCode: string; + amount: string; + quantity: string | null; +} + +/** Counts embedded in inbox-lane rows for the `MatchedRemitCard` badge. */ +export interface MatchedRemittanceLineCounts { + matchedLines: number; + totalLines: number; +} + +/** Inbox-lane claim row carrying the matched-remittance block. */ +export interface InboxClaimRow { + id: string; + kind: "claim" | "remit"; + patientControlNumber: string; + chargeAmount: number | null; + payerId: string | null; + providerNpi: string | null; + state: string; + rejectionReason: string | null; + rejectedAt: string | null; + serviceDateFrom: string | null; + score: number | null; + scoreTier: string | null; + scoreBreakdown: { + patient: number; + date: number; + amount: number; + provider: number; + } | null; + matchedRemittance: { + id: string; + matchedLines: number; + totalLines: number; + } | null; +}