From 6a6811e548d8eb7548cfdf38c7958714d5a88e43 Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Sun, 24 May 2026 11:35:46 +0000 Subject: [PATCH] Slice 38: add LN12 cert as 8th golden fixture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit End-terrace + 1 extension, TFA 80 m², gas combi (PCDB index 18119), no PV, no secondary, postcode LN12 (PCDB Table 172 match). Schema- 21.0.1 / SAP 10.2 — the cleanest bread-and-butter cert in the cohort. Residuals post sap_ventilation mapper fix: SAP +1 (calc 66 vs lodged 65) PE -10.6249 kWh/m² CO2 -0.1059 t/yr Residual floor reflects remaining mapper gaps — notably schema-21 not carrying led_/cfl_fixed_lighting_bulbs_count for this cert, so the §5 lighting efficacy falls back to defaults. Also added to PCDB chain test — index 18119 flows through to inputs.main_heating_efficiency (winter eff lookup deferred, expected_winter_eff=None per the existing non-oil convention). 12/12 golden cohort green. Pyright net-zero. Co-Authored-By: Claude Opus 4.7 --- .../golden/0390-2254-6420-2126-5561.json | 520 ++++++++++++++++++ .../sap/rdsap/tests/test_golden_fixtures.py | 17 + 2 files changed, 537 insertions(+) create mode 100644 packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/0390-2254-6420-2126-5561.json diff --git a/packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/0390-2254-6420-2126-5561.json b/packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/0390-2254-6420-2126-5561.json new file mode 100644 index 00000000..c471484e --- /dev/null +++ b/packages/domain/src/domain/sap/rdsap/tests/fixtures/golden/0390-2254-6420-2126-5561.json @@ -0,0 +1,520 @@ +{ + "uprn": 100032081004, + "roofs": [ + { + "description": "Pitched, 300 mm loft insulation", + "energy_efficiency_rating": 5, + "environmental_efficiency_rating": 5 + }, + { + "description": "Flat, no insulation", + "energy_efficiency_rating": 1, + "environmental_efficiency_rating": 1 + } + ], + "walls": [ + { + "description": "Cavity wall, as built, no insulation (assumed)", + "energy_efficiency_rating": 2, + "environmental_efficiency_rating": 2 + } + ], + "floors": [ + { + "description": "Solid, no insulation (assumed)", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + } + ], + "status": "entered", + "tenure": 2, + "window": { + "description": "Fully double glazed", + "energy_efficiency_rating": 2, + "environmental_efficiency_rating": 2 + }, + "addendum": { + "cavity_fill_recommended": "true" + }, + "lighting": { + "description": "Good lighting efficiency", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + "postcode": "LN12 2PT", + "hot_water": { + "description": "From main system", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + }, + "post_town": "MABLETHORPE", + "built_form": 3, + "created_at": "2026-03-31 19:45:46", + "door_count": 2, + "region_code": 3, + "report_type": 2, + "sap_heating": { + "number_baths": 1, + "cylinder_size": 1, + "number_baths_wwhrs": 0, + "water_heating_code": 901, + "water_heating_fuel": 26, + "main_heating_details": [ + { + "has_fghrs": "N", + "main_fuel_type": 26, + "boiler_flue_type": 2, + "fan_flue_present": "Y", + "heat_emitter_type": 1, + "emitter_temperature": 0, + "main_heating_number": 1, + "main_heating_control": 2106, + "main_heating_category": 2, + "main_heating_fraction": 1, + "central_heating_pump_age": 0, + "main_heating_data_source": 1, + "main_heating_index_number": 18119 + } + ], + "immersion_heating_type": "NA", + "has_fixed_air_conditioning": "false" + }, + "sap_version": 10.2, + "sap_windows": [ + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 2, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.96, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 2, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.96, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 2, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.97, + "window_height": 1.18, + "draught_proofed": "true", + "window_location": 1, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 2, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.48, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 2, + "window_type": 1, + "glazing_type": 3, + "window_width": 1.45, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 6, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.96, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 6, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.96, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 6, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.97, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 6, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.98, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 0, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + }, + { + "pvc_frame": "true", + "glazing_gap": 12, + "orientation": 4, + "window_type": 1, + "glazing_type": 3, + "window_width": 0.97, + "window_height": 1.2, + "draught_proofed": "true", + "window_location": 1, + "window_wall_type": 1, + "permanent_shutters_present": "N", + "permanent_shutters_insulated": "N" + } + ], + "schema_type": "RdSAP-Schema-21.0.1", + "uprn_source": "Energy Assessor", + "country_code": "ENG", + "main_heating": [ + { + "description": "Boiler and radiators, mains gas", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "air_tightness": { + "description": "(not tested)", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "dwelling_type": "End-terrace house", + "language_code": 1, + "pressure_test": 4, + "property_type": 0, + "address_line_1": "7 Sutton Road", + "address_line_2": "Trusthorpe", + "assessment_type": "RdSAP", + "completion_date": "2026-03-31", + "inspection_date": "2026-02-24", + "extensions_count": 1, + "measurement_type": 1, + "total_floor_area": 80, + "transaction_type": 5, + "conservatory_type": 1, + "heated_room_count": 4, + "registration_date": "2026-03-31", + "sap_energy_source": { + "mains_gas": "Y", + "meter_type": 2, + "pv_connection": 0, + "photovoltaic_supply": { + "none_or_no_details": { + "percent_roof_area": 0 + } + }, + "wind_turbines_count": 0, + "gas_smart_meter_present": "true", + "is_dwelling_export_capable": "false", + "wind_turbines_terrain_type": 2, + "electricity_smart_meter_present": "true" + }, + "secondary_heating": { + "description": "None", + "energy_efficiency_rating": 0, + "environmental_efficiency_rating": 0 + }, + "extract_fans_count": 2, + "sap_building_parts": [ + { + "identifier": "Main Dwelling", + "wall_dry_lined": "N", + "wall_thickness": 280, + "floor_heat_loss": 7, + "roof_construction": 4, + "wall_construction": 4, + "building_part_number": 1, + "sap_floor_dimensions": [ + { + "floor": 0, + "room_height": { + "value": 2.33, + "quantity": "metres" + }, + "floor_insulation": 1, + "total_floor_area": { + "value": 34.69, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 7.08, + "quantity": "metres" + }, + "floor_construction": 1, + "heat_loss_perimeter": { + "value": 11.82, + "quantity": "metres" + } + }, + { + "floor": 1, + "room_height": { + "value": 2.29, + "quantity": "metres" + }, + "total_floor_area": { + "value": 34.69, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 7.08, + "quantity": "metres" + }, + "heat_loss_perimeter": { + "value": 16.88, + "quantity": "metres" + } + } + ], + "wall_insulation_type": 4, + "construction_age_band": "D", + "party_wall_construction": 0, + "wall_thickness_measured": "Y", + "roof_insulation_location": 2, + "roof_insulation_thickness": "300mm", + "wall_insulation_thickness": "NI", + "floor_insulation_thickness": "NI" + }, + { + "identifier": "Extension 1", + "wall_dry_lined": "N", + "wall_thickness": 280, + "floor_heat_loss": 7, + "roof_construction": 1, + "wall_construction": 4, + "building_part_number": 2, + "sap_floor_dimensions": [ + { + "floor": 0, + "room_height": { + "value": 2.23, + "quantity": "metres" + }, + "floor_insulation": 1, + "total_floor_area": { + "value": 10.76, + "quantity": "square metres" + }, + "party_wall_length": { + "value": 0, + "quantity": "metres" + }, + "floor_construction": 1, + "heat_loss_perimeter": { + "value": 10.16, + "quantity": "metres" + } + } + ], + "wall_insulation_type": 4, + "construction_age_band": "D", + "party_wall_construction": "NA", + "wall_thickness_measured": "Y", + "roof_insulation_location": 6, + "wall_insulation_thickness": "NI", + "floor_insulation_thickness": "NI", + "flat_roof_insulation_thickness": "AB" + } + ], + "solar_water_heating": "N", + "habitable_room_count": 4, + "heating_cost_current": { + "value": 1083, + "currency": "GBP" + }, + "insulated_door_count": 0, + "co2_emissions_current": 3.5, + "energy_rating_average": 60, + "energy_rating_current": 65, + "lighting_cost_current": { + "value": 56, + "currency": "GBP" + }, + "main_heating_controls": [ + { + "description": "Programmer, room thermostat and TRVs", + "energy_efficiency_rating": 4, + "environmental_efficiency_rating": 4 + } + ], + "blocked_chimneys_count": 2, + "has_hot_water_cylinder": "false", + "heating_cost_potential": { + "value": 758, + "currency": "GBP" + }, + "hot_water_cost_current": { + "value": 155, + "currency": "GBP" + }, + "mechanical_ventilation": 0, + "percent_draughtproofed": 100, + "suggested_improvements": [ + { + "sequence": 1, + "typical_saving": { + "value": 61, + "currency": "GBP" + }, + "indicative_cost": "\u00a3900 - \u00a31,200", + "improvement_type": "A2", + "improvement_details": { + "improvement_number": 45 + }, + "improvement_category": 5, + "energy_performance_rating": 67, + "environmental_impact_rating": 65 + }, + { + "sequence": 2, + "typical_saving": { + "value": 208, + "currency": "GBP" + }, + "indicative_cost": "\u00a3900 - \u00a31,500", + "improvement_type": "B", + "improvement_details": { + "improvement_number": 6 + }, + "improvement_category": 5, + "energy_performance_rating": 72, + "environmental_impact_rating": 72 + }, + { + "sequence": 3, + "typical_saving": { + "value": 57, + "currency": "GBP" + }, + "indicative_cost": "\u00a35,000 - \u00a310,000", + "improvement_type": "W2", + "improvement_details": { + "improvement_number": 58 + }, + "improvement_category": 5, + "energy_performance_rating": 74, + "environmental_impact_rating": 74 + }, + { + "sequence": 4, + "typical_saving": { + "value": 225, + "currency": "GBP" + }, + "indicative_cost": "\u00a38,000 - \u00a310,000", + "improvement_type": "U", + "improvement_details": { + "improvement_number": 34 + }, + "improvement_category": 5, + "energy_performance_rating": 78, + "environmental_impact_rating": 75 + } + ], + "co2_emissions_potential": 2.4, + "energy_rating_potential": 78, + "lighting_cost_potential": { + "value": 56, + "currency": "GBP" + }, + "schema_version_original": "21.0.1", + "alternative_improvements": [ + { + "improvement": { + "sequence": 1, + "typical_saving": { + "value": 59, + "currency": "GBP" + }, + "improvement_type": "Q2", + "improvement_details": { + "improvement_number": 55 + }, + "improvement_category": 6, + "energy_performance_rating": 74, + "environmental_impact_rating": 74 + } + } + ], + "hot_water_cost_potential": { + "value": 155, + "currency": "GBP" + }, + "renewable_heat_incentive": { + "water_heating": 2080.04, + "space_heating_existing_dwelling": 12615.25 + }, + "draughtproofed_door_count": 2, + "energy_consumption_current": 241, + "has_fixed_air_conditioning": "false", + "multiple_glazed_proportion": 100, + "calculation_software_version": "5.02r0335", + "energy_consumption_potential": 156, + "environmental_impact_current": 62, + "current_energy_efficiency_band": "D", + "environmental_impact_potential": 75, + "has_heated_separate_conservatory": "false", + "potential_energy_efficiency_band": "C", + "co2_emissions_current_per_floor_area": 44, + "low_energy_fixed_lighting_bulbs_count": 9, + "incandescent_fixed_lighting_bulbs_count": 0 +} diff --git a/packages/domain/src/domain/sap/rdsap/tests/test_golden_fixtures.py b/packages/domain/src/domain/sap/rdsap/tests/test_golden_fixtures.py index 330610d2..8ee7077d 100644 --- a/packages/domain/src/domain/sap/rdsap/tests/test_golden_fixtures.py +++ b/packages/domain/src/domain/sap/rdsap/tests/test_golden_fixtures.py @@ -132,6 +132,22 @@ _EXPECTATIONS: tuple[_GoldenExpectation, ...] = ( expected_co2_resid_tonnes_per_yr=-0.2234, notes="Semi-detached, TFA 102, age C, gas PCDB-listed.", ), + _GoldenExpectation( + cert_number="0390-2254-6420-2126-5561", + actual_sap=65, + expected_sap_resid=+1, + expected_pe_resid_kwh_per_m2=-10.6249, + expected_co2_resid_tonnes_per_yr=-0.1059, + notes=( + "End-terrace + 1 extension, TFA 80, gas combi PCDB index 18119, " + "no PV, no secondary, postcode LN12 (PCDB Table 172 match). " + "Cleanest bread-and-butter cert in the cohort; the +1 SAP / -10.6 " + "PE residual is the post-sap_ventilation-fix floor under the " + "remaining mapper gaps (notably schema-21 doesn't carry " + "led_/cfl_fixed_lighting_bulbs_count for this cert, so the §5 " + "lighting efficacy falls back to defaults)." + ), + ), # Retired early at P2.2: 9390-2722-3520-2105-8715 (mid-floor flat, # heat network cat 6 sap_code 301). Drifted to SAP residual -7 # under SAP 10.2 spec prices because cert-cal had absorbed @@ -204,6 +220,7 @@ _PCDB_CHAIN_EXPECTATIONS: tuple[tuple[str, int, float], ...] = ( ("7536-3827-0600-0600-0276", 17679, None), # Vaillant gas PCDB-listed ("0300-2747-7640-2526-2135", 17992, None), # gas PCDB-listed ("8135-1728-8500-0511-3296", 17702, None), # gas PCDB-listed + ("0390-2254-6420-2126-5561", 18119, None), # LN12 gas combi PCDB-listed )