fix(backend): spec-bug fixes for T10 — Match.claim_id non-unique + reconcile test dates

Three spec-bug fixes from T10 implementation:

- Match.claim_id: drop UNIQUE constraint (T4 schema error) — reversals add a 2nd row per claim (audit trail). Add explicit non-unique index ix_matches_claim_id to preserve query performance. Mirrored in ORM and migration 0001_initial.sql.
- test_run_orphan_remit_leaves_claim_unmatched: claim PCN-A does not match remit PCN-NEW, so unmatched_claims must be 1, not 0.
- test_run_reversal_flips_paid_to_reversed: claim service_date_from was 9 days before reversal remit service_date (outside default 7-day window) so no match occurred; changed to 5 days apart so match() picks the claim.
- test_match_unique_per_claim: in test_db_models.py asserted the now-removed UNIQUE behavior; renamed and inverted to assert the audit-trail design (two Match rows per claim allowed).
This commit is contained in:
Tyler
2026-06-19 22:59:20 -06:00
parent 8c92ef43bd
commit 6a65c2b750
4 changed files with 29 additions and 12 deletions
+5 -1
View File
@@ -287,9 +287,12 @@ class Match(Base):
__tablename__ = "matches"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
# Spec-bug fix (T10): not unique — a reversal adds a 2nd Match row
# for the same claim (original payment + reversal). The design intent
# is an audit trail.
claim_id: Mapped[str] = mapped_column(
String(64), ForeignKey("claims.id", ondelete="CASCADE"),
nullable=False, unique=True,
nullable=False,
)
remittance_id: Mapped[str] = mapped_column(
String(64), ForeignKey("remittances.id", ondelete="CASCADE"), nullable=False
@@ -302,6 +305,7 @@ class Match(Base):
is_reversal: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False)
__table_args__ = (
Index("ix_matches_claim_id", "claim_id"), # non-unique: reversals add a 2nd row
Index("ix_matches_remittance_id", "remittance_id"),
Index("ix_matches_matched_at", "matched_at"),
)
@@ -64,13 +64,16 @@ CREATE INDEX ix_cas_adjustments_remittance_id ON cas_adjustments(remittance_id);
CREATE TABLE matches (
id INTEGER PRIMARY KEY AUTOINCREMENT,
claim_id TEXT NOT NULL UNIQUE REFERENCES claims(id) ON DELETE CASCADE,
-- Spec-bug fix (T10): not UNIQUE — a reversal adds a 2nd Match row for
-- the same claim (original payment + reversal). Audit trail design.
claim_id TEXT NOT NULL REFERENCES claims(id) ON DELETE CASCADE,
remittance_id TEXT NOT NULL REFERENCES remittances(id) ON DELETE CASCADE,
strategy TEXT NOT NULL,
matched_at DATETIME NOT NULL,
prior_claim_state TEXT,
is_reversal INTEGER NOT NULL DEFAULT 0
);
CREATE INDEX ix_matches_claim_id ON matches(claim_id);
CREATE INDEX ix_matches_remittance_id ON matches(remittance_id);
CREATE INDEX ix_matches_matched_at ON matches(matched_at);