diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index a5ea618c..d8262869 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -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, )