feat(sp7): add per-line reconciliation + matched-remittance types
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user