diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index 8f55db80..efacc71b 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -1698,6 +1698,19 @@ class EpcPropertyDataMapper: if getattr(bp, "glazed_perimeter", None) is None ], sap_conservatory=_api_sap_conservatory(schema.sap_building_parts), + # ADR-0037 follow-up: 19.0 previously passed no `sap_ventilation=`, + # dropping the whole §2 block. The schema only lodges the top-level + # `mechanical_ventilation` enum + `built_form` (no fan/flue/vent + # counts — RdSAP uses Table-5 age defaults), so mirror just those + # two fields from 21.0.1. An MEV/MVHR cert that defaulted to NATURAL + # under-stated its ventilation heat loss; `sheltered_sides` (§S5) + # avoids the cascade's shelter default of 2. + sap_ventilation=SapVentilation( + sheltered_sides=_api_sheltered_sides(schema.built_form), + mechanical_ventilation_kind=_api_mechanical_ventilation_kind( + schema.mechanical_ventilation + ), + ), ) @staticmethod @@ -2274,6 +2287,19 @@ class EpcPropertyDataMapper: else None ), ), + # ADR-0037 follow-up: 21.0.0 previously passed no `sap_ventilation=`, + # dropping the whole §2 block. Unlike 21.0.1 it does not lodge the + # fan/flue/vent counts, so mirror only the two fields it does carry: + # the top-level `mechanical_ventilation` enum (→ §2 MV-kind dispatch; + # an MEV/MVHR cert otherwise defaulted to NATURAL and under-stated + # ventilation heat loss) and `sheltered_sides` from built_form (§S5, + # vs the cascade's shelter default of 2). + sap_ventilation=SapVentilation( + sheltered_sides=_api_sheltered_sides(schema.built_form), + mechanical_ventilation_kind=_api_mechanical_ventilation_kind( + schema.mechanical_ventilation + ), + ), ) @staticmethod