templates2.Booking.Nuxt/prisma/schema.prisma
w4c-templates 3491e2d39c
Some checks failed
CI / quality (push) Has been cancelled
chore(template): publish Booking.Nuxt
2026-10-11 23:27:22 +03:00

131 lines
3.9 KiB
Plaintext

// Templates2 Booking — core data model + booking domain.
// SQLite in development (file:./dev.db); switch the datasource url to Postgres in production.
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
passwordHash String
name String?
role String @default("user") // user | admin
createdAt DateTime @default(now())
sessions Session[]
subscription Subscription?
auditLogs AuditLog[]
bookings Booking[]
}
model Session {
id String @id @default(cuid())
token String @unique
userId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
expiresAt DateTime
createdAt DateTime @default(now())
@@index([userId])
}
model Subscription {
id String @id @default(cuid())
userId String @unique
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
plan String @default("free") // free | pro
status String @default("active") // active | canceled | past_due
provider String @default("mock") // mock | stripe
currentPeriodEnd DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model AuditLog {
id String @id @default(cuid())
actorId String?
actor User? @relation(fields: [actorId], references: [id], onDelete: SetNull)
action String
target String?
meta String?
createdAt DateTime @default(now())
@@index([actorId])
}
// ---------------------------------------------------------------- booking domain
model Service {
id String @id @default(cuid())
slug String @unique
name String
description String @default("")
durationMin Int
priceCents Int @default(0)
active Boolean @default(true)
createdAt DateTime @default(now())
staff StaffService[]
bookings Booking[]
}
model Staff {
id String @id @default(cuid())
slug String @unique
name String
title String @default("")
bio String?
avatarColor String @default("#4f46e5")
services StaffService[]
hours WorkingHour[]
bookings Booking[]
}
model StaffService {
staffId String
serviceId String
staff Staff @relation(fields: [staffId], references: [id], onDelete: Cascade)
service Service @relation(fields: [serviceId], references: [id], onDelete: Cascade)
@@id([staffId, serviceId])
@@index([serviceId])
}
model WorkingHour {
id String @id @default(cuid())
staffId String
weekday Int // 0 = Sunday .. 6 = Saturday, in the site timezone
startMin Int // minutes from midnight, in the site timezone
endMin Int
staff Staff @relation(fields: [staffId], references: [id], onDelete: Cascade)
@@index([staffId])
}
model Booking {
id String @id @default(cuid())
serviceId String
staffId String?
userId String?
service Service @relation(fields: [serviceId], references: [id])
staff Staff? @relation(fields: [staffId], references: [id])
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
startsAt DateTime
endsAt DateTime
status String @default("pending") // pending | confirmed | cancelled | completed | no_show
customerName String
customerEmail String
notes String?
confirmationSentAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([startsAt])
@@index([staffId, startsAt])
@@index([userId])
}