// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init generator client { provider = "prisma-client-js" output = "../generated/prisma" } generator zod { provider = "prisma-zod-generator" output = "../shared/" // Zod schemas will be generated here inside `db/shared` } datasource db { provider = "postgresql" url = env("DATABASE_URL") } model User { id Int @id @default(autoincrement()) username String @unique password String patients Patient[] appointments Appointment[] claims Claim[] insuranceCredentials InsuranceCredential[] } model Patient { id Int @id @default(autoincrement()) firstName String lastName String dateOfBirth DateTime @db.Date gender String phone String email String? address String? city String? zipCode String? insuranceProvider String? insuranceId String? groupNumber String? policyHolder String? allergies String? medicalConditions String? status String @default("active") userId Int createdAt DateTime @default(now()) user User @relation(fields: [userId], references: [id]) appointments Appointment[] claims Claim[] pdfs ClaimPdf[] } model Appointment { id Int @id @default(autoincrement()) patientId Int userId Int staffId Int title String date DateTime @db.Date startTime String // Store time as "hh:mm" endTime String // Store time as "hh:mm" type String // e.g., "checkup", "cleaning", "filling", etc. notes String? status String @default("scheduled") // "scheduled", "completed", "cancelled", "no-show" createdAt DateTime @default(now()) patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id]) staff Staff? @relation(fields: [staffId], references: [id]) claims Claim[] } model Staff { id Int @id @default(autoincrement()) name String email String? role String // e.g., "Dentist", "Hygienist", "Assistant" phone String? createdAt DateTime @default(now()) appointments Appointment[] claims Claim[] @relation("ClaimStaff") } model Claim { id Int @id @default(autoincrement()) patientId Int appointmentId Int userId Int staffId Int patientName String memberId String dateOfBirth DateTime @db.Date remarks String serviceDate DateTime insuranceProvider String // e.g., "Delta MA" createdAt DateTime @default(now()) updatedAt DateTime @updatedAt status String @default("pending") // "pending", "approved", "cancelled", "review" patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade) appointment Appointment @relation(fields: [appointmentId], references: [id], onDelete: Cascade) user User? @relation(fields: [userId], references: [id]) staff Staff? @relation("ClaimStaff", fields: [staffId], references: [id]) serviceLines ServiceLine[] pdf ClaimPdf[] } model ServiceLine { id Int @id @default(autoincrement()) claimId Int procedureCode String procedureDate DateTime @db.Date oralCavityArea String? toothNumber String? toothSurface String? billedAmount Float claim Claim @relation(fields: [claimId], references: [id], onDelete: Cascade) } model InsuranceCredential { id Int @id @default(autoincrement()) userId Int siteKey String username String password String user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([userId, siteKey]) @@index([userId]) } model ClaimPdf { id Int @id @default(autoincrement()) patientId Int claimId Int? filename String pdfData Bytes uploadedAt DateTime @default(now()) patient Patient @relation(fields: [patientId], references: [id], onDelete: Cascade) claim Claim? @relation(fields: [claimId], references: [id], onDelete: Cascade) @@index([patientId]) @@index([claimId]) }