Skip to content

Occupier Events

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.

FieldRequired whenWhat you see if missing
SchemeAlways”Scheme is required.”
Building UseAlways”Building use is required.”
Event TypeAlways”Event type is required.”
Event StatusAlways”Event status is required.”
Occupier (or Unknown Occupier)Always”An occupier must be selected or marked as unknown.”

The Description textarea is capped at 500 characters with “Description must be 500 characters or fewer.”

The Occupier Size field rejects negatives with “Size must be non-negative.”

The Rent field rejects negatives with “Rent must be non-negative.”

The Lease Length field requires a value strictly greater than 0. Zero or negative are rejected with “Lease length must be positive.”

The Rent Free field rejects negatives with “Rent free period must be non-negative.”

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.

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.

If you enter an Occupier Size, the matching Size Unit becomes required: “Size unit is required when size is specified.”

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.”

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.

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.

Scheme, Building Use, Event Type, Event Status all re-checked. The occupier-or-unknown rule is re-checked.

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.

  • 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.
  • 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.
  • 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.cs and OccupierCompany.cs
  • Command handlers: src/services/api/app/app.api/Handlers/Commands/OccupierEvents/
  • List-view mapper: src/common/models/Services/QueryViews/OccupierEventListViewMapper.cs