Database Schema

Last updated: 10/20/2018

Database Schema

Last Updated: January 2026 Status Legend: βœ… IMPLEMENTED | 🚧 PARTIAL | πŸ“‹ PLANNED

Overview

The CareHub database manages:

  • User accounts and roles βœ…
  • Member intake information βœ…
  • Cases and treatment tracking βœ…
  • Sessions and video appointments βœ…
  • Calendar and scheduling βœ…
  • Documents and compliance data βœ…
  • Billing and claims βœ…
  • Workflows and automation βœ…
  • Member engagement (activities, check-ins, feed) βœ…

ORM: Prisma with PostgreSQL


Entity Relationship Diagram

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    Users     β”‚       β”‚    Cases     β”‚       β”‚   Sessions   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id           │───┐   β”‚ id           │───┐   β”‚ id           β”‚
β”‚ email        β”‚   β”‚   β”‚ case_number  β”‚   β”‚   β”‚ case_id      │──┐
β”‚ firstName    β”‚   β”œβ”€β”€β–Άβ”‚ member_id    β”‚   β”œβ”€β”€β–Άβ”‚ provider_id  β”‚  β”‚
β”‚ lastName     β”‚   β”‚   β”‚ psych_id     β”‚β—€β”€β”€β”˜   β”‚ scheduledDateβ”‚  β”‚
β”‚ role         β”‚   β”‚   β”‚ lpcc_id      β”‚       β”‚ twilioRoom*  β”‚  β”‚  NEW: Video
β”‚ entraId      β”‚   β”‚   β”‚ coordinator_idβ”‚      β”‚ status       β”‚  β”‚
β”‚ clerkId      β”‚   β”‚   β”‚ intake_form_idβ”‚      β”‚ transcriptUrlβ”‚  β”‚  NEW: Transcription
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚   β”‚ status       β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
        β”‚          β”‚   β”‚ currentPhase β”‚                         β”‚
        β–Ό          β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                         β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚           β”‚                                β”‚
β”‚ProviderSettingsβ”‚  β”‚           β”‚                                β”‚
β”‚ Availability β”‚   β”‚           β–Ό                                β”‚
β”‚ TimeBlock    β”‚   β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚   β”‚  CarePlans   β”‚       β”‚  Documents   β”‚  β”‚
                   β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
NEW: Calendar      β”‚                                            β”‚
                   β”‚                                            β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  IntakeForm  β”‚β—€β”€β”€β”˜   β”‚  CheckIns    β”‚       β”‚   Activity   β”‚  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚ 80+ fields   β”‚       β”‚ anxietyLevel β”‚ NEW   β”‚ ipAddress    β”‚  β”‚
β”‚ phq9/gad7    β”‚       β”‚ moodLevel    β”‚       β”‚ userAgent    β”‚  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                                                β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚ RFARequest   β”‚ NEW   β”‚ Discharge    β”‚ NEW   β”‚MemberActivityβ”‚ NEW
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”‚ Summary      β”‚       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚ status       β”‚       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”‚ activityType β”‚  β”‚
β”‚ psychReview  β”‚       β”‚ goalAchieve  β”‚       β”‚ memberResponseβ”‚ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                                                β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚ BillingEntry β”‚ NEW   β”‚ClaimSubmissionβ”‚ NEW  β”‚ CaseFeedItem β”‚ NEW
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚ serviceCode  β”‚       β”‚ formData     β”‚       β”‚ type         β”‚  β”‚
β”‚ chargeAmount β”‚       β”‚ totalCharges β”‚       β”‚ visibility   β”‚  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
                                                                β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Workflow Engine (Inngest)                  β”‚ NEW
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Workflow β†’ WorkflowStep β†’ WorkflowConfig β†’ WorkflowRun       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Enums βœ…

Core Enums

Enum Values Description
Role ADMIN, INTAKE_COORDINATOR, PSYCHOLOGIST, LPCC, MEMBER User roles
CaseStatus PENDING_ASSIGNMENT, INTAKE, EVALUATION, ACTIVE_TREATMENT, DISCHARGED Case lifecycle
CasePhase PRE_INTAKE, INTAKE, EVALUATION, TREATMENT, DISCHARGE Workflow phases
CaseType PHYSICAL_MENTAL, MENTAL_MENTAL, MENTAL_PHYSICAL CA WC claim types
RiskLevel NOT_ASSESSED, LOW, MODERATE, HIGH Clinical risk

