Dental Care

This commit is contained in:
Iliyan Angelov
2025-11-16 14:29:51 +02:00
commit 39077550ef
194 changed files with 43197 additions and 0 deletions

228
prisma/schema.prisma Normal file
View File

@@ -0,0 +1,228 @@
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
enum role {
patient
dentist
admin
}
enum AppointmentStatus {
pending
confirmed
cancelled
completed
rescheduled
}
enum PaymentStatus {
pending
paid
failed
refunded
}
enum PaymentMethod {
card
e_wallet
bank_transfer
cash
}
model User {
id String @id @map("_id")
name String
email String
emailVerified Boolean @default(false)
image String?
role role @default(patient)
phone String?
address String?
dateOfBirth DateTime?
medicalHistory String?
stripeCustomerId String? // Stripe customer ID
// Dentist-specific fields
specialization String?
qualifications String?
experience Int? // Years of experience
workingHours Json? // {monday: {start: "9:00", end: "17:00"}, ...}
isAvailable Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
sessions Session[]
accounts Account[]
// Relations
appointmentsAsPatient Appointment[] @relation("PatientAppointments")
appointmentsAsDentist Appointment[] @relation("DentistAppointments")
payments Payment[]
notifications Notification[]
chatMessages ChatMessage[]
@@unique([email])
@@map("user")
}
model Service {
id String @id @map("_id") // Use custom ID from seed data
name String
description String?
duration Int // in minutes
price String // Price range or single price (e.g., "₱500 ₱1,500" or "₱1,500")
category String
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
appointments Appointment[]
@@map("service")
}
model Appointment {
id String @id @default(auto()) @map("_id") @db.ObjectId
patientId String
dentistId String
serviceId String // Changed to String to match Service.id
date DateTime
timeSlot String // e.g., "09:00-10:00"
status AppointmentStatus @default(pending)
notes String?
cancelReason String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
patient User @relation("PatientAppointments", fields: [patientId], references: [id], onDelete: Cascade)
dentist User @relation("DentistAppointments", fields: [dentistId], references: [id], onDelete: Cascade)
service Service @relation(fields: [serviceId], references: [id], onDelete: Cascade)
payment Payment?
@@map("appointment")
}
model Payment {
id String @id @default(auto()) @map("_id") @db.ObjectId
appointmentId String @unique @db.ObjectId
userId String
amount Float
method PaymentMethod
status PaymentStatus @default(pending)
transactionId String?
paidAt DateTime?
stripeCustomerId String?
stripeServicesId String?
stripePaymentIntentId String?
stripePriceId String?
stripeSubscriptionId String?
stripeInvoiceId String?
stripeRefundId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// Relations
appointment Appointment @relation(fields: [appointmentId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("payment")
}
model Notification {
id String @id @default(auto()) @map("_id") @db.ObjectId
userId String
title String
message String
type String // email, sms, push
isRead Boolean @default(false)
sentAt DateTime @default(now())
createdAt DateTime @default(now())
// Relations
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("notification")
}
model ChatMessage {
id String @id @default(auto()) @map("_id") @db.ObjectId
userId String
message String
isFromUser Boolean @default(true)
createdAt DateTime @default(now())
// Relations
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@map("chat_message")
}
model Session {
id String @id @map("_id")
expiresAt DateTime
token String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
ipAddress String?
userAgent String?
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
activeOrganizationId String?
impersonatedBy String?
@@unique([token])
@@map("session")
}
model Account {
id String @id @map("_id")
accountId String
providerId String
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
accessToken String?
refreshToken String?
idToken String?
accessTokenExpiresAt DateTime?
refreshTokenExpiresAt DateTime?
scope String?
password String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("account")
}
model Verification {
id String @id @map("_id")
identifier String
value String
expiresAt DateTime
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("verification")
}
model Subscription {
id String @id @default(auto()) @map("_id") @db.ObjectId
plan String
referenceId String @unique
stripeCustomerId String?
stripeSubscriptionId String?
status String @default("incomplete")
periodStart DateTime?
periodEnd DateTime?
cancelAtPeriodEnd Boolean @default(false)
seats Int?
trialStart DateTime?
trialEnd DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("subscription")
}