Spaces:
Sleeping
Sleeping
File size: 20,369 Bytes
7d37f11 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 | """Generate a mock RICS Level 3 Building Survey report as a .docx file.
Run: python create_mock_survey.py
Output: mock_survey_42_victoria_road.docx
"""
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
def add_heading(doc: Document, text: str, level: int) -> None:
doc.add_heading(text, level=level)
def add_body(doc: Document, text: str) -> None:
p = doc.add_paragraph(text)
p.style = doc.styles["Normal"]
def add_bullet(doc: Document, text: str) -> None:
doc.add_paragraph(text, style="List Bullet")
def add_table(doc: Document, headers: list[str], rows: list[list[str]]) -> None:
table = doc.add_table(rows=1, cols=len(headers))
table.style = "Table Grid"
hdr_cells = table.rows[0].cells
for i, h in enumerate(headers):
hdr_cells[i].text = h
for run in hdr_cells[i].paragraphs[0].runs:
run.bold = True
for row_data in rows:
row_cells = table.add_row().cells
for i, val in enumerate(row_data):
row_cells[i].text = val
def build() -> None:
doc = Document()
# ββ Cover ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
title = doc.add_paragraph("RICS LEVEL 3 BUILDING SURVEY REPORT")
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
title.runs[0].bold = True
title.runs[0].font.size = Pt(16)
doc.add_paragraph("Property Address: 42 Victoria Road, Kensington, London W8 5RD").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Date of Inspection: 12 February 2026").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Prepared by: J. Hartley MRICS, Hartley & Partners Surveyors").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph("Report Reference: HP-2026-0214-W8").alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_page_break()
# ββ Section A: Description of the Property ββββββββββββββββββββββββββββ
add_heading(doc, "SECTION A β DESCRIPTION OF THE PROPERTY", 1)
add_heading(doc, "A1. General Description", 2)
add_body(doc,
"The subject property is a mid-terraced Victorian townhouse of traditional "
"brick construction arranged over four storeys including a lower ground floor "
"basement. The property was constructed circa 1887 and has a gross internal "
"floor area of approximately 287 square metres (3,089 sq ft). It is currently "
"configured as a five-bedroom single-family dwelling."
)
add_heading(doc, "A2. Location and Setting", 2)
add_body(doc,
"The property is situated within a predominantly residential conservation area "
"in the Royal Borough of Kensington and Chelsea. Victoria Road is a tree-lined "
"street with direct access to Kensington High Street approximately 350 metres to "
"the south. The local amenity provision is excellent. The property is within "
"London Flood Zone 1 (low probability) according to the Environment Agency "
"flood map for planning."
)
add_heading(doc, "A3. Weather at Time of Inspection", 2)
add_body(doc,
"The inspection was carried out in dry, overcast conditions with an ambient "
"temperature of approximately 8Β°C. Ground conditions were damp following recent "
"rainfall. No snow or ice was present. The conditions were suitable for a full "
"external inspection."
)
add_heading(doc, "A4. Tenure and Occupation", 2)
add_body(doc,
"The property is understood to be held freehold, subject to verification by "
"the client's legal adviser. At the time of inspection the property was vacant "
"and unfurnished, having been recently vacated by the previous occupants. "
"Access to all rooms and roof spaces was available."
)
doc.add_page_break()
# ββ Section B: Condition Ratings ββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "SECTION B β CONDITION RATINGS", 1)
add_body(doc,
"Elements are rated using the standard RICS three-point condition rating scale: "
"Condition Rating 1 (no repair currently needed), Condition Rating 2 (defects that "
"need repairing or replacing but are not considered serious), and Condition Rating 3 "
"(serious defects that must be repaired urgently and/or that need specialist "
"investigation)."
)
# B1
add_heading(doc, "B1 β Chimney Stacks", 2)
add_body(doc,
"There are two rendered brick chimney stacks serving the main house, both "
"visible from ground level and from the flat roof of the rear addition. The "
"front stack serving the main reception rooms has significant spalling to the "
"render coat on its south-facing face. The mortar pointing to the brick courses "
"immediately below the flaunching is heavily eroded with individual joints recessed "
"by 10β15 mm. The lead flaunching to the front stack is cracked and lifting along "
"the ridge apex, creating a direct ingress risk. The rear stack appears more "
"recently repointed and is in a better condition, though the chimney pots are "
"unflued and should be capped."
)
add_bullet(doc, "Front stack render: spalling on south face, approximately 0.4 mΒ² area affected")
add_bullet(doc, "Flaunching: cracked and lifting β immediate repair required")
add_bullet(doc, "Mortar joints below flaunching: eroded 10β15 mm β repoint required")
add_bullet(doc, "Rear chimney pots: unflued β capping recommended")
add_body(doc, "Condition Rating: 3 (front stack) / 2 (rear stack)")
# B2
add_heading(doc, "B2 β Roof Coverings", 2)
add_body(doc,
"The main roof is a traditional pitched arrangement covered with original "
"Welsh slate tiles. Approximately 15% of the slates on the north-facing rear "
"slope are cracked, slipping or missing, having been temporarily repaired with "
"mortar fillets which are now failing. The main south slope is in a better "
"condition with isolated slipped slates noted. The valley gutters are lined in "
"lead (code 5) and appear serviceable although minor pitting was observed. "
"The rear flat roof addition is covered in a single-ply membrane (TPO) installed "
"approximately six years ago according to the vendor's information; it appears in "
"satisfactory condition with no obvious blistering or delamination."
)
add_bullet(doc, "North slope: approx. 15% of Welsh slates cracked, slipping or missing")
add_bullet(doc, "Mortar fillet repairs failing on north slope")
add_bullet(doc, "South slope: isolated slipped slates β monitor and repair")
add_bullet(doc, "Lead valley gutters: code 5 lead, serviceable, minor pitting noted")
add_bullet(doc, "Rear flat roof TPO membrane: approximately 6 years old, satisfactory condition")
add_body(doc, "Condition Rating: 3 (north slope) / 2 (south slope and valleys) / 1 (flat roof)")
# B3
add_heading(doc, "B3 β Rainwater Fittings", 2)
add_body(doc,
"The rainwater goods to the principal elevation are cast iron, consistent with "
"the age of the building. Several sections of the front parapet gutter show "
"active signs of leakage at the joints, evidenced by staining to the brickwork "
"below. The downpipes discharging at ground floor level appear to discharge "
"directly into the basement lightwell drainage channel. The rear rainwater "
"goods are UPVC and are in a generally satisfactory condition."
)
add_bullet(doc, "Front parapet gutter: cast iron, leaking joints β staining to brickwork below")
add_bullet(doc, "Basement lightwell drainage: shared connection with downpipes, verify capacity")
add_bullet(doc, "Rear UPVC goods: satisfactory condition")
add_body(doc, "Condition Rating: 3 (front parapet gutter) / 1 (rear)")
# B4
add_heading(doc, "B4 β Main Walls", 2)
add_body(doc,
"The external walls to the principal and side elevations are of solid London "
"stock brick construction approximately 340 mm thick (one brick solid). The "
"brickwork is generally in a satisfactory condition. An area of stepped diagonal "
"cracking has been observed to the south-east corner at first-floor level, "
"consistent with differential settlement, likely attributable to the shallow "
"foundations and proximity of a large London plane tree approximately 4.5 metres "
"from the building line. The cracking is dormant with weathered edges and a "
"maximum width of 4 mm. A structural engineer's opinion should be sought prior "
"to exchange. No cavity wall exists; a thermal upgrade would require internal "
"insulation."
)
add_bullet(doc, "Construction: solid London stock brick, approximately 340 mm thick")
add_bullet(doc, "Diagonal stepped cracking: south-east corner, first-floor level, max 4 mm width")
add_bullet(doc, "Cracking appears dormant β structural engineer's inspection recommended")
add_bullet(doc, "Tree: London plane at approx. 4.5 m from building, risk to foundations")
add_bullet(doc, "No cavity wall β thermal upgrade via internal insulation only")
add_body(doc, "Condition Rating: 3 (cracked area) / 1 (remainder)")
# B5
add_heading(doc, "B5 β Windows", 2)
add_body(doc,
"The windows to the principal elevation are traditional sliding sash, "
"double-glazed with hardwood frames in a painted finish. Several sashes to the "
"upper floors show signs of failed glazing units (misting between panes). The "
"painted finish is peeling and requires redecoration. Ground floor windows have "
"been fitted with secondary glazing. Rear windows are a mixture of original "
"sash and later UPVC casement. All windows have been confirmed as meeting the "
"Building Regulations Part L requirements for the relevant period."
)
add_bullet(doc, "Front sash windows: double-glazed hardwood β failed IGUs on floors 2 and 3")
add_bullet(doc, "Paintwork: peeling, full redecoration cycle needed")
add_bullet(doc, "Ground floor: secondary glazing fitted, serviceable")
add_bullet(doc, "Rear: mixed original sash and UPVC casement, generally satisfactory")
add_body(doc, "Condition Rating: 2")
# B6
add_heading(doc, "B6 β External Doors", 2)
add_body(doc,
"The principal entrance door is a six-panel hardwood door with decorative "
"fanlight above. The door frame shows minor rot at the bottom rail. The "
"draught-proofing strips are absent. The rear external door is a solid timber "
"door in fair condition; the threshold has dropped slightly causing a draught gap."
)
add_body(doc, "Condition Rating: 2")
doc.add_page_break()
# ββ Section C: Services ββββββββββββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "SECTION C β SERVICES", 1)
add_body(doc,
"The services were not tested as part of this survey. The following observations "
"are visual only and an independent specialist inspection of each service "
"installation is recommended."
)
add_heading(doc, "C1 β Electricity", 2)
add_body(doc,
"The property is served by a single-phase 100A supply. The consumer unit is "
"located in the basement utility room and contains a mix of MCBs and older "
"rewireable fuses, indicating a partial rewire has been carried out. The wiring "
"throughout appears to be a mixture of vintage rubber-insulated cable and more "
"recent PVC twin-and-earth. An Electrical Installation Condition Report (EICR) "
"should be obtained prior to exchange, as the installation is unlikely to achieve "
"a satisfactory certificate in its current state."
)
add_body(doc, "Condition Rating: 3 β EICR urgently required")
add_heading(doc, "C2 β Gas and Heating", 2)
add_body(doc,
"Central heating is provided by a Viessmann Vitodens 200-W condensing boiler "
"installed in 2019 and still within its manufacturer's ten-year warranty period. "
"The system is a pressurised sealed system serving 22 radiators and a "
"180-litre unvented hot water cylinder. A Gas Safe registered engineer should "
"issue a current Landlord Gas Safety Record (CP12) and service the boiler annually."
)
add_bullet(doc, "Boiler: Viessmann Vitodens 200-W (2019), condensing, within warranty")
add_bullet(doc, "System: pressurised sealed, 22 radiators")
add_bullet(doc, "Hot water: 180-litre unvented cylinder")
add_body(doc, "Condition Rating: 1")
add_heading(doc, "C3 β Water and Drainage", 2)
add_body(doc,
"The property is connected to the public mains water supply via a 22 mm copper "
"service pipe. The internal pipework is a mix of copper and modern push-fit plastic. "
"Visible pipework to the basement shows minor evidence of previous leakage at "
"compression joints, evidenced by verdigris staining. Drainage is via the public "
"sewer. A CCTV drain survey is recommended given the age of the property."
)
add_body(doc, "Condition Rating: 2")
doc.add_page_break()
# ββ Section D: Grounds βββββββββββββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "SECTION D β GROUNDS (INCLUDING GARAGES AND OUTBUILDINGS)", 1)
add_heading(doc, "D1 β Garage", 2)
add_body(doc,
"A detached single garage is located to the rear of the property, accessed via "
"a shared rear service lane. The garage is of brick construction with a corrugated "
"asbestos cement roof. The asbestos cement panels are in a brittle condition and "
"several are cracked. A licensed asbestos contractor should be engaged to survey "
"and safely remove the roof coverings before any works are undertaken."
)
add_bullet(doc, "Garage roof: corrugated asbestos cement β brittle, cracked panels")
add_bullet(doc, "Licensed asbestos removal required before any roof works")
add_body(doc, "Condition Rating: 3")
add_heading(doc, "D2 β Garden and Boundaries", 2)
add_body(doc,
"The rear garden extends to approximately 18 metres in depth and 7 metres in "
"width. The London plane tree referenced in Section B4 is located adjacent to "
"the south boundary. An arborist's report should be obtained to assess its "
"root system and structural integrity. The boundary walls are of brick, "
"approximately 1.8 metres in height, and are in generally fair condition "
"with localised repointing required."
)
add_body(doc, "Condition Rating: 2")
doc.add_page_break()
# ββ Section E: Energy Efficiency ββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "SECTION E β ENERGY EFFICIENCY", 1)
add_body(doc,
"The property has a current Energy Performance Certificate (EPC) rating of "
"band D (score 58), issued on 14 March 2023 and valid for ten years. Given "
"the solid brick construction and original sash windows, significant heat loss "
"occurs through the walls and fenestration. The following energy improvement "
"measures are recommended:"
)
add_bullet(doc, "Internal wall insulation (IWI) to all external walls: estimated cost Β£35,000βΒ£50,000")
add_bullet(doc, "Secondary or replacement double glazing to remaining single-glazed sashes")
add_bullet(doc, "Loft insulation increase to 270 mm mineral wool")
add_bullet(doc, "Smart thermostatic radiator valves throughout")
add_body(doc,
"With the above measures implemented the property could realistically achieve "
"an EPC band B. Under the proposed MEES regulations, residential properties "
"will require a minimum EPC band C by 2030 for new tenancies."
)
doc.add_page_break()
# ββ Summary Cost Table βββββββββββββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "APPENDIX 1 β SUMMARY ESTIMATED REPAIR COSTS", 1)
add_body(doc,
"The following costs are indicative only, based on current market rates for "
"central London. Firm quotations should be obtained from suitably qualified "
"contractors prior to exchange of contracts."
)
add_table(doc,
headers=["Item", "Priority", "Estimated Cost (Β£)"],
rows=[
["Front chimney stack β flaunching and repoint", "Immediate", "3,500β5,500"],
["North roof slope β re-slate (approx. 15%)", "Immediate", "12,000β18,000"],
["Front parapet gutter β re-lead and repoint", "Urgent", "6,000β9,000"],
["Structural engineer β crack investigation", "Urgent", "800β1,500"],
["Full rewire (EICR-led)", "Urgent", "18,000β28,000"],
["Garage asbestos roof removal and replacement", "Urgent", "4,000β7,000"],
["Window redecoration and failed IGU replacement", "Within 12 months", "8,000β14,000"],
["Rear chimney pot capping", "Within 12 months", "600β900"],
["Arborist report and tree management", "Within 12 months", "500β1,200"],
["CCTV drain survey", "Before exchange", "400β700"],
["Internal wall insulation (optional upgrade)", "Recommended", "35,000β50,000"],
]
)
add_body(doc, "Total indicative repair costs (essential items): Β£53,300 β Β£84,800")
add_body(doc, "Total indicative costs (including IWI upgrade): Β£88,300 β Β£134,800")
doc.add_page_break()
# ββ Legal Matters ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "APPENDIX 2 β LEGAL AND STATUTORY MATTERS TO INVESTIGATE", 1)
add_bullet(doc, "Planning history: confirm no unauthorized works, especially to rear addition")
add_bullet(doc, "Building Regulations: obtain completion certificates for rear extension (circa 2004)")
add_bullet(doc, "Party Wall Act: confirm agreements in place for previous work to south boundary")
add_bullet(doc, "Tree Preservation Order: verify whether London plane tree is subject to TPO")
add_bullet(doc, "Listed Building status: property not listed but within Edwardes Square conservation area")
add_bullet(doc, "Restrictive covenants: to be reported on by client's solicitors")
# ββ Limitations ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
add_heading(doc, "APPENDIX 3 β LIMITATIONS OF THIS REPORT", 1)
add_body(doc,
"This report is prepared in accordance with the RICS Home Survey Standard (2019) "
"and the current edition of the RICS Building Survey specification. It is based "
"solely on a visual inspection of accessible elements of the property on the "
"date stated and does not include any opening up, testing of services, or "
"investigation of concealed areas. The report should be read in its entirety. "
"It is prepared for the exclusive use of the named client and Hartley & Partners "
"accepts no responsibility to any third party."
)
out_path = "mock_survey_42_victoria_road.docx"
doc.save(out_path)
print(f"Saved: {out_path}")
if __name__ == "__main__":
build()
|