diff --git a/backend/documents_parser/elmhurst_extractor.py b/backend/documents_parser/elmhurst_extractor.py index 0f440f4a..16f32e07 100644 --- a/backend/documents_parser/elmhurst_extractor.py +++ b/backend/documents_parser/elmhurst_extractor.py @@ -269,8 +269,8 @@ class ElmhurstSiteNotesExtractor: ) def _wall_details_from_lines(self, lines: List[str]) -> WallDetails: - thickness_raw = self._local_val(lines, "Wall Thickness") - thickness_mm = ( + thickness_raw: Optional[str] = self._local_val(lines, "Wall Thickness") + thickness_mm: Optional[int] = ( int(thickness_raw.split()[0]) if thickness_raw else None ) # Composite / retrofit insulation thickness — Summary §7.0 @@ -280,8 +280,8 @@ class ElmhurstSiteNotesExtractor: # is local-scoped inside the §7 block so it does not collide # with the §8 Roofs / §9 Floors blocks. None when the PDF # omits the line (no retrofit lodged). - ins_thickness_raw = self._local_val(lines, "Insulation Thickness") - insulation_thickness_mm = self._parse_thickness_mm(ins_thickness_raw) + ins_thickness_raw: Optional[str] = self._local_val(lines, "Insulation Thickness") + insulation_thickness_mm: Optional[int] = self._parse_thickness_mm(ins_thickness_raw) return WallDetails( wall_type=self._local_str(lines, "Type"), insulation=self._local_str(lines, "Insulation"), @@ -318,8 +318,10 @@ class ElmhurstSiteNotesExtractor: continue if area <= 0: continue - thickness_raw = self._local_val(lines, f"Alternative Wall {n} Thickness") - thickness_mm = self._parse_thickness_mm(thickness_raw) + thickness_raw: Optional[str] = self._local_val( + lines, f"Alternative Wall {n} Thickness" + ) + thickness_mm: Optional[int] = self._parse_thickness_mm(thickness_raw) result.append(AlternativeWall( area_m2=area, wall_type=self._local_str(lines, f"Alternative Wall {n} Type"), @@ -365,8 +367,8 @@ class ElmhurstSiteNotesExtractor: return int(match.group()) if match else None def _roof_details_from_lines(self, lines: List[str]) -> RoofDetails: - thickness_raw = self._local_val(lines, "Insulation Thickness") - thickness_mm = self._parse_thickness_mm(thickness_raw) + thickness_raw: Optional[str] = self._local_val(lines, "Insulation Thickness") + thickness_mm: Optional[int] = self._parse_thickness_mm(thickness_raw) insulation = self._local_str(lines, "Insulation") # The Summary PDF omits the "Insulation Thickness" line entirely # when no retrofit insulation is lodged (e.g. "Insulation: N None" @@ -390,14 +392,14 @@ class ElmhurstSiteNotesExtractor: return self._roof_details_from_lines(lines) def _floor_details_from_lines(self, lines: List[str]) -> FloorDetails: - u_val_raw = self._local_val(lines, "Default U-value") - default_u = float(u_val_raw) if u_val_raw else None + u_val_raw: Optional[str] = self._local_val(lines, "Default U-value") + default_u: Optional[float] = float(u_val_raw) if u_val_raw else None # RdSAP 10 §5.13 Table 20 — retro-fitted upper floors lodge an # "Insulation Thickness: NNN mm" cell so the cascade can route # via the per-thickness column. Mirror of the §8 roof extractor # at `_roof_details_from_lines`. - thickness_raw = self._local_val(lines, "Insulation Thickness") - thickness_mm = self._parse_thickness_mm(thickness_raw) + thickness_raw: Optional[str] = self._local_val(lines, "Insulation Thickness") + thickness_mm: Optional[int] = self._parse_thickness_mm(thickness_raw) return FloorDetails( location=self._local_str(lines, "Location"), floor_type=self._local_str(lines, "Type"),