mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-07-12 13:29:04 +00:00
Property-type override beats the lodged EPC 🟩
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
f40abcedeb
commit
4967ddfb3e
1 changed files with 48 additions and 1 deletions
|
|
@ -12,6 +12,8 @@ from typing import Optional
|
|||
from pydantic import BaseModel, ConfigDict
|
||||
from sqlmodel import Session, col, select
|
||||
|
||||
from infrastructure.postgres.epc_property_table import EpcPropertyModel
|
||||
from infrastructure.postgres.property_override_table import PropertyOverrideRow
|
||||
from infrastructure.postgres.property_table import PropertyRow
|
||||
|
||||
|
||||
|
|
@ -54,8 +56,53 @@ def resolve_filtered_property_ids(
|
|||
if filters.postcodes is not None:
|
||||
statement = statement.where(col(PropertyRow.postcode).in_(filters.postcodes))
|
||||
rows = session.exec(statement).all()
|
||||
candidates = [row for row in rows if row.id is not None]
|
||||
|
||||
if filters.property_types is not None:
|
||||
wanted = set(filters.property_types)
|
||||
types = _resolved_property_types(
|
||||
session, [row.id for row in candidates if row.id is not None]
|
||||
)
|
||||
candidates = [
|
||||
row
|
||||
for row in candidates
|
||||
if row.id is not None and types.get(row.id) in wanted
|
||||
]
|
||||
|
||||
return [
|
||||
FilteredProperty(property_id=row.id, postcode=row.postcode)
|
||||
for row in rows
|
||||
for row in candidates
|
||||
if row.id is not None
|
||||
]
|
||||
|
||||
|
||||
def _resolved_property_types(
|
||||
session: Session, property_ids: list[int]
|
||||
) -> dict[int, str]:
|
||||
"""Each property's effective property_type per the ADR-0056 precedence:
|
||||
override (building_part 0) → lodged EPC."""
|
||||
overrides = session.exec(
|
||||
select(PropertyOverrideRow)
|
||||
.where(col(PropertyOverrideRow.property_id).in_(property_ids))
|
||||
.where(PropertyOverrideRow.building_part == 0)
|
||||
.where(PropertyOverrideRow.override_component == "property_type")
|
||||
).all()
|
||||
by_override = {o.property_id: o.override_value for o in overrides}
|
||||
|
||||
epcs = session.exec(
|
||||
select(EpcPropertyModel)
|
||||
.where(col(EpcPropertyModel.property_id).in_(property_ids))
|
||||
.where(EpcPropertyModel.source == "lodged")
|
||||
).all()
|
||||
by_lodged_epc = {
|
||||
epc.property_id: epc.property_type
|
||||
for epc in epcs
|
||||
if epc.property_id is not None and epc.property_type is not None
|
||||
}
|
||||
|
||||
resolved: dict[int, str] = {}
|
||||
for pid in property_ids:
|
||||
value = by_override.get(pid) or by_lodged_epc.get(pid)
|
||||
if value is not None:
|
||||
resolved[pid] = value
|
||||
return resolved
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue