Companies
Overview
Section titled “Overview”A company is an organisation that turns up on schemes (as developer, owner, operator), investment events (as investor or vendor), occupier events (as occupier), and portfolios (across all of the above). The directory is small in rule count — really just a name, an optional company number, an optional URL, and an optional company type — but every other record borrows the directory by linking to companies.
Save is only enabled once you’ve changed something.
Required fields
Section titled “Required fields”| Field | Required when | What you see if missing |
|---|---|---|
| Company Name | Always | ”Company name is required.” |
Field-level rules
Section titled “Field-level rules”Company name max 255 characters
Section titled “Company name max 255 characters”The form rejects names longer than 255 characters with “Company name must be 255 characters or fewer.” Empty or whitespace-only names are rejected as missing.
URL must be a valid URL (and max 255 characters)
Section titled “URL must be a valid URL (and max 255 characters)”The URL field is optional, but if you enter something it must be a valid URL — otherwise you’ll see “Must be a valid URL.” The 255-character cap applies on top.
Company Number max 255 characters
Section titled “Company Number max 255 characters”The Company Number is free-form text (different jurisdictions use different formats — Companies House registration numbers, EIN, etc.) capped at 255 characters.
Where this lives: src/services/web/src/lib/validation/company.ts.
Cross-field rules
Section titled “Cross-field rules”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.
Conditional UI
Section titled “Conditional UI”Country picker filters as you type
Section titled “Country picker filters as you type”The Country dropdown supports type-to-filter, like on Addresses. Typing narrows the list, arrows move the highlight, Enter selects.
Parent company picker excludes self-loops
Section titled “Parent company picker excludes self-loops”When picking a Parent Company, the search results exclude the company being edited. You can’t make a company its own parent.
Address picker links to an existing address
Section titled “Address picker links to an existing address”The company’s Address is picked from the existing Addresses directory rather than typed inline. If the address you need doesn’t exist, create it from Addresses first.
On save
Section titled “On save”Required-field check
Section titled “Required-field check”Company name must be present (non-empty after trimming).
Concurrency check
Section titled “Concurrency check”The save carries the RowVersion of the company you loaded. If another user has updated it since, you get a concurrency error. See Concurrent edits.
After save
Section titled “After save”- A CompanyCreated or CompanyUpdated event fires.
- The company’s row in the CompanyList query view is upserted so list pages and search reflect the change.
- An audit log entry records the change.
Completeness score inputs
Section titled “Completeness score inputs”The score weights:
- Company Name (already required)
- URL
- Company Number
- Address
- Country
- Company Type
- Offer Score (an internal sales-funnel signal)
- Is Verified flag
See Completeness score.
Roles companies play on other records
Section titled “Roles companies play on other records”The directory itself doesn’t enforce role rules — those live on the records that reference the company. For a complete picture of what a company can be tagged as:
- On a scheme — Developer, Owner, Operator, Investor, etc. The “at least one company” requirement on a non-Hotel scheme excludes Operator roles; on a Hotel scheme it counts every role. See Schemes → Building type drives the Companies rule.
- On an investment event — Investor, Vendor, plus their Agent variants. Investor and Vendor support an Unknown placeholder; only Investor carries a Share %. See Investment Events.
- On a portfolio — investors, vendors, and other roles. Share % appears only under Share ownership. See Portfolios.
- On an occupier event — the occupier company itself (or marked Unknown). See Occupier Events.
Related rules
Section titled “Related rules”- Schemes, Investment Events, Portfolios, Occupier Events — where companies are referenced and the role-specific rules.
- Addresses — companies optionally attach to a primary address.
- Search matching — how the company search box matches (synonyms for company suffixes like ltd ↔ limited).
- Unknown and optional fields — the Unknown placeholder semantics.
- Concurrent edits — RowVersion mechanics.
Where this lives
Section titled “Where this lives”- Frontend validation:
src/services/web/src/lib/validation/company.ts - Edit form:
src/services/web/src/lib/components/panels/CompanyEdit.svelte - Model:
src/common/models/Models/Company.cs - Command handlers:
src/services/api/app/app.api/Handlers/Commands/Companies/ - Search service:
src/services/api/app/app.api/Services/Search/CompanySearchService.cs - List-view mapper:
src/common/models/Services/QueryViews/CompanyListViewMapper.cs