Session Enums

Enum Values Description
SessionType EVALUATION, INDIVIDUAL, GROUP, PHONE, TELEHEALTH Session modality
SessionStatus SCHEDULED, COMPLETED, NO_SHOW, CANCELLED Session state

Clinical Enums

Enum Values Description
MMIStatus NOT_YET, APPROACHING, AT_MMI Maximum Medical Improvement
RTWStatus RETURNED_FULL, RETURNED_MODIFIED, UNABLE, PENDING Return to Work
WorkRestrictions NONE, TEMPORARY, PERMANENT, UNABLE Work limitations
IndustrialDetermination INDUSTRIAL, NON_INDUSTRIAL, PENDING Causation result
DischargeReason COMPLETED, NON_COMPLIANT, TRANSFERRED, MEMBER_REQUEST Exit reason

Calendar Enums βœ… NEW

Enum Values Description
DayOfWeek SUNDAY-SATURDAY Weekly scheduling
TimeBlockType LUNCH, ADMIN, BREAK, PERSONAL, VACATION, SICK, MEETING, OTHER Non-session blocks

Workflow Enums βœ… NEW

Enum Values Description
WorkflowStatus ACTIVE, PAUSED, DISABLED Workflow state
WorkflowRunStatus PENDING, RUNNING, COMPLETED, FAILED, CANCELLED Execution state
WorkflowConfigType STRING, NUMBER, BOOLEAN, JSON, PROMPT Config value types

Billing Enums βœ… NEW

Enum Values Description
BillingStatus PENDING, READY_TO_BILL, SUBMITTED, ACCEPTED, REJECTED, PAID, etc. Claim lifecycle
ServiceCode CPT codes (90791, 90834, 90837, etc.) Billable services
PlaceOfService OFFICE, TELEHEALTH_HOME, TELEHEALTH_OTHER CMS 1500 codes

RFA Enums βœ… NEW

Enum Values Description
RFAStatus DRAFT, PENDING_PSYCH_REVIEW, PSYCH_APPROVED, PSYCH_DENIED, SUBMITTED, UR_APPROVED, UR_DENIED, UR_MODIFIED Authorization workflow

Member Activity Enums βœ… NEW

Enum Values Description
MemberActivityStatus ASSIGNED, IN_PROGRESS, COMPLETED, SKIPPED, EXPIRED Activity state
MemberActivityType THOUGHT_JOURNAL, BEHAVIORAL_ACTIVATION, RELAXATION, EXPOSURE_TASK, PSYCHOEDUCATION, WORKSHEET, SELF_ASSESSMENT, CUSTOM Therapeutic activities

Feed Enums βœ… NEW

Enum Values Description
FeedItemType MESSAGE_*, EVENT_*, AGENT_* (25+ types) Activity feed categories
FeedAuthorType HUMAN, AGENT, SYSTEM Who created the item
FeedVisibility INTERNAL, MEMBER_VISIBLE Access control

Tables

Users βœ…

Stores all system users (staff and members).

Field Type Required Description Status
id UUID Yes Primary key βœ…
email String Yes Unique email βœ…
firstName String Yes βœ…
lastName String Yes βœ…
role Enum Yes Admin, IntakeCoordinator, Psychologist, LPCC, Member βœ…
phone String No E.164 format βœ…
isActive Boolean Yes Default true βœ…
portalAccess Boolean Yes For members, controls login βœ…
accessToken String No For member portal auth βœ…
entraId String No Microsoft Entra ID (staff SSO) βœ… NEW
clerkId String No Clerk ID (member auth) βœ… NEW
intakeToken String No Magic link token for intake βœ… NEW
intakeTokenExpiresAt DateTime No Token expiration βœ… NEW
createdAt DateTime Yes Auto βœ…
updatedAt DateTime Yes Auto βœ…

Relations:

  • casesAsMember, casesAsCoordinator, casesAsPsychologist, casesAsLpcc
  • providerSettings, providerAvailability, timeBlocks (NEW - Calendar)
  • rfaRequestsSubmitted, rfaRequestsReviewed (NEW - RFA)
  • dischargesPrepared, dischargesAttested (NEW - Discharge)
  • memberActivitiesAssigned, memberActivitiesCreated (NEW - Activities)
  • feedItemsAuthored (NEW - Feed)

IntakeForm βœ…

Stores member intake responses. 80+ fields organized by section.

Prefix Section Example Fields Status
PI_ Personal Information PI_FirstName, PI_LastName, PI_DOB βœ…
CI_ Contact Information CI_Phone, CI_Email, CI_Address βœ…
EC_ Emergency Contact EC_Name, EC_Phone, EC_Relationship βœ…
EMP_ Employment History EMP_Employer, EMP_StartDate βœ…
CC_ Current Concerns CC_PrimaryConcern, CC_OnsetDate βœ…
MH_ Medical History MH_Conditions, MH_Surgeries βœ…
MHH_ Mental Health History MHH_PreviousTreatment βœ…
FH_ Family History FH_FamilyConditions βœ…
SU_ Substance Use SU_AlcoholUse, SU_DrugUse βœ…
SA_ Safety Assessment SA_SuicidalIdeation βœ…
TG_ Treatment Goals TG_PrimaryGoal, TG_RTWGoal βœ…
NIS_ Non-Industrial Stressors NIS_FinancialStress βœ…
PA_ Personnel Actions PA_Discipline, PA_Termination βœ…
CON_ Consent CON_TreatmentConsent βœ…
FA_ Functional Assessment FA_Mobility, FA_WorkAbility πŸ“‹
MED_ Medications MED_CurrentMeds (repeater) πŸ“‹
RH_ Relationship History RH_CurrentStatus πŸ“‹
TH_ Trauma History TH_TraumaEvents πŸ“‹
DU_ Document Upload DU_MedicalRecords πŸ“‹

Screening Scores:

Field Type Description Status
phq9_q1-q9 Number (0-3) PHQ-9 individual questions βœ…
phq9_score Computed Sum of PHQ-9 (0-27) βœ…
gad7_q1-q7 Number (0-3) GAD-7 individual questions βœ…
gad7_score Computed Sum of GAD-7 (0-21) βœ…

Cases βœ…

Core case management table.

Field Type Required Description Status
id UUID Yes Primary key βœ…
caseNumber String Yes Auto-generated (CH-2025-00001) βœ…
memberId FKβ†’Users Yes The injured worker βœ…
intakeFormId FKβ†’IntakeForm No Linked intake βœ…
coordinatorId FKβ†’Users No Assigned coordinator βœ…
psychologistId FKβ†’Users No Assigned psychologist βœ…
lpccId FKβ†’Users No Assigned LPCC βœ…
caseType Enum No physical-mental, mental-mental, mental-physical βœ…
status Enum Yes Case lifecycle status βœ…
currentPhase Enum Yes Workflow phase βœ…
riskLevel Enum No Clinical risk level βœ…
riskIndicators Array No List of risk factors βœ…
sessionsAuthorized Number Yes Default 7 βœ…
sessionsUsed Number Yes Default 0 βœ…

Causation Fields: βœ…

Field Type Description
causePreExistingPct Number 0-100
causePreExistingNarrative Text
causeNonIndustrialPct Number 0-100
causeNonIndustrialNarrative Text
causePersonnelActionPct Number 0-100
causePersonnelActionNarrative Text
causeWorkExposurePct Number 0-100
causeWorkExposureNarrative Text
causeIndustrialDetermination Enum Industrial, Non-Industrial, Pending
causeClinicalRationale Text
causeCompletedById FK→Users
causeCompletedAt DateTime

GAF Fields: βœ…

Field Type Description
gafPreInjury Number 1-100
gafInitial Number 1-100
gafCurrent Number 1-100
gafFinal Number 1-100
gafRationale Text

MMI Fields: βœ…

