diff --git a/packages/domain/src/domain/sap/calculator.py b/packages/domain/src/domain/sap/calculator.py index 68b1f5c1..6e45ef53 100644 --- a/packages/domain/src/domain/sap/calculator.py +++ b/packages/domain/src/domain/sap/calculator.py @@ -332,10 +332,18 @@ def calculate_sap_from_inputs(inputs: CalculatorInputs) -> SapResult: ) primary_energy_per_m2 = primary_energy_kwh / tfa if tfa > 0 else 0.0 + ht = inputs.heat_transmission intermediate: dict[str, float] = { "tfa_m2": inputs.dimensions.total_floor_area_m2, "volume_m3": inputs.dimensions.volume_m3, "storey_count": float(inputs.dimensions.storey_count), + "walls_w_per_k": ht.walls_w_per_k, + "roof_w_per_k": ht.roof_w_per_k, + "floor_w_per_k": ht.floor_w_per_k, + "party_walls_w_per_k": ht.party_walls_w_per_k, + "windows_w_per_k": ht.windows_w_per_k, + "doors_w_per_k": ht.doors_w_per_k, + "thermal_bridging_w_per_k": ht.thermal_bridging_w_per_k, } return SapResult( diff --git a/packages/domain/src/domain/sap/tests/test_calculator.py b/packages/domain/src/domain/sap/tests/test_calculator.py index d3d0de47..ae892772 100644 --- a/packages/domain/src/domain/sap/tests/test_calculator.py +++ b/packages/domain/src/domain/sap/tests/test_calculator.py @@ -139,6 +139,26 @@ def test_calculate_exposes_dimensions_intermediates() -> None: assert result.intermediate["storey_count"] == float(inputs.dimensions.storey_count) +def test_calculate_exposes_heat_transmission_intermediates() -> None: + # Arrange — P5 trace mode: the 7 fabric W/K components must surface on + # `intermediate` so section-§5 sweep slices can diff per-component + # against BRE worked examples. + inputs = _baseline_inputs() + + # Act + result = calculate_sap_from_inputs(inputs) + + # Assert + ht = inputs.heat_transmission + assert result.intermediate["walls_w_per_k"] == ht.walls_w_per_k + assert result.intermediate["roof_w_per_k"] == ht.roof_w_per_k + assert result.intermediate["floor_w_per_k"] == ht.floor_w_per_k + assert result.intermediate["party_walls_w_per_k"] == ht.party_walls_w_per_k + assert result.intermediate["windows_w_per_k"] == ht.windows_w_per_k + assert result.intermediate["doors_w_per_k"] == ht.doors_w_per_k + assert result.intermediate["thermal_bridging_w_per_k"] == ht.thermal_bridging_w_per_k + + def test_higher_main_heating_efficiency_reduces_fuel_use() -> None: # Arrange — Direction check: doubling the boiler efficiency must halve # the main-heating fuel kWh, holding everything else constant.