Occupier Events
Overview
Section titled “Overview”An occupier event records a tenancy — who is occupying space at a scheme, how big the let is, the rent, and the lease terms. The required structure is more demanding than other entities (a scheme, a building use, a type, and a status are all needed) and there’s an explicit rule that you must either name the occupier or tick Unknown Occupier: you can’t leave the role blank.
Save is only enabled once you’ve changed something.
Required fields
Section titled “Required fields”| Field | Required when | What you see if missing |
|---|---|---|
| Scheme | Always | ”Scheme is required.” |
| Building Use | Always | ”Building use is required.” |
| Event Type | Always | ”Event type is required.” |
| Event Status | Always | ”Event status is required.” |
| Occupier (or Unknown Occupier) | Always | ”An occupier must be selected or marked as unknown.” |
Field-level rules
Section titled “Field-level rules”Description max 500 characters
Section titled “Description max 500 characters”The Description textarea is capped at 500 characters with “Description must be 500 characters or fewer.”
Sizes must be non-negative
Section titled “Sizes must be non-negative”The Occupier Size field rejects negatives with “Size must be non-negative.”
Rent must be non-negative
Section titled “Rent must be non-negative”The Rent field rejects negatives with “Rent must be non-negative.”
Lease length must be positive
Section titled “Lease length must be positive”The Lease Length field requires a value strictly greater than 0. Zero or negative are rejected with “Lease length must be positive.”
Rent-free period must be non-negative
Section titled “Rent-free period must be non-negative”The Rent Free field rejects negatives with “Rent free period must be non-negative.”
Break option max 255 characters
Section titled “Break option max 255 characters”The Break Option text field is capped at 255 characters with “Break option must be 255 characters or fewer.”
Where this lives: src/services/web/src/lib/validation/occupier-event.ts.
Cross-field rules
Section titled “Cross-field rules”Rent-free can’t exceed lease length
Section titled “Rent-free can’t exceed lease length”If both Lease Length (years) and Rent Free (months) are filled, the rent-free period must be no longer than the lease itself — i.e. RentFree ≤ LeaseLength × 12. Otherwise: “Rent free period (months) cannot exceed lease length (years × 12).” For example a 10-year lease allows up to a 120-month rent-free period.
Size needs a unit
Section titled “Size needs a unit”If you enter an Occupier Size, the matching Size Unit becomes required: “Size unit is required when size is specified.”
Rent needs a unit
Section titled “Rent needs a unit”If you enter a Rent, the matching Rent Size Unit (the per-foot / per-square-metre / per-period selector) becomes required: “Rent size unit is required when rent is specified.”
Occupier-or-unknown — pick one
Section titled “Occupier-or-unknown — pick one”Every occupier event needs either a named Occupier company, or the Unknown Occupier checkbox ticked. Leaving both blank: “An occupier must be selected or marked as unknown.” Ticking Unknown and picking a company is also rejected: “Cannot mark occupier as unknown when a company is selected.”
This rule fires only on the Occupier role. Other roles (vendor, agents) follow the standard unknown-placeholder pattern from Unknown and optional fields.
Closed date appears when “Is Closed” is ticked
Section titled “Closed date appears when “Is Closed” is ticked”Ticking Is Closed? reveals a Closed Date field.
Auto-closure when the parent scheme closes
Section titled “Auto-closure when the parent scheme closes”If a development on the parent scheme is moved to a closed status, the propagation rule ticks IsRetired (with the development’s ClosedDate) on every occupier event attached to that scheme. The cascade is one-way; subsequently re-opening the development does not un-tick the occupier events. To re-open an occupier event after this, edit it manually. See Developments → Setting a development to Closed cascades to its scheme.
Conditional UI
Section titled “Conditional UI”Rent display follows the unit’s template
Section titled “Rent display follows the unit’s template”When viewing an occupier event, the Rent value is formatted according to the Rent Size Unit you picked. Units like £ per sqft per year render as £50 psf pa; £ per month renders as £3,000 pcm. The format template lives on the size unit itself, and the user’s currency preference can substitute the symbol at display time.
See Units and display for the full rules around how rent is formatted.
Lease and rent-free fields hide under “Surrender” and similar event types
Section titled “Lease and rent-free fields hide under “Surrender” and similar event types”Not every event type has lease terms — for example, a Surrender event ends the tenancy, so the lease length and rent-free fields are hidden for those types. The fields reappear when you switch to a leasing event type.
On save
Section titled “On save”Required-field check
Section titled “Required-field check”Scheme, Building Use, Event Type, Event Status all re-checked. The occupier-or-unknown rule is re-checked.
Concurrency check
Section titled “Concurrency check”The save carries the RowVersion of the event you loaded. If another user has updated it since, you get a concurrency error. See Concurrent edits.
After save
Section titled “After save”- An OccupierEventCreated or OccupierEventUpdated event fires.
- The row in the OccupierEventList query view is upserted; list pages and search reflect the change on next refresh.
- The completeness score is recalculated (via the nightly job).
- An audit log entry records the change.
Related rules
Section titled “Related rules”- Schemes — every occupier event attaches to a scheme.
- Developments — the Building Use on the event corresponds to a use on a development within the scheme.
- Companies — the occupier company is drawn from the company directory.
- Investment Events — sibling event type on a scheme. Different rules around shares and ownership types.
- Unknown and optional fields — the Unknown Occupier checkbox; vendor-side unknown placeholders.
- Units and display — net vs gross, rent formats, sqm vs sqft.
- Currency — how rent in local currency converts to your preferred display currency.
- Concurrent edits — RowVersion mechanics.
Where this lives
Section titled “Where this lives”- Frontend validation:
src/services/web/src/lib/validation/occupier-event.ts - Edit form:
src/services/web/src/lib/components/panels/OccupierEventEdit.svelte - Model:
src/common/models/Models/OccupierEvent.csandOccupierCompany.cs - Command handlers:
src/services/api/app/app.api/Handlers/Commands/OccupierEvents/ - List-view mapper:
src/common/models/Services/QueryViews/OccupierEventListViewMapper.cs