Building Fabric Asset Class
Building Fabric Asset Class
Building fabric assets are the structural and envelope elements of a block — roofing, double glazing, guttering, external insulation, cladding, and drainage. Unlike plant & equipment, they are replaced based on survey condition and age rather than fixed service intervals, and they typically represent the largest long-term capital expenditure items on any reserve fund projection.
Section-by-Section Sub-Entries
A single building fabric asset record (e.g. "Flat Roof") can cover multiple distinct physical sections (e.g. "Main roof", "Rear extension roof", "Plant room roof"). Each section has its own:
- Condition rating (1–5 scale)
- Estimated replacement cost — cost to replace that section alone
- Quantity / area — m², linear metres, units, etc.
- Survey notes — defects, repair history, contractor recommendations
This section-by-section model enables partial replacement planning: not every section of a fabric element may need replacing at the same time, and the reserve fund projection accounts for this.
Condition Ratings
| Rating | Label | Action |
|---|---|---|
| 5 | Excellent (as new) | No action required |
| 4 | Good | Monitor at next survey |
| 3 | Average (serviceable) | Include in medium-term plan |
| 2 | Below Average (plan replacement) | Prioritise for partial replacement |
| 1 | Poor (replace immediately) | Flag for immediate replacement |
Sections rated 1 or 2 trigger an early replacement flag and are highlighted with a replacement priority alert in the panel.
Asset Detail View — Building Fabric Panel
When an asset's class is set to building_fabric, the asset detail view shows the Building Fabric Panel instead of a generic display. The panel includes:
Key Metrics Card
- Asset Condition — overall condition rating badge; early replacement flag if triggered
- Age & Lifespan — current age in years, estimated lifespan, and percentage of lifespan consumed
- Replacement Year — projected (auto-calculated from install date + lifespan) or manual override
- Total Cost — estimated full replacement cost; benchmarked flag shown where applicable; section cost total shown if it differs from the asset-level total
Survey Staleness Notice
If no inspection date is recorded, or if the last inspection was 3 or more years ago, the panel displays a warning that section condition ratings may no longer be accurate and a re-survey is recommended.
Section Editor
Sections can be added, edited, removed, and reordered directly from the detail view. Changes are saved explicitly via the Save Changes button.
Aggregate section statistics (section count, average condition, total section costs) are displayed above the section list when at least one section exists.
Poor condition alert lists all sections rated 1 or 2 by name and condition, with guidance to prioritise them for partial replacement planning.
Reserve Fund Integration Notice
The panel displays a contextual notice explaining how this asset's capex feeds into the reserve fund projection:
- If cost and replacement year are both set: shows the forecast year and cost, notes if the estimate is benchmarked, and notes if section sub-entries enable partial replacement planning.
- If cost is missing: prompts the agent to add an estimated replacement cost.
- If replacement year is missing: prompts the agent to set an install date and estimated lifespan.
Asset Create Form
When creating a new asset with class building_fabric, the Section-by-Section Sub-Entries editor is shown in place of the previous raw JSON textarea. Agents can add sections with guided form fields from the very first save.
Section Form Fields
| Field | Required | Notes |
|---|---|---|
| Section Name | Yes | Identifies the specific part (e.g. "North elevation", "Rear flat roof") |
| Condition Rating (1–5) | No | Dropdown; triggers priority warning at 1 or 2 |
| Estimated Section Cost (£) | No | Cost to replace this section alone; enables partial replacement modelling |
| Quantity / Area | No | Free text — m², lm, units, etc.; used for benchmarking cost per unit |
| Notes | No | Survey observations, defects, repair history |
buildingFabricSummary API Endpoint
The asset.buildingFabricSummary tRPC query provides a portfolio-level summary of all building fabric assets. It is used for reporting dashboards and reserve fund integration.
Input
{ blockId?: string }
Omit blockId to query across the entire organisation. Provide a blockId to scope results to a single block.
Response
{
totalBuildingFabricAssets: number;
// Asset-level totals
totalReplacementCostPence: number;
earlyReplacementCount: number;
benchmarkedCount: number;
// Section-level aggregates
totalSections: number;
poorSectionCount: number; // sections with condition ≤ 2
avgSectionCondition: number | null;
totalSectionCostPence: number;
// Data quality
missingInstallDateCount: number;
missingLifespanCount: number;
missingCostCount: number;
// Reserve fund integration
costsByYear: Record<number, number>; // replacement year → total cost in pence
// Full asset list
items: Array<{
id: string;
name: string;
blockId: string;
conditionRating: number | null;
earlyReplacementFlag: boolean;
estimatedReplacementCostPence: number | null;
isBenchmarked: boolean;
projectedReplacementYear: number | null;
manualReplacementYear: number | null;
installDate: Date | null;
estimatedLifespanYears: number | null;
hasSections: boolean;
}>;
// Up to 10 assets due within the next 10 years, sorted ascending
upcomingReplacements: Array<{
id: string;
name: string;
blockId: string;
replacementYear: number | null;
estimatedReplacementCostPence: number | null;
conditionRating: number | null;
earlyReplacementFlag: boolean;
}>;
}
costsByYear
This field groups total replacement costs by projected replacement year. It is the primary input for reserve fund year-by-year cash flow modelling. The year used is manualReplacementYear where set, otherwise projectedReplacementYear.
upcomingReplacements
Assets due for replacement between the current year and the next 10 years, sorted by replacement year ascending and capped at 10 results.
Data Storage
Fabric sections are stored as a JSON string in the fabricSections column of the asset record. The panel and API handle both the legacy format (section, condition, notes only) and the full format (with estimatedCostPence and quantity), so existing records remain readable without migration.
Audit Trail
All section updates are saved via asset.update, which is covered by the existing asset audit log. Every change to fabric sections is recorded in the audit trail.