Field Type Description
mmiStatus Enum Not Yet, Approaching, At MMI
mmiEstimatedDate Date
mmiDate Date
mmiPermanentImpairment Boolean
mmiWpi Number 0-100
mmiWorkRestrictions Enum None, Temporary, Permanent, Unable
mmiRestrictionDetails Text
mmiRtwStatus Enum Return to work status
mmiFutureMedicalNeeded Boolean

Relations:

  • sessions, carePlans, checkIns, documents, authorizations, activities
  • billingEntries (NEW)
  • rfaRequests (NEW)
  • dischargeSummary (NEW)
  • memberActivities (NEW)
  • feedItems (NEW)

Sessions βœ…

Tracks all therapy sessions with video and transcription support.

Field Type Required Description Status
id UUID Yes Primary key βœ…
caseId FKβ†’Cases Yes βœ…
providerId FKβ†’Users Yes Psychologist or LPCC βœ…
sessionNumber Number Yes Sequential per case βœ…
sessionType Enum Yes Evaluation, Individual, etc. βœ…
scheduledDate DateTime Yes βœ…
scheduledTime String Yes HH:MM format βœ…
timezone String Yes IANA timezone (default LA) βœ… NEW
duration Number Yes Minutes (default 50) βœ…
status Enum Yes Scheduled, Completed, etc. βœ…

Session Notes: βœ…

Field Type Description
memberPresent Boolean
startTime Time Actual start
endTime Time Actual end
painRating Number 1-10
moodRating Number 1-10
sessionNotes Text
interventionsUsed Array
homeworkAssigned Text
riskLevel Enum
nextSessionPlan Text

Twilio Video Fields: βœ… NEW

Field Type Description
twilioRoomSid String Twilio room ID
twilioRoomName String Unique room name
twilioRoomStatus String scheduled, in-progress, completed
videoStartedAt DateTime
videoEndedAt DateTime
videoActualDuration Int Actual minutes
memberJoinToken String Secure member join link
providerJoinToken String Secure provider join link

Transcription Fields: βœ… NEW

Field Type Description
transcript Text Full transcript
transcriptUrl String Blob storage path
transcriptStatus String pending, processing, completed, failed

Reminder Tracking: βœ… NEW

Field Type Description
reminder24hSent Boolean
reminderSessionSent Boolean

Recording Consent (HIPAA): βœ… NEW

Field Type Description
recordingConsentAt DateTime
recordingConsentIp String
recordingConsentUserAgent String

AI Fields: βœ…

Field Type Description
aiSummary Text
aiThemes Array
aiGoalProgress JSON
aiRecommendations Text

CarePlans βœ…

Treatment plans for each case.

Field Type Required Description Status
id UUID Yes Primary key βœ…
caseId FKβ†’Cases Yes βœ…
createdById FKβ†’Users Yes βœ…
version Number Yes Start at 1 βœ…
status Enum Yes Draft, Active, Completed, Superseded βœ…
diagnosisCodes Array No ICD-10 codes βœ…
presentingIssues Text Yes βœ…
treatmentGoals JSON Yes Array of goal objects βœ…
interventions Text Yes βœ…
frequency Enum Yes Weekly, Bi-weekly, Monthly, As Needed βœ…
estimatedSessions Number Yes βœ…
expectedOutcomes Text Yes βœ…
rtwGoal String Yes βœ…
rtwTimeline String No βœ…
dischargeCriteria Text No βœ…
barriersIdentified Text No βœ…
aiGenerated Boolean Yes Default false βœ…
aiRecommendations Text No βœ…

CheckIns βœ…

Member self-reported wellness data.

Field Type Required Description Status
id UUID Yes Primary key βœ…
memberId FKβ†’Users Yes βœ…
caseId FKβ†’Cases Yes βœ…
checkinDate Date Yes βœ…
painLevel Number Yes 1-10 βœ…
moodLevel Number Yes 1-10 βœ…
sleepQuality Number Yes 1-10 βœ…
anxietyLevel Number Yes 1-10 (North Star V2) βœ… NEW
activityLevel Enum Yes Very Low - Very High βœ…
notes Text No βœ…

