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