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()