From 9509306e3d8621f5346daabdf94c5fa70cc552e3 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 27 Jan 2026 13:08:35 +0000 Subject: [PATCH] =?UTF-8?q?Add=20aspect=20instance=20to=20asset=20conditio?= =?UTF-8?q?n=20and=20modify=20how=20peabody=20walls=20are=20mapped=20?= =?UTF-8?q?=F0=9F=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/condition/domain/asset_condition.py | 4 +- .../domain/mapping/element_mapping.py | 1 + .../mapping/peabody/peabody_element_map.py | 2 +- .../tests/mapping/test_peabody_mapper.py | 114 ++++++++++++++++++ 4 files changed, 118 insertions(+), 3 deletions(-) diff --git a/backend/condition/domain/asset_condition.py b/backend/condition/domain/asset_condition.py index 1b157a6b..8b054f45 100644 --- a/backend/condition/domain/asset_condition.py +++ b/backend/condition/domain/asset_condition.py @@ -13,6 +13,8 @@ class AssetCondition: element: Element aspect_type: AspectType + element_instance: Optional[int] = None + aspect_instance: Optional[int] = None value: Optional[str] = None @@ -20,7 +22,5 @@ class AssetCondition: install_date: Optional[date] = None renewal_year: Optional[int] = None - element_instance: Optional[int] = None - source_system: Optional[str] = None comments: Optional[str] = None diff --git a/backend/condition/domain/mapping/element_mapping.py b/backend/condition/domain/mapping/element_mapping.py index 01e1f316..c93862c8 100644 --- a/backend/condition/domain/mapping/element_mapping.py +++ b/backend/condition/domain/mapping/element_mapping.py @@ -10,3 +10,4 @@ class ElementMapping: element: Element aspect_type: AspectType element_instance: Optional[int] = None + aspect_instance: Optional[int] = None diff --git a/backend/condition/domain/mapping/peabody/peabody_element_map.py b/backend/condition/domain/mapping/peabody/peabody_element_map.py index 2485136b..1f9cceee 100644 --- a/backend/condition/domain/mapping/peabody/peabody_element_map.py +++ b/backend/condition/domain/mapping/peabody/peabody_element_map.py @@ -58,7 +58,7 @@ PEABODY_ELEMENT_MAP = { element=Element.GARAGE_WALLS, aspect_type=AspectType.MATERIAL ), (53, 23): ElementMapping( - element=Element.PRIMARY_WALL, aspect_type=AspectType.FINISH + element=Element.EXTERNAL_WALL, aspect_type=AspectType.FINISH ), (53, 30): ElementMapping( element=Element.SECONDARY_WALL, aspect_type=AspectType.FINISH diff --git a/backend/condition/tests/mapping/test_peabody_mapper.py b/backend/condition/tests/mapping/test_peabody_mapper.py index a975a308..9997dfa8 100644 --- a/backend/condition/tests/mapping/test_peabody_mapper.py +++ b/backend/condition/tests/mapping/test_peabody_mapper.py @@ -90,3 +90,117 @@ def test_peabody_mapper_maps_property(): for i, (actual, expected) in enumerate(zip(actual_assets, expected_assets)): assert actual == expected, f"Mismatch at index {i}" + + +def test_wall_primary_and_secondary_wall_finish_map_correctly(): + # arrange + peabody_property = PeabodyProperty( + uprn=1, + assets=[ + PeabodyAssetCondition( + lo_reference="1000RAND0000", + full_address="FLAT 1 RANDOM SQUARE FAKE STREET LONDON E1 1EE", + location_type_code=1, + parent_lo_reference="RAND1000", + element_code=53, + element="External", + sub_element_code=23, + sub_element="Primary Wall Finish", + material_code=4, + material_or_answer="Pointed", + renewal_quantity=65, + renewal_year=2045, + renewal_cost=3835, + cloned="N", + lo_type_code=1, + condition_survey_date=datetime(2024, 2, 15, 12, 47, 0), + ), + PeabodyAssetCondition( + lo_reference="1000RAND0000", + full_address="FLAT 1 RANDOM SQUARE FAKE STREET LONDON E1 1EE", + location_type_code=1, + parent_lo_reference="RAND1000", + element_code=120, + element="WALLS", + sub_element_code=2, + sub_element="Wall Finish", + material_code=1, + material_or_answer="Pointing", + renewal_quantity=1, + renewal_year=2069, + renewal_cost=2450, + cloned="N", + lo_type_code=1, + condition_survey_date=datetime(2014, 2, 15, 12, 47, 0), + ), + PeabodyAssetCondition( + lo_reference="1000RAND0000", + full_address="FLAT 1 RANDOM SQUARE FAKE STREET LONDON E1 1EE", + location_type_code=1, + parent_lo_reference="RAND1000", + element_code=53, + element="External", + sub_element_code=30, + sub_element="Secondary Wall Finish", + material_code=8, + material_or_answer="Tile Hung", + renewal_quantity=8, + renewal_year=2049, + renewal_cost=472, + cloned="N", + lo_type_code=1, + condition_survey_date=datetime(2014, 2, 15, 12, 47, 0), + ), + ], + ) + mapper = PeabodyMapper() + + expected_assets: List[AssetCondition] = [ + AssetCondition( + uprn=1, + element=Element.EXTERNAL_WALLS, + aspect_type=AspectType.FINISH, + value="Pointed", + element_instance=1, + aspect_instance=1, + quantity=65, + install_date=None, + renewal_year=2045, + source_system=None, + comments=None, + ), + AssetCondition( + uprn=1, + element=Element.EXTERNAL_WALLS, + aspect_type=AspectType.FINISH, + value="Pointing", + element_instance=1, + aspect_instance=1, + quantity=1, + install_date=None, + renewal_year=2069, + source_system=None, + comments=None, + ), + AssetCondition( + uprn=1, + element=Element.EXTERNAL_WALLS, + aspect_type=AspectType.FINISH, + value="Tile Hung", + element_instance=1, + aspect_instance=2, + quantity=8, + install_date=None, + renewal_year=2049, + source_system=None, + comments=None, + ), + ] + # act + actual_assets = mapper.map_asset_conditions_for_property(peabody_property) + + # assert + assert len(actual_assets) == len(expected_assets) + + for i, (actual, expected) in enumerate(zip(actual_assets, expected_assets)): + assert actual == expected, f"Mismatch at index {i}"