Block Detail View
Block Detail View
The Block Detail View is the core operational hub of the platform. It aggregates all child entity data — units, management account sources, client money accounts, and ownership history — into a single screen so you can assess a block's full status at a glance.
Accessing the Detail View
From Dashboard → Blocks, click any block in the list. The list view is replaced by the detail view. Use the Back button to return to the list.
Sections
Block Information
Displays headline stats for the block:
| Stat | Description |
|---|---|
| Total Units | The configured unit count for the block |
| Owner | Owner name with a company or individual icon |
| Address | Full postal address (address line 1, line 2, city, postcode) |
| Created | Date the block record was created |
No Owner warning — if no owner is assigned an amber banner is displayed. Every block must belong to exactly one owner; this banner indicates a data integrity issue that should be resolved.
Units
Shows a live breakdown of units registered against this block:
| Status | Description |
|---|---|
| Total | All registered units |
| Occupied | Units with an active occupancy |
| Vacant | Units with no current occupancy |
| Sublet | Units that are being sublet |
| Sold (Pending) | Units sold but pending legal completion |
The View all link navigates to the Units page filtered to this block. If no units exist, an Add Units CTA is shown.
Management Account Sources
Lists every management account source connected to this block. The section header badge shows:
- Active (green) — at least one source is active.
- Not Configured (amber) — no sources are present. This is a financial reporting gate; reports cannot be run until a source is added.
Each source row displays:
- Source type icon and label (TrueLayer Bank Feed, Calmony Account, Manual Ledger / CSV, Accounting Connector)
- Connector provider name, if applicable
- Active or Inactive status badge
Client Money Accounts
Displays the Main and Reserve client money accounts for the block (the two-account structure). Each account card shows:
Account type badge — Main (blue) or Reserve (amber).
Account status badge — one of:
- Active
- Pending Application
- Pending Verification
- Suspended
- Closed
Compliance indicators (green check or red cross for each):
| Indicator | Meaning |
|---|---|
| Ring-Fenced | Client funds are held in a ring-fenced account |
| Fee Excluded | Management fees are excluded from client money |
| CASS Acknowledged | CASS acknowledgement has been received |
| RICS Compliant | Account meets RICS client money handling requirements |
If no accounts exist, a note is shown explaining the two-account structure.
Use the Manage link to navigate to the Client Money Accounts management page.
Ownership Transfer History
Shows the last 5 ownership transfer events for the block, in reverse-chronological order. Each entry records the transfer date and, where provided, the reason. This section is hidden when no transfers exist.
Editing a Block
Click Edit in the top-right of the detail view to open the block edit form inline. Save or cancel to return to the detail view.
Deleting a Block
Click Delete to reveal the confirmation panel. The confirmation message explicitly warns that deleting the block will also remove:
- All management account sources
- All client money accounts
- All other associated records
This action is irreversible.
Business Rules Enforced
- Every block must belong to exactly one owner — an amber banner is shown if unassigned.
- A block requires at least one active management account source before financial reporting is available — the Management Account Sources section is badged Not Configured until this is resolved.
- Client money accounts must individually satisfy ring-fencing, fee exclusion, CASS, and RICS requirements — compliance gaps are visible per account.
API Reference
The detail view is powered by the block.getDetail tRPC query.
// Input
{ id: string }
// Returns null if the block is not found or does not belong to the caller's org.
// Otherwise returns:
{
// All block fields (id, name, orgId, ownerId, totalUnits, address fields, createdAt, updatedAt, …)
owner: {
id: string;
name: string;
ownerType: string; // "company" | "individual"
email: string | null;
} | null;
unitSummary: {
total: number;
occupied: number;
vacant: number;
sublet: number;
soldPending: number; // status === "sold_pending_completion"
};
managementSources: Array<{
id: string;
sourceType: string;
label: string;
isActive: boolean;
connectorProvider: string | null;
createdAt: Date;
}>;
clientMoneyAccounts: Array<{
id: string;
accountType: string; // "main" | "reserve"
status: string;
label: string;
isRingFenced: boolean;
managementFeeExcluded: boolean;
cassAcknowledgementReceived: boolean;
lastReconciliationPassed: boolean;
ricsCompliant: boolean;
createdAt: Date;
}>;
recentTransfers: Array<{
id: string;
previousOwnerId: string | null;
newOwnerId: string | null;
reason: string | null;
createdAt: Date;
}>; // last 5, most recent first
hasManagementAccount: boolean; // true if any managementSource.isActive === true
}
The query is scoped to the caller's organisation (orgId) — it will return null for blocks belonging to other organisations.