From 61a12c43a03f022e68dd8164159d0ced9842ba0a Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Mon, 13 Jul 2026 14:56:53 +0000 Subject: [PATCH] =?UTF-8?q?Map=20a=20Calico=20roof-covering=20row=20to=20a?= =?UTF-8?q?=20renewal=20year=20=F0=9F=9F=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CalicoMapper maps each roof-covering row onto a ROOF element with a MATERIAL aspect, setting renewal_year = export_year + remaining_life (Calico's Decent-Homes-derived years-remaining anchored to the export year, so the absolute renewal year is stable across re-runs). source="Calico". Co-Authored-By: Claude Opus 4.8 (1M context) --- .../condition/mapping/calico/calico_mapper.py | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/domain/condition/mapping/calico/calico_mapper.py b/domain/condition/mapping/calico/calico_mapper.py index 446d8b8cb..fa127940d 100644 --- a/domain/condition/mapping/calico/calico_mapper.py +++ b/domain/condition/mapping/calico/calico_mapper.py @@ -1,11 +1,56 @@ -from typing import Any, Optional +from datetime import date +from typing import Any, List, Optional +from domain.condition.aspect_condition import AspectCondition +from domain.condition.element import Element +from domain.condition.mapping.calico.calico_element_map import CALICO_ELEMENT_MAP from domain.condition.mapping.mapper import Mapper from domain.condition.property_condition_survey import PropertyConditionSurvey +from domain.condition.records.calico.calico_asset_condition import CalicoAssetCondition +from domain.condition.records.calico.calico_property import CalicoProperty + +SOURCE = "Calico" class CalicoMapper(Mapper): def map_asset_conditions_for_property( self, client_property_data: Any, survey_year: Optional[int] = None ) -> PropertyConditionSurvey: - raise NotImplementedError + assert isinstance(client_property_data, CalicoProperty) + + elements: List[Element] = [] + for instance, asset in enumerate(client_property_data.assets, start=1): + mapping = CALICO_ELEMENT_MAP[asset.path] + elements.append( + Element( + element_type=mapping.elementType, + element_instance=instance, + aspect_conditions=[ + AspectCondition( + aspect_type=mapping.aspect_type, + aspect_instance=1, + value=asset.covering_type, + quantity=asset.quantity, + install_date=asset.fitted_date, + renewal_year=CalicoMapper._renewal_year( + asset, survey_year + ), + ) + ], + ) + ) + + return PropertyConditionSurvey( + uprn=client_property_data.uprn, + elements=elements, + date=date(survey_year, 1, 1) if survey_year else date(2000, 1, 1), + source=SOURCE, + ) + + @staticmethod + def _renewal_year( + asset: CalicoAssetCondition, survey_year: Optional[int] + ) -> Optional[int]: + if asset.remaining_life is None or survey_year is None: + return None + return survey_year + asset.remaining_life