From ea35bed24c37f66956e7e3a3c9feee14fb48d1ec Mon Sep 17 00:00:00 2001 From: Khalim Conn-Kowlessar Date: Fri, 5 Jun 2026 09:19:43 +0000 Subject: [PATCH] S0380.236: extension party-wall type read independently of "As Main Wall" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RdSAP 10 §3.3: "As Main Wall: Yes" makes an extension inherit the main dwelling's external wall CONSTRUCTION only — the party wall type is lodged separately per building part in the Summary §7 block and may differ. `_extract_extensions` was copying `main_walls.party_wall_type` into the inherited WallDetails, so every extension reused the main's party wall U. On the double_glazing fixture (Summary_001431) the Main lodges party "CU Cavity masonry unfilled" (SAP10 wall_construction 4 → u_party_wall 0.5) but the 1st Extension lodges "U Unable to determine" (→ 0 → RdSAP default 0.25). Pre-fix both building parts used 0.5, inflating worksheet (32) party-wall heat loss by 6.56 W/K (Ext1 26.25 m² × 0.25). After the fix worksheet (32) is exact: ours 32.573 vs worksheet 32.5725. Now reads the extension's own "Party Wall Type" from its §7 chunk, falling back to the main's only when the extension lodges none. Adds a fixture + test asserting Main=4 / Ext=0 with distinct u_party_wall. Suite 2413 pass; no cohort regression. Co-Authored-By: Claude Opus 4.8 --- .../documents_parser/elmhurst_extractor.py | 14 +++++++- .../Summary_001431_double_glazing.pdf | Bin 0 -> 80939 bytes .../tests/test_summary_pdf_mapper_chain.py | 31 ++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 backend/documents_parser/tests/fixtures/Summary_001431_double_glazing.pdf diff --git a/backend/documents_parser/elmhurst_extractor.py b/backend/documents_parser/elmhurst_extractor.py index 7bd1dba6..0f440f4a 100644 --- a/backend/documents_parser/elmhurst_extractor.py +++ b/backend/documents_parser/elmhurst_extractor.py @@ -670,12 +670,24 @@ class ElmhurstSiteNotesExtractor: # even when the main wall fields are inherited; merge # them into the inherited WallDetails so the bp carries # them through to its SapBuildingPart. + # + # "As Main Wall: Yes" inherits the EXTERNAL wall + # construction only — the PARTY WALL TYPE is lodged + # separately in the extension's §7 block and may differ + # (cert 001431: Main "CU Cavity masonry unfilled" U=0.5, + # 1st Extension "U Unable to determine" → RdSAP default + # U=0.25). Read the extension's own party wall type when + # present; fall back to the main's only when absent. + ext_party_wall_type = ( + self._local_str(wall_lines, "Party Wall Type") + or main_walls.party_wall_type + ) walls = WallDetails( wall_type=main_walls.wall_type, insulation=main_walls.insulation, thickness_unknown=main_walls.thickness_unknown, u_value_known=main_walls.u_value_known, - party_wall_type=main_walls.party_wall_type, + party_wall_type=ext_party_wall_type, thickness_mm=main_walls.thickness_mm, insulation_thickness_mm=main_walls.insulation_thickness_mm, alternative_walls=self._alternative_walls_from_lines(wall_lines), diff --git a/backend/documents_parser/tests/fixtures/Summary_001431_double_glazing.pdf b/backend/documents_parser/tests/fixtures/Summary_001431_double_glazing.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f58a021786b8b34f699522f6ad54f427d254a719 GIT binary patch literal 80939 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 literal 0 HcmV?d00001 diff --git a/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py b/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py index b1966d40..d3ed87d6 100644 --- a/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py +++ b/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py @@ -1502,6 +1502,37 @@ def test_elmhurst_glazing_label_full_coverage_per_sap10_table_6b() -> None: ) +def test_extension_party_wall_type_read_independently_of_as_main_wall() -> None: + # Arrange — RdSAP 10 §3.3: "As Main Wall: Yes" inherits only the + # external wall CONSTRUCTION; the party wall type is lodged + # separately per building part and may differ. The double_glazing + # fixture (Summary_001431) lodges Main party "CU Cavity masonry + # unfilled" (SAP10 wall_construction 4 → u_party_wall 0.5) but the + # 1st Extension party "U Unable to determine" (→ wall_construction 0 + # → RdSAP default u_party_wall 0.25), even though the extension is + # "As Main Wall: Yes". Pre-fix the extension inherited the Main's + # party type (both 0.5), inflating worksheet (32) party heat loss. + pages = _summary_pdf_to_textract_style_pages( + _FIXTURES / "Summary_001431_double_glazing.pdf" + ) + site_notes = ElmhurstSiteNotesExtractor(pages).extract() + + # Act + epc = EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) + + # Assert — Main BP keeps cavity-unfilled (4); the extension BP gets + # the "Unable to determine" sentinel (0), a distinct party wall U. + party_codes = [ + bp.party_wall_construction for bp in epc.sap_building_parts + ] + assert party_codes == [4, 0], ( + f"expected Main=4 (CU, U=0.5) + Ext=0 (Unable, U=0.25), got {party_codes}" + ) + # The two map to different SAP party-wall U-values. + assert abs(u_party_wall(4) - 0.5) <= 1e-9 + assert abs(u_party_wall(0) - 0.25) <= 1e-9 + + def test_summary_mapper_raises_on_unmapped_glazing_type_label() -> None: # Arrange — same strict-coverage gate as the cylinder-size helper # (Slice S0380.15 + S0380.16): silently routing an unknown glazing