Model the newer stored survey when refetching EPCs 🟩

Read stored lodged EPCs whatever refetch_epc says, so a stored assessment
can win the ADR-0001 Recency Tie-Break against the gov register.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Daniel Roth 2026-07-15 09:40:15 +00:00
parent 7a2f29027c
commit 870ec68dba
2 changed files with 20 additions and 10 deletions

View file

@ -607,11 +607,11 @@ def handler(
)
epc_repo = EpcPostgresRepository(read_session)
# Lodged EPCs are read by UPRN (keyed by UPRN below); predicted EPCs stay
# keyed on property_id.
stored_lodged_epcs: dict[int, EpcPropertyData] = (
epc_repo.get_for_properties(list(set(uprns.values())))
if not refetch_epc
else {}
# keyed on property_id. Read whatever refetch_epc says — the flag decides
# whether the gov register is consulted for a *candidate*, never whether a
# stored assessment can win the ADR-0001 Recency Tie-Break (#1589).
stored_lodged_epcs: dict[int, EpcPropertyData] = epc_repo.get_for_properties(
list(set(uprns.values()))
)
stored_predicted_epcs: dict[int, EpcPropertyData] = (
epc_repo.get_predicted_for_properties(property_ids)
@ -645,8 +645,15 @@ def handler(
stored_lodged = stored_lodged_epcs.get(uprn)
lodged_epc_is_new = False
if refetch_epc:
epc: Optional[EpcPropertyData] = epc_client.get_by_uprn(uprn)
lodged_epc_is_new = epc is not None
epc: Optional[EpcPropertyData] = None
epc, lodged_epc_is_new = _newer_lodged(
stored_lodged, epc_client.get_by_uprn(uprn)
)
if epc is not None and not lodged_epc_is_new:
logger.info(
f"property={pid} stored lodged EPC is newer than the "
f"fetched cert — keeping the stored assessment"
)
elif stored_lodged is not None:
logger.info(
f"property={pid} using stored lodged EPC (refetch_epc=False)"

View file

@ -1933,10 +1933,13 @@ def test_repredict_epc_false_without_stored_predicted_epc_falls_back_to_live_pre
stack.enter_context(
patch("applications.modelling_e2e.handler.run_modelling", return_value=mock_plan)
)
# No stored predicted EPC
stack.enter_context(
# Nothing stored: no predicted EPC, and no lodged EPC to win the
# tie-break against the register's None
mock_epc_repo = stack.enter_context(
patch("applications.modelling_e2e.handler.EpcPostgresRepository")
).return_value.get_predicted_for_properties.return_value = {}
).return_value
mock_epc_repo.get_predicted_for_properties.return_value = {}
mock_epc_repo.get_for_properties.return_value = {}
MockUoW = stack.enter_context(
patch("applications.modelling_e2e.handler.PostgresUnitOfWork")
)