Currently available tables for preferences are
| provisioning.voip_preferences | contains all available preferences, do not contain user data. | 
| provisioning.voip_preference_group | contains preference group names, so the preferences can be put into groups. | 
| provisioning.voip_preferences_enum | contains enum values for preferences, do not contain user data. | 
The following tables contain user data and depend on voip_preferences
and optionally on voip_preferences_enum:
| provisioning.voip_dev_preferences | PBX device model preferences | 
| provisioning.voip_devprof_preferences | PBX device profile preferences | 
| provisioning.voip_dom_preferences | domain preferences,
replicated by triggers to  | 
| provisioning.voip_contract_preferences | customer preferences,
replicated by triggers to  | 
| provisioning.voip_peer_preferences | peering server preferences,
replicated by triggers to  | 
| provisioning.voip_prof_preferences | subscriber profile preferences | 
| provisioning.voip_reseller_preferences | reseller preferences | 
| provisioning.voip_usr_preferences | subscriber preferences,
replicated by triggers to  | 
Columns for table provisioning.voip_preferences
| id | primary key, used in user tables as the foreign key | 
| voip_preference_groups_id | preference group id | 
| attribute | preference name | 
| label | tooltip that can be used as a mouseover tooltip on the UI | 
| type | 0 - string, 1 - integer/boolean | 
| max_occur | how many preferences with the name are allowed 0: list, 1: only one | 
| usr_pref | defines if the preference can be used in subscribers | 
| prof_pref | defines if the preference can be used in subcsriber profiles | 
| dom_pref | defines if the preference can be used in domains | 
| peer_pref | defines if the preference can be used in peering servers | 
| contract_pref | defines if the preference can be used in customers | 
| contract_location_pref | defines if the preference can be used in customer locations | 
| dev_pref | defines if the preference can be used in PBX device models | 
| devprof_pref | defines if the preference can be used in PBX device profiles | 
| fielddev_pref | defines if the preference can be used in PBX devices that are assigned to a subscriber | 
| modify_timestamp | preference last modification time | 
| internal | preference if for internal use only and not shown in the UI/API | 
| expose_to_customer | unused, as now there are dedicated customer preferences table | 
| data_type | data type enum, boolean, int, string | 
| read_only | ready only flag | 
| description | long description of the preference | 
| dynamic | set to 1 if it is a custom preference that is created by a user (usually for a PBX device model that requires specific ferences) but can be used for all preferences when needed | 
| reseller_pref | defines if the preference can be used in resellers | 
All tables are in database "provisioning".
So called "enum preferences" allow a fixed set of possible values, an enumeration, for preferences. Following the differences between other preferences are described.
Setting the attribute "data_type" of table "voip_preferences" to "enum" marks a preferences as an enum. The list of possible options is stored in table "voip_preferences_enum".
Columns for table provisioning.voip_preferences_enum are:
| id | primary key | 
| preference_id | Reference to table voip_preferences. | 
| label | A label to be displayed in frontends. | 
| value | Value that will be written to voip_[usr | 
| dom | peer]preferences.value if it is NOT NULL. Will not be written if it IS NULL. This can be used to implement a "default value" for a preference that is visible in frontends as such (will be listed first if nothing is actually selected), but will not be written to voip[usr | 
| dom | peer]_preferences.value. Usually forcing a domain or peer default. Should also be named unambiguous (eg. "use domain default"). (Note: Therefore will also not be written to any kamailio table.) | 
| usr_pref | Flag if this is to be used for usr preferences. | 
| dom_pref | Flag if this is to be used for dom preferences. | 
| peer_pref | Flag if this is to be used for peer preferences. | 
| default_val | Flag indicating if this should be used as a default value when creating new entities or introducing new enum preferences (both done via triggers). (Note: For this to work, value must also be set.) | 
Relevant triggers:
| enum_update | Propagates changes of voip_preferences_enum.value to voip_[usr | 
| dom | peer]_preferences.value | 
| enum_set_default | Will create entries for default values when adding a new enum preference. The default value is the tuple from voip_preferences_enum WHERE default_val=1 AND value NOT NULL. | 
| voip_dom_crepl_trig | The trigger will set possible default values (same condition as for enum_set_default) when creating new domains. | 
| voip_phost_crepl_trig | The trigger will set possible default values (same condition as for enum_set_default) when creating new peers. | 
| voip_sub_crepl_trig | The trigger will set possible default values (same condition as for enum_set_default) when creating new subscribers. | 
Find a usage example in a section in db-schema/db_scripts/diff/9086.up.