OBV Database Schema
Overview
Section titled “Overview”The OBV module uses PostgreSQL 16 accessed via Prisma ORM v6. The schema is defined in nitro-backend/prisma/schema.prisma.
All primary keys are UUID strings generated by @default(uuid()). All models include createdAt and updatedAt timestamps.
Entity Relationship Diagram
Section titled “Entity Relationship Diagram”erDiagram Villa { string id PK string villaCode UK string villaName string address string city string country string zipCode float latitude float longitude int bedrooms int bathrooms int maxGuests float propertySize float plotSize int yearBuilt int renovationYear PropertyType propertyType VillaStyle villaStyle string locationType string description string shortDescription VillaStatus status boolean isDraft boolean isActive string sharePointBasePath datetime sharePointCreatedAt json bedroomConfiguration datetime createdAt datetime updatedAt }
Owner { string id PK string villaId FK string clerkUserId string firstName string lastName string email string phone OwnerType ownerType string nationality string address string city string country CommunicationPreference communicationPreference datetime createdAt datetime updatedAt }
ContractualDetails { string id PK string villaId FK datetime contractStartDate datetime contractEndDate ContractType contractType decimal commissionRate decimal managementFee decimal marketingFee PaymentSchedule paymentSchedule int minimumStayNights CancellationPolicy cancellationPolicy string checkInTime string checkOutTime string vatRegistrationNumber string dbdNumber datetime createdAt datetime updatedAt }
BankDetails { string id PK string villaId FK string accountHolderName string bankName string accountNumber string iban string swiftCode string currency string bankCountry boolean isVerified datetime verifiedAt datetime createdAt datetime updatedAt }
OTACredentials { string id PK string villaId FK OTAPlatform platform string propertyId string username string password string apiKey boolean isActive SyncStatus syncStatus datetime lastSyncAt datetime createdAt datetime updatedAt }
Staff { string id PK string villaId FK string firstName string lastName string email string phone StaffPosition position StaffDepartment department EmploymentType employmentType datetime startDate decimal salary SalaryFrequency salaryFrequency string currency boolean hasAccommodation boolean hasTransport boolean hasHealthInsurance boolean isActive json emergencyContacts datetime createdAt datetime updatedAt }
Photo { string id PK string villaId FK PhotoCategory category string fileName string fileUrl string thumbnailUrl int fileSize string mimeType boolean isMain int sortOrder string subfolder string sharePointFileId string sharePointUrl string storageLocation bytes fileContent bytes thumbnailContent datetime createdAt datetime updatedAt }
Document { string id PK string villaId FK DocumentType documentType string fileName string fileUrl int fileSize string mimeType boolean isActive string sharePointFileId string sharePointUrl string storageLocation bytes fileContent datetime validFrom datetime validUntil datetime createdAt datetime updatedAt }
FacilityChecklist { string id PK string villaId FK FacilityCategory category string subcategory string itemName boolean isAvailable int quantity string condition string notes string photoUrl string sharePointUrl bytes photoData datetime lastCheckedAt datetime createdAt datetime updatedAt }
OnboardingProgress { string id PK string villaId FK int currentStep int totalSteps boolean villaInfoCompleted boolean ownerDetailsCompleted boolean contractualDetailsCompleted boolean bankDetailsCompleted boolean otaCredentialsCompleted boolean staffConfigCompleted boolean facilitiesCompleted boolean photosUploaded boolean documentsUploaded boolean reviewCompleted OnboardingStatus status datetime submittedAt datetime createdAt datetime updatedAt }
OnboardingBackup { string id PK string userId string sessionId string villaId FK int currentStep json stepData datetime lastSaved boolean autoSaveEnabled datetime createdAt datetime updatedAt }
OnboardingStepProgress { string id PK string villaId FK int stepNumber string stepName StepStatus status boolean isValid json validationErrors int[] dependsOnSteps int version datetime createdAt datetime updatedAt }
StepFieldProgress { string id PK string stepProgressId FK string fieldName string fieldType FieldStatus status boolean isSkipped json value boolean isValid boolean isRequired datetime createdAt datetime updatedAt }
SkippedItem { string id PK string villaId FK SkippedItemType itemType int stepNumber string fieldName SkipCategory skipCategory string skippedBy datetime skippedAt boolean isActive datetime createdAt datetime updatedAt }
OnboardingSession { string id PK string villaId FK string userId string userEmail datetime sessionStartedAt int currentStep int stepsCompleted int fieldsCompleted boolean isCompleted boolean submittedForReview datetime createdAt datetime updatedAt }
Villa ||--o| Owner : "owner" Villa ||--o| ContractualDetails : "contractualDetails" Villa ||--o| BankDetails : "bankDetails" Villa ||--o{ OTACredentials : "otaCredentials" Villa ||--o{ Staff : "staff" Villa ||--o{ Photo : "photos" Villa ||--o{ Document : "documents" Villa ||--o{ FacilityChecklist : "facilities" Villa ||--o| OnboardingProgress : "onboarding" Villa ||--o{ OnboardingBackup : "onboardingBackups" Villa ||--o{ OnboardingStepProgress : "stepProgress" Villa ||--o| OnboardingSession : "onboardingSession" Villa ||--o{ SkippedItem : "skippedItems" OnboardingStepProgress ||--o{ StepFieldProgress : "fields"Models
Section titled “Models”The central entity. All other models relate back to a villa via villaId.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaCode | String | Yes | Unique human-readable code (e.g. BALI-001) |
villaName | String | Yes | Display name |
address | String | Yes | Street address |
city | String | Yes | City |
country | String | Yes | Country |
zipCode | String? | No | Postal code |
latitude | Float? | No | GPS latitude |
longitude | Float? | No | GPS longitude |
bedrooms | Int | Yes | Number of bedrooms |
bathrooms | Int | Yes | Number of bathrooms |
maxGuests | Int | Yes | Maximum guest capacity |
propertySize | Float? | No | Interior size (m²) |
plotSize | Float? | No | Land plot size (m²) |
yearBuilt | Int? | No | Year of construction |
renovationYear | Int? | No | Year of last renovation |
propertyType | PropertyType | Yes | Enum: VILLA, APARTMENT, etc. |
villaStyle | VillaStyle? | No | Enum: MODERN, BALINESE, etc. |
locationType | String? | No | e.g. Seaview, Beachfront, Mountain |
description | String? | No | Long description |
shortDescription | String? | No | Short marketing copy |
status | VillaStatus | Yes | DRAFT | ACTIVE | INACTIVE | ARCHIVED |
isDraft | Boolean | Yes | Default true during onboarding |
isActive | Boolean | Yes | Default true |
propertyEmail | String? | No | Property-specific email |
propertyWebsite | String? | No | Property website URL |
sharePointBasePath | String? | No | SharePoint folder path (set on first upload) |
sharePointCreatedAt | DateTime? | No | When SharePoint folders were created |
bedroomConfiguration | Json? | No | Array of { id, name, bedType } for bedroom folders |
googleMapsLink | String? | No | Google Maps URL |
iCalCalendarLink | String? | No | iCal feed URL |
createdAt | DateTime | Yes | Auto-set on creation |
updatedAt | DateTime | Yes | Auto-updated |
Indexes: villaCode, status, isActive, (city, country), (propertyType, status), (bedrooms, bathrooms, maxGuests)
One-to-one with Villa. Stores villa owner or company details.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa (unique, cascade delete) |
clerkUserId | String? | No | Clerk user ID for owner portal login |
firstName | String | Yes | — |
lastName | String | Yes | — |
email | String | Yes | — |
phone | String | Yes | — |
alternativePhone | String? | No | — |
nationality | String? | No | — |
passportNumber | String? | No | — |
idNumber | String? | No | National ID |
address | String | Yes | — |
city | String | Yes | — |
country | String | Yes | — |
zipCode | String? | No | — |
preferredLanguage | String | Yes | Default "en" |
communicationPreference | CommunicationPreference | Yes | EMAIL | PHONE | WHATSAPP | SMS |
ownerType | OwnerType | Yes | INDIVIDUAL | COMPANY | TRUST | OTHER |
companyName | String? | No | For COMPANY owners |
companyAddress | String? | No | — |
companyTaxId | String? | No | — |
companyVat | String? | No | — |
managerName | String? | No | Company manager contact |
managerEmail | String? | No | — |
managerPhone | String? | No | — |
notes | String? | No | Internal notes |
Indexes: email, clerkUserId, (villaId, firstName, lastName), nationality
ContractualDetails
Section titled “ContractualDetails”One-to-one with Villa. Management contract terms.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa (unique) |
contractStartDate | DateTime | Yes | — |
contractEndDate | DateTime? | No | Null for open-ended contracts |
contractType | ContractType | Yes | EXCLUSIVE | NON_EXCLUSIVE | SEASONAL | LONG_TERM |
commissionRate | Decimal(5,2) | Yes | ILS commission % |
managementFee | Decimal(5,2)? | No | — |
marketingFee | Decimal(5,2)? | No | — |
paymentTerms | String? | No | Free-text payment terms |
paymentSchedule | PaymentSchedule | Yes | WEEKLY | BIWEEKLY | MONTHLY | QUARTERLY | ANNUALLY |
minimumStayNights | Int | Yes | Default 1 |
cancellationPolicy | CancellationPolicy | Yes | FLEXIBLE | MODERATE | STRICT | SUPER_STRICT | NON_REFUNDABLE |
checkInTime | String | Yes | Default "15:00" |
checkOutTime | String | Yes | Default "11:00" |
insuranceProvider | String? | No | — |
insurancePolicyNumber | String? | No | — |
insuranceExpiry | DateTime? | No | — |
specialTerms | String? | No | Additional terms |
vatRegistrationNumber | String? | No | — |
vatPaymentTerms | String? | No | — |
dbdNumber | String? | No | Thai DBD registration number |
paymentThroughIPL | Boolean | Yes | Default false |
payoutDay1 | Int? | No | First payout day of month |
payoutDay2 | Int? | No | Second payout day of month |
BankDetails
Section titled “BankDetails”One-to-one with Villa. Owner bank account for payouts.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa (unique) |
accountHolderName | String | Yes | — |
bankName | String | Yes | — |
accountNumber | String | Yes | — |
iban | String? | No | Max 34 chars |
swiftCode | String? | No | Max 11 chars |
branchCode | String? | No | — |
branchName | String? | No | — |
branchAddress | String? | No | — |
currency | String | Yes | Default "USD" |
bankAddress | String? | No | — |
bankCountry | String? | No | — |
accountType | String? | No | Default "CHECKING" |
isVerified | Boolean | Yes | Default false |
verifiedAt | DateTime? | No | — |
notes | String? | No | — |
OTACredentials
Section titled “OTACredentials”Many-to-one with Villa. Stores platform login credentials for each OTA.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa |
platform | OTAPlatform | Yes | See enum below |
propertyId | String? | No | Platform-specific property ID |
username | String? | No | Login username |
password | String? | No | Login password |
apiKey | String? | No | — |
apiSecret | String? | No | — |
isActive | Boolean | Yes | Default true |
syncStatus | SyncStatus | Yes | PENDING | IN_PROGRESS | SUCCESS | FAILED | PARTIAL |
lastSyncAt | DateTime? | No | — |
accountUrl | String? | No | Account dashboard URL |
propertyUrl | String? | No | Property listing URL |
listingUrl | String? | No | Direct booking link |
Unique constraint: (villaId, platform) — one record per platform per villa.
Many-to-one with Villa. Villa personnel records.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa |
firstName | String | Yes | — |
lastName | String | Yes | — |
email | String? | No | — |
phone | String | Yes | — |
idNumber | String? | No | National ID |
passportNumber | String? | No | — |
nationality | String? | No | — |
dateOfBirth | DateTime? | No | — |
nickname | String? | No | — |
position | StaffPosition | Yes | See enum |
department | StaffDepartment | Yes | See enum |
employmentType | EmploymentType | Yes | FULL_TIME | PART_TIME | CONTRACT | SEASONAL | FREELANCE |
startDate | DateTime | Yes | — |
endDate | DateTime? | No | Null for current employees |
salary | Decimal(10,2) | Yes | — |
salaryFrequency | SalaryFrequency | Yes | HOURLY | DAILY | WEEKLY | BIWEEKLY | MONTHLY | ANNUALLY |
currency | String | Yes | Default "USD" |
hasAccommodation | Boolean | Yes | Default false |
hasTransport | Boolean | Yes | Default false |
hasHealthInsurance | Boolean | Yes | Default false |
hasWorkInsurance | Boolean | Yes | Default false |
foodAllowance | Boolean | Yes | Default false |
serviceCharge | Decimal? | No | — |
totalIncome | Decimal? | No | — |
totalNetIncome | Decimal? | No | — |
otherDeductions | Decimal? | No | — |
numberOfDaySalary | Int? | No | — |
maritalStatus | Boolean? | No | — |
transportation | String? | No | Transport description |
emergencyContacts | Json? | No | Array of emergency contacts |
isActive | Boolean | Yes | Default true |
Many-to-one with Villa. Supports dual storage (database bytes or SharePoint).
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa |
category | PhotoCategory | Yes | See enum (19 categories) |
fileName | String | Yes | — |
fileUrl | String | Yes | Primary access URL |
thumbnailUrl | String? | No | — |
fileSize | Int | Yes | Bytes |
mimeType | String | Yes | — |
width | Int? | No | Pixels |
height | Int? | No | Pixels |
caption | String? | No | — |
altText | String? | No | — |
tags | String[] | Yes | Default [] |
isMain | Boolean | Yes | Default false |
sortOrder | Int | Yes | Default 0 |
subfolder | String? | No | For bedroom subfolders |
sharePointFileId | String? | No | Graph API item ID |
sharePointPath | String? | No | Path within drive |
sharePointUrl | String? | No | Direct web URL |
fileContent | Bytes? | No | Binary content (database storage) |
thumbnailContent | Bytes? | No | Compressed thumbnail (database storage) |
isCompressed | Boolean | Yes | Default false |
originalFileSize | Int? | No | Size before compression |
storageLocation | String | Yes | "database" | "local" | "sharepoint" |
Document
Section titled “Document”Many-to-one with Villa. Supports dual storage (database bytes or SharePoint).
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa |
documentType | DocumentType | Yes | See enum (14 types) |
fileName | String | Yes | — |
fileUrl | String | Yes | Primary access URL |
fileSize | Int | Yes | Bytes |
mimeType | String | Yes | — |
description | String? | No | — |
isActive | Boolean | Yes | Default true |
deletedAt | DateTime? | No | Soft delete timestamp |
sharePointFileId | String? | No | — |
sharePointPath | String? | No | — |
sharePointUrl | String? | No | — |
validFrom | DateTime? | No | Document validity start |
validUntil | DateTime? | No | Document validity end (indexed for expiry queries) |
fileContent | Bytes? | No | Binary content (database storage) |
storageLocation | String | Yes | "database" | "local" | "sharepoint" |
FacilityChecklist
Section titled “FacilityChecklist”Many-to-one with Villa. One row per facility item.
| Field | Type | Required | Description |
|---|---|---|---|
id | String (UUID) | Yes | Primary key |
villaId | String | Yes | FK → Villa |
category | FacilityCategory | Yes | See enum |
subcategory | String | Yes | Within-category grouping |
itemName | String | Yes | Specific item name |
isAvailable | Boolean | Yes | Default false |
quantity | Int? | No | Default 1 |
condition | String? | No | Default "good" |
notes | String? | No | — |
specifications | String? | No | Technical details |
photoUrl | String? | No | API endpoint or legacy path |
sharePointUrl | String? | No | Direct SharePoint URL |
thumbnailUrl | String? | No | — |
photoData | Bytes? | No | Binary thumbnail (database storage) |
photoMimeType | String? | No | — |
productLink | String? | No | Supplier/product URL |
lastCheckedAt | DateTime? | No | Default now() |
checkedBy | String? | No | Staff name who checked |
Unique constraint: (villaId, category, subcategory, itemName)
OnboardingProgress
Section titled “OnboardingProgress”One-to-one with Villa. Tracks which of the 10 steps are complete.
| Field | Type | Description |
|---|---|---|
id | String | Primary key |
villaId | String | FK → Villa (unique) |
currentStep | Int | Active step (1–10) |
totalSteps | Int | Always 10 |
villaInfoCompleted | Boolean | Step 1 |
ownerDetailsCompleted | Boolean | Step 2 |
contractualDetailsCompleted | Boolean | Step 3 |
bankDetailsCompleted | Boolean | Step 4 |
otaCredentialsCompleted | Boolean | Step 5 |
documentsUploaded | Boolean | Step 6 |
staffConfigCompleted | Boolean | Step 7 |
facilitiesCompleted | Boolean | Step 8 |
photosUploaded | Boolean | Step 9 |
reviewCompleted | Boolean | Step 10 |
status | OnboardingStatus | NOT_STARTED | IN_PROGRESS | COMPLETED |
submittedAt | DateTime? | When wizard was submitted |
OnboardingBackup
Section titled “OnboardingBackup”Crash-recovery data stored server-side. Created by the frontend’s OnboardingBackupService.
| Field | Type | Description |
|---|---|---|
id | String | Primary key |
userId | String | Clerk user ID |
sessionId | String | Browser session identifier |
villaId | String? | FK → Villa (nullable for pre-creation backups) |
currentStep | Int | Last active step |
stepData | Json | Full form state snapshot |
lastSaved | DateTime | — |
autoSaveEnabled | Boolean | Default true |
userAgent | String | Browser info |
version | String | App version at time of backup |
Unique: (userId, sessionId)
OnboardingStepProgress
Section titled “OnboardingStepProgress”Granular per-step tracking (optional, used for detailed analytics).
| Field | Type | Description |
|---|---|---|
villaId | String | FK → Villa |
stepNumber | Int | 1–10 |
stepName | String | Human-readable step name |
status | StepStatus | NOT_STARTED | IN_PROGRESS | COMPLETED | SKIPPED | BLOCKED | ERROR |
isValid | Boolean | Whether step passes validation |
validationErrors | Json? | Error messages |
dependsOnSteps | Int[] | Prerequisite step numbers |
estimatedDuration | Int? | Expected time in seconds |
actualDuration | Int? | Actual time in seconds |
version | Int | Optimistic locking version |
Unique: (villaId, stepNumber)
StepFieldProgress
Section titled “StepFieldProgress”Tracks individual field completion within a step.
| Field | Type | Description |
|---|---|---|
stepProgressId | String | FK → OnboardingStepProgress |
fieldName | String | Form field identifier |
fieldLabel | String? | Display name |
fieldType | String | Input type |
status | FieldStatus | NOT_STARTED | IN_PROGRESS | COMPLETED | SKIPPED | ERROR |
isSkipped | Boolean | — |
skipReason | String? | — |
value | Json? | Last known value |
isValid | Boolean | — |
isRequired | Boolean | — |
dependsOnFields | String[] | Prerequisite field names |
Unique: (stepProgressId, fieldName)
SkippedItem
Section titled “SkippedItem”Audit log of skipped steps/fields during onboarding.
| Field | Type | Description |
|---|---|---|
villaId | String | FK → Villa |
itemType | SkippedItemType | STEP | FIELD | SECTION |
stepNumber | Int? | — |
fieldName | String? | — |
sectionName | String? | — |
skipReason | String? | User-provided reason |
skipCategory | SkipCategory | NOT_APPLICABLE | DATA_UNAVAILABLE | LATER | OPTIONAL | PRIVACY_CONCERNS | OTHER |
skippedBy | String | Clerk user ID |
isActive | Boolean | false if item was later completed |
unskippedAt | DateTime? | — |
unskippedBy | String? | — |
OnboardingSession
Section titled “OnboardingSession”Session-level analytics tracking per villa.
| Field | Type | Description |
|---|---|---|
villaId | String | FK → Villa (unique) |
userId | String | Clerk user ID |
userEmail | String? | — |
currentStep | Int | — |
stepsCompleted | Int | Count |
stepsSkipped | Int | Count |
fieldsCompleted | Int | Count |
fieldsSkipped | Int | Count |
totalFields | Int | Count |
isCompleted | Boolean | — |
submittedForReview | Boolean | — |
totalTimeSpent | Int? | Seconds |
averageStepTime | Int? | Seconds |
PropertyType
Section titled “PropertyType”VILLA | APARTMENT | PENTHOUSE | TOWNHOUSE | CHALET | BUNGALOW | ESTATE | HOUSE
VillaStyle
Section titled “VillaStyle”MODERN | TRADITIONAL | MEDITERRANEAN | CONTEMPORARY | BALINESE | MINIMALIST | LUXURY | RUSTIC
VillaStatus
Section titled “VillaStatus”DRAFT | ACTIVE | INACTIVE | ARCHIVED
OwnerType
Section titled “OwnerType”INDIVIDUAL | COMPANY | TRUST | OTHER
CommunicationPreference
Section titled “CommunicationPreference”EMAIL | PHONE | WHATSAPP | SMS
ContractType
Section titled “ContractType”EXCLUSIVE | NON_EXCLUSIVE | SEASONAL | LONG_TERM
PaymentSchedule
Section titled “PaymentSchedule”WEEKLY | BIWEEKLY | MONTHLY | QUARTERLY | ANNUALLY
CancellationPolicy
Section titled “CancellationPolicy”FLEXIBLE | MODERATE | STRICT | SUPER_STRICT | NON_REFUNDABLE
OTAPlatform
Section titled “OTAPlatform”BOOKING_COM | AIRBNB | VRBO | EXPEDIA | AGODA | HOTELS_COM | TRIPADVISOR | MARRIOTT_HOMES_VILLAS | HOMEAWAY | FLIPKEY | DIRECT
SyncStatus
Section titled “SyncStatus”PENDING | IN_PROGRESS | SUCCESS | FAILED | PARTIAL
StaffPosition
Section titled “StaffPosition”VILLA_MANAGER | HOUSEKEEPER | GARDENER | POOL_MAINTENANCE | SECURITY | CHEF | DRIVER | CONCIERGE | MAINTENANCE | OTHER
StaffDepartment
Section titled “StaffDepartment”MANAGEMENT | HOUSEKEEPING | MAINTENANCE | SECURITY | HOSPITALITY | ADMINISTRATION
EmploymentType
Section titled “EmploymentType”FULL_TIME | PART_TIME | CONTRACT | SEASONAL | FREELANCE
SalaryFrequency
Section titled “SalaryFrequency”HOURLY | DAILY | WEEKLY | BIWEEKLY | MONTHLY | ANNUALLY
PhotoCategory (19 values)
Section titled “PhotoCategory (19 values)”EXTERIOR_VIEWS | INTERIOR_LIVING_SPACES | BEDROOMS | BATHROOMS | KITCHEN | DINING_AREAS | POOL_OUTDOOR_AREAS | GARDEN_LANDSCAPING | AMENITIES_FACILITIES | VIEWS_SURROUNDINGS | STAFF_AREAS | UTILITY_AREAS | LOGO | FLOOR_PLAN | VIDEOS | DRONE_SHOTS | ENTERTAINMENT | VIRTUAL_TOUR | OTHER
DocumentType (14 values)
Section titled “DocumentType (14 values)”PROPERTY_CONTRACT | INSURANCE_CERTIFICATE | PROPERTY_TITLE | TAX_DOCUMENTS | UTILITY_BILLS | MAINTENANCE_RECORDS | INVENTORY_LIST | HOUSE_RULES | EMERGENCY_CONTACTS | STAFF_CONTRACTS | LICENSES_PERMITS | FLOOR_PLANS | MAINTENANCE_CONTRACTS | OTHER
FacilityCategory
Section titled “FacilityCategory”New (frontend-matching, kebab-case): property_layout_spaces | occupancy_sleeping | bathrooms | kitchen_dining | service_staff | living_spaces | outdoor_facilities | home_office | entertainment_gaming | technology | wellness_spa | accessibility | safety_security | child_friendly
Legacy (kept for backward compatibility): KITCHEN_EQUIPMENT | BATHROOM_AMENITIES | BEDROOM_AMENITIES | LIVING_ROOM | OUTDOOR_FACILITIES | POOL_AREA | ENTERTAINMENT | SAFETY_SECURITY | UTILITIES | ACCESSIBILITY | BUSINESS_FACILITIES | CHILDREN_FACILITIES | PET_FACILITIES | OTHER
OnboardingStatus
Section titled “OnboardingStatus”NOT_STARTED | IN_PROGRESS | COMPLETED
StepStatus
Section titled “StepStatus”NOT_STARTED | IN_PROGRESS | COMPLETED | SKIPPED | BLOCKED | ERROR
FieldStatus
Section titled “FieldStatus”NOT_STARTED | IN_PROGRESS | COMPLETED | SKIPPED | ERROR
SkippedItemType
Section titled “SkippedItemType”STEP | FIELD | SECTION
SkipCategory
Section titled “SkipCategory”NOT_APPLICABLE | DATA_UNAVAILABLE | LATER | OPTIONAL | PRIVACY_CONCERNS | OTHER
Migrations
Section titled “Migrations”| Migration | Description |
|---|---|
20240916000000_add_step_progress_version | Adds version column (int, default 0) to OnboardingStepProgress for optimistic locking |
Note: Only one migration file is present in the repository. The initial schema was likely created with
prisma migrate devbefore the migration history was tracked, or earlier migrations are not committed.