Skip to main content

Extensible Fields

The extensible fields system lets you attach typed custom attributes to any platform entity — without writing code or changing the schema. Tenant administrators define the fields they need, assign them to specific entity types, and start recording values immediately.

Overview

Different tenants deploy the platform for different purposes. A tenant managing vending machines needs different device attributes than one managing pool tables or showers. Rather than hard-coding fields for each use case, the extensible fields system provides a structured runtime extension mechanism.

The core idea is simple: administrators define a category (a named group of attributes), attach typed attribute definitions to it, assign that category to the relevant entity type, and then record values against individual entities.

No schema migrations, no code deploys — new fields appear as soon as they are configured.

Architecture

The system uses a four-part model:

ComponentRole
CategoryA named group of related attributes. Categories are reusable across entity types.
AttributeA single typed field definition within a category — name, data type, and optional validation.
AssignmentA link between a category and a specific entity type, optionally scoped to a subtype.
ValueThe actual stored value for one attribute on one entity instance.

Each layer is independent. The same category can be assigned to multiple entity types. Changing attribute definitions does not require touching existing values.

Data model

The extensible fields system exposes four views:

fnd_categories

Stores category definitions. Each category has a unique code within the tenant, a display name, and an entity type that constrains which kind of entity it can be assigned to.

ColumnPurpose
category_idUnique identifier
category_codeMachine-readable code (e.g. DCM_VENDING)
category_nameDisplay name
entity_typeThe kind of entity this category applies to (e.g. DCM_DEVICE)
descriptionOptional description of what this category represents
activeWhether the category is available for new assignments

fnd_category_attrs

Stores attribute definitions within a category. Each attribute belongs to exactly one category and has a declared data type that controls storage and validation.

ColumnPurpose
attr_idUnique identifier
category_idThe parent category
attr_codeMachine-readable code within the category (e.g. MAX_SLOTS)
attr_nameDisplay label
data_typeStorage type: TEXT, NUMBER, DATE, BOOLEAN, or LOOKUP
lookup_typeFor LOOKUP attributes — the lookup type that constrains allowed values
requiredWhether a value must be provided
default_valueOptional default applied when no value is recorded
display_orderSort position within the category

fnd_category_assignments

Links a category to a specific entity type and optional subtype. An assignment is what makes a category's attributes available on a particular kind of entity.

ColumnPurpose
assignment_idUnique identifier
category_idThe category being assigned
entity_typeThe entity type receiving this category (e.g. DCM_DEVICE)
entity_subtypeOptional refinement — restricts the assignment to a specific subtype (e.g. VENDING_MACHINE)
activeWhether the assignment is currently in effect

fnd_category_values

Stores the actual field values. Each row records one attribute value for one entity instance. Values are stored in typed columns — the correct column is populated based on the attribute's declared data_type.

ColumnPurpose
value_idUnique identifier
assignment_idThe category assignment that applies to this entity
attr_idThe attribute being valued
entity_idThe specific entity instance
text_valueValue for TEXT and LOOKUP attributes
number_valueValue for NUMBER attributes
date_valueValue for DATE attributes
boolean_valueValue for BOOLEAN attributes

Each entity can have at most one value per attribute — the combination of entity_id and attr_id is unique.

Supported attribute types

Data typeStored in columnTypical use
TEXTtext_valueShort strings, codes, free text
NUMBERnumber_valueCounts, measurements, quantities
DATEdate_valueTimestamps, installation dates, expiry dates
BOOLEANboolean_valueFlags, capability indicators
LOOKUPtext_valueConstrained values from a lookup list

LOOKUP attributes store the lookup value code in text_value. The human-readable meaning can be resolved by joining with the appropriate lookup values view.