Documents βœ…

Generated and uploaded documents.

Field Type Required Description Status
id UUID Yes Primary key βœ…
caseId FKβ†’Cases No βœ…
sessionId FKβ†’Sessions No βœ…
documentType Enum No PR-2, DFR, RFA, etc. βœ…
documentTitle String No βœ…
generatedDate DateTime No βœ…
contentJson JSON No Structured content βœ…
status Enum Yes Draft, Final, Sent, Acknowledged βœ…
sentTo String No βœ…
sentDate DateTime No βœ…
fileName String No Upload filename βœ… NEW
fileType String No MIME type βœ… NEW
blobPath String No Azure Blob path βœ… NEW
containerName String No Blob container βœ… NEW
size Int No File size in bytes βœ… NEW
description String No User description βœ… NEW
uploadedAt DateTime No βœ… NEW

Authorizations βœ…

Session authorization tracking.

Field Type Required Description Status
id UUID Yes Primary key βœ…
caseId FKβ†’Cases Yes βœ…
authorizationType Enum Yes Initial, Extension βœ…
sessionsRequested Number Yes βœ…
sessionsApproved Number No βœ…
requestDate DateTime Yes βœ…
responseDate DateTime No βœ…
status Enum Yes Pending, Approved, Denied, Partially Approved βœ…
rfaDocumentId FKβ†’Documents No βœ…
decisionNotes Text No βœ…
requestedById FKβ†’Users Yes βœ…

Activity (Audit Log) βœ…

Audit log for case activities (HIPAA compliance).

Field Type Required Description Status
id UUID Yes Primary key βœ…
caseId FKβ†’Cases No βœ…
userId FKβ†’Users Yes βœ…
action String Yes e.g., "case.created" βœ…
details Text No βœ…
metadata JSON No βœ…
ipAddress String No Client IP βœ… NEW
userAgent String No Browser info βœ… NEW
createdAt DateTime Yes βœ…

NEW Models βœ…

ProviderSettings βœ… NEW

Provider-specific calendar configuration.

Field Type Required Description
id UUID Yes Primary key
userId FK→Users Yes One-to-one with User
timezone String Yes IANA timezone (default America/Los_Angeles)
defaultBufferMinutes Int Yes Buffer between sessions (default 10)
defaultSessionDuration Int Yes Default session length (default 50)
minimumBookingNotice Int Yes Hours advance notice required (default 24)

ProviderAvailability βœ… NEW

Weekly availability schedule for providers.

Field Type Required Description
id UUID Yes Primary key
userId FK→Users Yes Provider
dayOfWeek Enum Yes SUNDAY-SATURDAY
startTime String Yes "09:00" (24hr format)
endTime String Yes "17:00"
isEnabled Boolean Yes Whether day is available

Constraints: Unique(userId, dayOfWeek)


TimeBlock βœ… NEW

Non-session time blocks (lunch, vacation, etc.).

Field Type Required Description
id UUID Yes Primary key
userId FK→Users Yes Provider
title String Yes Display name
blockType Enum Yes LUNCH, ADMIN, VACATION, etc.
dayOfWeek Enum No For recurring blocks
startTime String No "12:00" for recurring
endTime String No "13:00" for recurring
startDate DateTime No For one-time blocks
endDate DateTime No For one-time blocks
isAllDay Boolean Yes Default false
isRecurring Boolean Yes Default false
notes String No

Workflow βœ… NEW

Workflow definition (Inngest-based).

Field Type Required Description
id UUID Yes Primary key
slug String Yes Unique identifier (e.g., "intake-complete")
name String Yes Human-readable name
description String No
triggerEvent String Yes Inngest event (e.g., "carehub/intake.completed")
status Enum Yes ACTIVE, PAUSED, DISABLED
category String No e.g., "intake", "session"
version Int Yes Default 1

Relations: steps, configs, runs


WorkflowStep βœ… NEW

Steps within a workflow.

Field Type Required Description
id UUID Yes Primary key
workflowId FK→Workflow Yes Parent workflow
stepOrder Int Yes Execution order
stepId String Yes Code identifier (e.g., "analyze-intake")
name String Yes Human-readable name
isEnabled Boolean Yes Can disable individual steps
retryCount Int Yes Default 3
timeoutMs Int Yes Default 30000

