diff --git a/domain/sap10_ml/rdsap_uvalues.py b/domain/sap10_ml/rdsap_uvalues.py index 6b1e35fc..b4ab5de3 100644 --- a/domain/sap10_ml/rdsap_uvalues.py +++ b/domain/sap10_ml/rdsap_uvalues.py @@ -1419,7 +1419,8 @@ def u_window( # double/triple glazing — period bands. if installed_year is not None and installed_year >= 2022: - return 1.4 + # Table 24 "2022 or later" row: PVC/wood 1.4, metal 1.6. + return 1.6 if metal else 1.4 if installed_year is not None and installed_year >= 2002: return 2.2 if metal else 2.0 # pre-2002 double/triple default to 12mm gap row. diff --git a/domain/sap10_ml/tests/test_rdsap_uvalues.py b/domain/sap10_ml/tests/test_rdsap_uvalues.py index 77de58eb..522ccd52 100644 --- a/domain/sap10_ml/tests/test_rdsap_uvalues.py +++ b/domain/sap10_ml/tests/test_rdsap_uvalues.py @@ -1748,6 +1748,18 @@ def test_u_window_post_2022_pvc_returns_low_table24_value() -> None: assert result == pytest.approx(1.4, abs=0.001) +def test_u_window_post_2022_metal_returns_table24_1_6_not_pvc_1_4() -> None: + # Arrange — Table 24 "2022 or later" row (PDF p.51): PVC/wooden frame + # 1.4, METAL frame 1.6. The metal frame variant was previously ignored + # (1.4 returned for both), under-counting metal-frame heat loss. + + # Act + result = u_window(installed_year=2023, glazing_type="double", frame_type="metal") + + # Assert + assert result == pytest.approx(1.6, abs=0.001) + + def test_u_window_falls_back_to_mid_range_when_unknown() -> None: # Arrange — nothing known.