Spaces:
Sleeping
Sleeping
| """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() | |