WorkflowConfig βœ… NEW

Configurable workflow parameters including LLM prompts.

Field Type Required Description
id UUID Yes Primary key
workflowId FK→Workflow Yes Parent workflow
key String Yes Config key (e.g., "intake_analysis_prompt")
name String Yes Human-readable name
configType Enum Yes STRING, NUMBER, BOOLEAN, JSON, PROMPT
value String Yes Current value
defaultValue String Yes Default value
isPrompt Boolean Yes Whether this is an LLM prompt
promptVariables Array No Template variables
version Int Yes Prompt versioning

WorkflowRun βœ… NEW

Workflow execution history.

Field Type Required Description
id UUID Yes Primary key
workflowId FK→Workflow Yes Which workflow
inngestRunId String No Inngest correlation ID
inngestEventId String No Triggering event
caseId String No Related case
memberId String No Related member
status Enum Yes PENDING, RUNNING, COMPLETED, FAILED, CANCELLED
startedAt DateTime No
completedAt DateTime No
durationMs Int No
currentStep String No
stepsCompleted Array No Step IDs completed
stepResults JSON No Results per step
errorMessage String No
errorStep String No

PayerConfig βœ… NEW

Workers' Compensation payer configuration.

Field Type Required Description
id UUID Yes Primary key
name String Yes e.g., "State Compensation Insurance Fund"
payerId String Yes Unique payer ID
address, city, state, zip String No Contact info
submissionMethod String Yes electronic, paper, portal
portalUrl String No
defaultRates JSON No CPT code rates
requiresAuth Boolean Yes Default true
isActive Boolean Yes

BillingEntry βœ… NEW

Individual billable service entries.

Field Type Required Description
id UUID Yes Primary key
caseId FK→Cases Yes
sessionId FK→Sessions No
payerId FK→PayerConfig Yes
serviceDate DateTime Yes
serviceCode Enum Yes CPT code
placeOfService Enum Yes CMS 1500 code
diagnosisCodes Array No ICD-10 codes
providerId String Yes
providerNpi String No
chargeAmount Decimal Yes
allowedAmount Decimal No
paidAmount Decimal No
status Enum Yes PENDING through WRITTEN_OFF
denialReason String No

ClaimSubmission βœ… NEW

CMS 1500 claim submissions.

Field Type Required Description
id UUID Yes Primary key
payerId FK→PayerConfig Yes
claimNumber String Yes Internal claim #
externalClaimNumber String No Payer's claim #
submissionDate DateTime Yes
formData JSON Yes CMS 1500 form data
status Enum Yes
totalCharges Decimal Yes
totalPaid Decimal No
documentPath String No Generated PDF path

RFARequest βœ… NEW

Request for Authorization workflow.

Field Type Required Description
id UUID Yes Primary key
caseId FK→Cases Yes
requestNumber String Yes RFA-YYYY-XXXX
requestType Enum Yes INITIAL, EXTENSION
currentSessionsUsed Int Yes
currentSessionsAuthorized Int Yes
additionalSessionsRequested Int Yes
clinicalRationale String Yes
treatmentGoals String Yes
progressToDate String Yes
phq9Current Int No
gad7Current Int No
barriersToClosure String No
LPCC Fields
requestedById FK→Users Yes
requestedAt DateTime Yes
Psychologist Review
reviewedById FK→Users No
reviewedAt DateTime No
psychReviewNotes String No
sessionsApprovedByPsych Int No
UR Response
urSubmittedAt DateTime No
urResponseAt DateTime No
urApprovedSessions Int No
urDenialReason String No
status Enum Yes DRAFT through UR_MODIFIED

DischargeSummary βœ… NEW

Case discharge documentation.

