// 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" previewFeatures = ["views"] } datasource db { provider = "postgresql" url = env("DATABASE_URL_DEV") } model Users { id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid first_name String last_name String email String @unique phone_number Int @unique residence String? role Roles @default(GUEST) employee Employees? @relation("UserEmployee") customer Customers? @relation("UserCustomer") oauth_access_tokens OAuthAccessTokens[] @relation("UserOAuthAccessToken") employees_archive EmployeesArchive[] @relation("UsersToEmployeesToArchive") customer_archive CustomersArchive[] @relation("UserToCustomersToArchive") @@map("users") } model Employees { id Int @id @default(autoincrement()) user Users @relation("UserEmployee", fields: [user_id], references: [id]) user_id String @unique @db.Uuid external_payroll_id Int company_code Int first_work_day DateTime @db.Date last_work_day DateTime? @db.Date supervisor Employees? @relation("EmployeeSupervisor", fields: [supervisor_id], references: [id]) supervisor_id Int? managed_employees Employees[] @relation("EmployeeSupervisor") //changer pour crew à la prochaine MaJ archive EmployeesArchive[] @relation("EmployeeToArchive") timesheet Timesheets[] @relation("TimesheetEmployee") leave_request LeaveRequests[] @relation("LeaveRequestEmployee") supervisor_archive EmployeesArchive[] @relation("EmployeeSupervisorToArchive") @@map("employees") } model EmployeesArchive { id Int @id @default(autoincrement()) employee Employees @relation("EmployeeToArchive", fields: [employee_id], references: [id]) employee_id Int archived_at DateTime @default(now()) user_id String @db.Uuid user Users @relation("UsersToEmployeesToArchive",fields: [user_id], references: [id]) first_name String last_name String external_payroll_id Int company_code Int first_Work_Day DateTime @db.Date last_work_day DateTime @db.Date supervisor_id Int? supervisor Employees? @relation("EmployeeSupervisorToArchive", fields: [supervisor_id], references: [id]) @@map("employees_archive") } model Customers { id Int @id @default(autoincrement()) user Users @relation("UserCustomer", fields: [user_id], references: [id]) user_id String @unique @db.Uuid invoice_id Int? @unique archive CustomersArchive[] @relation("CustomerToArchive") @@map("customers") } model CustomersArchive { id Int @id @default(autoincrement()) customer Customers @relation("CustomerToArchive", fields: [customer_id], references: [id]) customer_id Int archived_at DateTime @default(now()) user_id String @db.Uuid user Users @relation("UserToCustomersToArchive", fields: [user_id], references: [id]) invoice_id Int? @unique @@map("customers_archive") } model LeaveRequests { id Int @id @default(autoincrement()) employee Employees @relation("LeaveRequestEmployee", fields: [employee_id], references: [id]) employee_id Int leave_type LeaveTypes start_date_time DateTime @db.Date end_date_time DateTime? @db.Date comment String approval_status LeaveApprovalStatus @default(PENDING) archive LeaveRequestsArchive[] @relation("LeaveRequestToArchive") @@map("leave_requests") } model LeaveRequestsArchive { id Int @id @default(autoincrement()) leave_request LeaveRequests @relation("LeaveRequestToArchive", fields: [leave_request_id], references: [id]) leave_request_id Int archived_at DateTime @default(now()) employee_id Int leave_type LeaveTypes start_date_time DateTime @db.Date end_date_time DateTime? @db.Date comment String approval_status LeaveApprovalStatus @@map("leave_requests_archive") } //pay-period vue view PayPeriods { period_number Int @id start_date DateTime @db.Date end_date DateTime @db.Date year Int label String @@map("pay_period") } model Timesheets { id Int @id @default(autoincrement()) employee Employees @relation("TimesheetEmployee", fields: [employee_id], references: [id]) employee_id Int is_approved Boolean @default(false) shift Shifts[] @relation("ShiftTimesheet") expense Expenses[] @relation("ExpensesTimesheet") archive TimesheetsArchive[] @relation("TimesheetsToArchive") @@map("timesheets") } model TimesheetsArchive { id Int @id @default(autoincrement()) timesheet Timesheets @relation("TimesheetsToArchive", fields: [timesheet_id], references: [id]) timesheet_id Int archive_at DateTime @default(now()) employee_id Int is_approved Boolean @@map("timesheets_archive") } model Shifts { id Int @id @default(autoincrement()) timesheet Timesheets @relation("ShiftTimesheet", fields: [timesheet_id], references: [id]) timesheet_id Int shift_code ShiftCodes @relation("ShiftShiftCode", fields: [shift_code_id], references: [id]) shift_code_id Int description String? date DateTime @db.Date start_time DateTime @db.Time(0) end_time DateTime @db.Time(0) archive ShiftsArchive[] @relation("ShiftsToArchive") @@map("shifts") } model ShiftsArchive { id Int @id @default(autoincrement()) shift Shifts @relation("ShiftsToArchive", fields: [shift_id], references: [id]) shift_id Int archive_at DateTime timesheet_id Int shift_code_id Int description String? date DateTime @db.Date start_time DateTime @db.Time(0) end_time DateTime @db.Time(0) @@map("shifts_archive") } model ShiftCodes { id Int @id @default(autoincrement()) shift_type String bank_code String shift Shifts[] @relation("ShiftShiftCode") @@map("shift_codes") } model Expenses { id Int @id @default(autoincrement()) timesheet Timesheets @relation("ExpensesTimesheet", fields: [timesheet_id], references: [id]) timesheet_id Int expense_code ExpenseCodes @relation("ExpenseExpenseCode", fields: [expense_code_id], references: [id]) expense_code_id Int date DateTime @db.Date amount Decimal @db.Money attachement String? description String? is_approved Boolean @default(false) supervisor_comment String? archive ExpensesArchive[] @relation("ExpensesToArchive") @@map("expenses") } model ExpensesArchive { id Int @id @default(autoincrement()) expense Expenses @relation("ExpensesToArchive", fields: [expense_id], references: [id]) expense_id Int timesheet_id Int archived_at DateTime @default(now()) expense_code_id Int date DateTime @db.Date amount Decimal @db.Money attachement String? description String? is_approved Boolean supervisor_comment String? @@map("expenses_archive") } model ExpenseCodes { id Int @id @default(autoincrement()) expense_type String bank_code String expense Expenses[] @relation("ExpenseExpenseCode") @@map("expense_codes") } model OAuthAccessTokens { id String @id @default(cuid()) user Users @relation("UserOAuthAccessToken", fields: [user_id], references: [id]) user_id String @db.Uuid application String access_token String @unique refresh_token String @unique access_token_expiry DateTime refresh_token_expiry DateTime? is_revoked Boolean @default(false) scopes Json @default("[]") created_at DateTime @default(now()) updated_at DateTime? @@map("refresh_tokens") } enum Roles { ADMIN SUPERVISOR HR ACCOUNTING EMPLOYEE DEALER CUSTOMER GUEST @@map("roles") } enum LeaveTypes { SICK // maladie ou repos VACATION // paye UNPAID // non-paye BEREAVEMENT // deuil de famille PARENTAL // maternite/paternite/adoption LEGAL // obligations legales comme devoir de juree @@map("leave_types") } enum LeaveApprovalStatus { PENDING APPROVED DENIED CANCELLED ESCALATED @@map("leave_approval_status") }