Get building part roof insulation information from Roof Space section 🟩

This commit is contained in:
Daniel Roth 2026-04-20 13:00:32 +00:00
parent b9bb580ebd
commit 857ab52815

View file

@ -1,5 +1,5 @@
from datetime import date
from typing import List, Sequence, Union
from typing import List, Optional, Sequence, Union
from datatypes.epc.domain.epc_property_data import (
EnergyElement,
@ -55,9 +55,11 @@ from datatypes.epc.surveys.pashub_rdsap_site_notes import (
BuildingMeasurements,
ExtensionConstruction,
ExtensionMeasurements,
ExtensionRoofSpace,
FloorMeasurement,
HeatingAndHotWater,
PasHubRdSapSiteNotes,
RoofSpaceDetail,
Ventilation,
Window,
)
@ -91,13 +93,15 @@ class EpcPropertyDataMapper:
renewables = survey.renewables
room_counts = survey.room_count_elements
sap_building_parts = [_map_main_building_part(construction, measurements)]
roof_space = survey.roof_space
sap_building_parts = [_map_main_building_part(construction, measurements, roof_space.main_building)]
if construction.extensions and measurements.extensions:
for ext_c in construction.extensions:
matching = [m for m in measurements.extensions if m.id == ext_c.id]
if matching:
matching_m = [m for m in measurements.extensions if m.id == ext_c.id]
matching_r = [r for r in (roof_space.extensions or []) if r.id == ext_c.id]
if matching_m:
sap_building_parts.append(
_map_extension_building_part(ext_c, matching[0])
_map_extension_building_part(ext_c, matching_m[0], matching_r[0] if matching_r else None)
)
total_floor_area = round(
@ -1428,11 +1432,20 @@ def _map_floor_dimensions(floors: List[FloorMeasurement]) -> List[SapFloorDimens
]
def _map_roof(roof: Optional[Union[RoofSpaceDetail, ExtensionRoofSpace]]) -> tuple[Optional[str], Optional[Union[str, int]]]:
if roof is None:
return None, None
thickness: Optional[Union[str, int]] = roof.insulation_thickness_mm if roof.insulation_thickness_mm is not None else roof.insulation_thickness
return roof.insulation_at or None, thickness
def _map_main_building_part(
construction: BuildingConstruction,
measurements: BuildingMeasurements,
roof: RoofSpaceDetail,
) -> SapBuildingPart:
main = construction.main_building
roof_location, roof_thickness = _map_roof(roof)
return SapBuildingPart(
identifier="main",
construction_age_band=_extract_age_band(main.age_range),
@ -1442,13 +1455,17 @@ def _map_main_building_part(
party_wall_construction=main.party_wall_construction_type,
sap_floor_dimensions=_map_floor_dimensions(measurements.main_building.floors),
wall_thickness_mm=main.wall_thickness_mm,
roof_insulation_location=roof_location,
roof_insulation_thickness=roof_thickness,
)
def _map_extension_building_part(
ext_c: ExtensionConstruction,
ext_m: ExtensionMeasurements,
roof: Optional[ExtensionRoofSpace],
) -> SapBuildingPart:
roof_location, roof_thickness = _map_roof(roof)
return SapBuildingPart(
identifier=f"extension_{ext_c.id}",
construction_age_band=_extract_age_band(ext_c.age_range),
@ -1458,6 +1475,8 @@ def _map_extension_building_part(
party_wall_construction=ext_c.party_wall_construction_type,
sap_floor_dimensions=_map_floor_dimensions(ext_m.floors),
wall_thickness_mm=ext_c.wall_thickness_mm,
roof_insulation_location=roof_location,
roof_insulation_thickness=roof_thickness,
)