Field Type Required Description
id UUID Yes Primary key
caseId FK→Cases Yes One-to-one
dischargeDate DateTime Yes
dischargeReason Enum Yes
totalSessionsCompleted Int Yes
treatmentDurationWeeks Int Yes
presentingProblems String Yes
treatmentProvided String Yes
outcomesSummary String Yes
goalAchievement JSON Yes { "goalId": "achieved|partial|not" }
phq9Initial/Final Int No Score comparison
gad7Initial/Final Int No Score comparison
gafInitial/Final Int No Score comparison
rtwStatus Enum Yes
rtwDetails String No
aftercareRecommendations String No
referrals String No
Attestation
preparedById FK→Users Yes LPCC who prepared
attestedById FK→Users No Psychologist attestation
attestedAt DateTime No
attestationText String No

MemberActivity βœ… NEW

Therapeutic activities/homework for members.

Field Type Required Description
id UUID Yes Primary key
caseId FK→Cases Yes
memberId FK→Users Yes
assignedById FK→Users Yes Provider who assigned
activityType Enum Yes THOUGHT_JOURNAL, RELAXATION, etc.
title String Yes
description String Yes
instructions String No
resourceUrl String No Link to resource
resourceType String No pdf, video, link
dueDate DateTime No
status Enum Yes ASSIGNED through EXPIRED
startedAt DateTime No
completedAt DateTime No
memberResponse String No Text response/reflection
memberRating Int No 1-5 helpfulness
memberNotes String No
reviewedAt DateTime No
providerFeedback String No

CaseFeedItem βœ… NEW

Case activity feed (CareHub Chatter).

Field Type Required Description
id UUID Yes Primary key
caseId FK→Cases Yes
type Enum Yes MESSAGE_*, EVENT_*, AGENT_*
authorType Enum Yes HUMAN, AGENT, SYSTEM
authorId FK→Users No Null for system events
title String No
content String Yes
metadata JSON No Type-specific data
visibility Enum Yes INTERNAL, MEMBER_VISIBLE
isRead Boolean Yes Default false
readByIds Array No User IDs who have read
isPinned Boolean Yes Default false

Indexes

Performance Indexes

-- Users
CREATE UNIQUE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_role ON users(role);
CREATE INDEX idx_users_is_active ON users(is_active);
CREATE UNIQUE INDEX idx_users_entra_id ON users(entra_id);
CREATE UNIQUE INDEX idx_users_clerk_id ON users(clerk_id);

-- Cases
CREATE INDEX idx_cases_member ON cases(member_id);
CREATE INDEX idx_cases_status ON cases(status);
CREATE INDEX idx_cases_phase ON cases(current_phase);
CREATE INDEX idx_cases_psych ON cases(psychologist_id);
CREATE INDEX idx_cases_lpcc ON cases(lpcc_id);

-- Sessions
CREATE INDEX idx_sessions_case ON sessions(case_id);
CREATE INDEX idx_sessions_provider ON sessions(provider_id);
CREATE INDEX idx_sessions_date ON sessions(scheduled_date);
CREATE INDEX idx_sessions_status ON sessions(status);
CREATE INDEX idx_sessions_twilio ON sessions(twilio_room_name);  -- NEW

-- Calendar (NEW)
CREATE INDEX idx_availability_user ON provider_availability(user_id);
CREATE INDEX idx_timeblocks_user ON time_blocks(user_id);
CREATE INDEX idx_timeblocks_date ON time_blocks(start_date);

-- Billing (NEW)
CREATE INDEX idx_billing_case ON billing_entries(case_id);
CREATE INDEX idx_billing_status ON billing_entries(status);
CREATE INDEX idx_billing_date ON billing_entries(service_date);

-- Feed (NEW)
CREATE INDEX idx_feed_case ON case_feed_items(case_id);
CREATE INDEX idx_feed_type ON case_feed_items(type);
CREATE INDEX idx_feed_created ON case_feed_items(created_at);

Migrations

Using Prisma ORM for migrations.

# Development
npx prisma migrate dev --name description

# Production
npx prisma migrate deploy

# View current schema
npx prisma studio

Data Retention

Data Type Retention Reason
Activity/Audit Logs 6 years HIPAA requirement
Case Records 7 years after discharge CA WC requirement
Video Recordings 90 days Storage optimization
Transcripts Duration of case + 1 year Clinical reference