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 539ced6f..2e74aa30 100644 --- a/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py +++ b/backend/documents_parser/tests/test_summary_pdf_mapper_chain.py @@ -268,3 +268,21 @@ def test_summary_001479_mapper_extensions_count_matches_extension_bps() -> None: # Assert assert epc.extensions_count == 2 assert len(epc.sap_building_parts) == 3 + + +def test_summary_001479_main_party_wall_construction_is_cavity_unfilled() -> None: + # Arrange — cert 001479 Main §7 Walls lodges "Party Wall Type: CU + # Cavity masonry unfilled". The Elmhurst leading-code map previously + # only knew "S" and "C"; "CU" fell through to None, which made the + # cascade default to U=0.25 instead of the worksheet's lodged U=0.50. + # The fix adds "CU" → SAP10 wall_construction code 4 (WALL_CAVITY), + # which `u_party_wall` resolves to U=0.50 — matching the worksheet's + # §3 `Party walls Main … 0.50` row. + pages = _summary_pdf_to_textract_style_pages(_SUMMARY_001479_PDF) + site_notes = ElmhurstSiteNotesExtractor(pages).extract() + + # Act + epc = EpcPropertyDataMapper.from_elmhurst_site_notes(site_notes) + + # Assert + assert epc.sap_building_parts[0].party_wall_construction == 4 diff --git a/datatypes/epc/domain/mapper.py b/datatypes/epc/domain/mapper.py index 1dda5e4f..07a461e7 100644 --- a/datatypes/epc/domain/mapper.py +++ b/datatypes/epc/domain/mapper.py @@ -1852,7 +1852,10 @@ def _elmhurst_wall_construction_int(coded: str) -> Optional[int]: # all → U=0.0; unknown → U=0.25). _ELMHURST_PARTY_WALL_CODE_TO_SAP10: Dict[str, int] = { "S": 3, # Solid masonry / timber / system build → U=0.0 - "C": 4, # Cavity (unfilled) → U=0.5; observed in API path + "C": 4, # Cavity (unfilled) → U=0.5 + "CU": 4, # Cavity masonry unfilled — same U=0.5 cascade; Elmhurst + # encodes party-wall cavity type with the masonry sub-code + # (CU vs CF filled) — observed first on cert 001479 Main. }