feat(sp31): integrate content-keys fallback into reconcile.run() with auto_matched_835 event

This commit is contained in:
Nora
2026-07-02 15:58:01 -06:00
parent 9bade2429c
commit ab91449e62
2 changed files with 151 additions and 4 deletions
+34 -4
View File
@@ -372,7 +372,7 @@ def run(session, batch_id: str) -> ReconcileResult:
"""
from sqlalchemy import select
from cyclone.db import (
Batch, Claim, Remittance, CasAdjustment, Match, ActivityEvent,
Batch, Claim, Remittance, CasAdjustment, Match as MatchORM, ActivityEvent,
ClaimState,
)
@@ -390,6 +390,31 @@ def run(session, batch_id: str) -> ReconcileResult:
matches = match(unmatched_claims, new_remits)
# SP31: content-keys fallback for remits that PCN-exact couldn't pair.
# Operates on the still-unmatched remits so we don't double-match.
matched_remit_ids = {m.remittance.id for m in matches}
used_claim_ids = {m.claim.id for m in matches}
for remit in new_remits:
if remit.id in matched_remit_ids:
continue
if getattr(remit, "claim_id", None) is not None:
continue # already linked
matched_claim_id = _score_fallback_candidates(session, remit)
if matched_claim_id is None:
continue
# Find the claim object in the unmatched_claims list (it was loaded).
target_claim = next(
(c for c in unmatched_claims if c.id == matched_claim_id),
None,
)
if target_claim is None or target_claim.id in used_claim_ids:
continue
matches.append(Match(
claim=target_claim, remittance=remit,
strategy="score-auto", is_reversal=remit.is_reversal,
))
used_claim_ids.add(target_claim.id)
applied = 0
skipped = 0
for m in matches:
@@ -413,7 +438,7 @@ def run(session, batch_id: str) -> ReconcileResult:
skipped += 1
continue
session.add(Match(
session.add(MatchORM(
claim_id=m.claim.id, remittance_id=m.remittance.id,
strategy=m.strategy,
matched_at=datetime.now(timezone.utc),
@@ -431,10 +456,15 @@ def run(session, batch_id: str) -> ReconcileResult:
m.remittance.claim_id = m.claim.id
session.add(ActivityEvent(
ts=datetime.now(timezone.utc), kind=intent.activity_kind,
ts=datetime.now(timezone.utc),
kind=("auto_matched_835" if m.strategy == "score-auto" else intent.activity_kind),
batch_id=batch_id, claim_id=m.claim.id,
remittance_id=m.remittance.id,
payload_json={"new_state": m.claim.state.value},
payload_json=(
{"new_state": m.claim.state.value, "strategy": m.strategy}
if m.strategy == "score-auto"
else {"new_state": m.claim.state.value}
),
))
applied += 1