// 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_sessions OAuthSessions[] @relation("UserOAuthSessions") 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 job_title String? is_supervisor Boolean @default(false) supervisor Employees? @relation("EmployeeSupervisor", fields: [supervisor_id], references: [id]) supervisor_id Int? crew Employees[] @relation("EmployeeSupervisor") 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 job_title String? is_supervisor Boolean 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 bank_code BankCodes? @relation("LeaveRequestBankCodes", fields: [bank_code_id], references: [id]) bank_code_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 { pay_year Int pay_period_no Int payday DateTime @db.Date period_start DateTime @db.Date period_end DateTime @db.Date 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 bank_code BankCodes @relation("ShiftBankCodes", fields: [bank_code_id], references: [id]) bank_code_id Int description String? date DateTime @db.Date start_time DateTime @db.Time(0) end_time DateTime @db.Time(0) is_approved Boolean @default(false) 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 @default(now()) timesheet_id Int bank_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 BankCodes { id Int @id @default(autoincrement()) type String categorie String modifier Float bank_code String shifts Shifts[] @relation("ShiftBankCodes") expenses Expenses[] @relation("ExpenseBankCodes") leaveRequests LeaveRequests[] @relation("LeaveRequestBankCodes") @@map("bank_codes") } model Expenses { id Int @id @default(autoincrement()) timesheet Timesheets @relation("ExpensesTimesheet", fields: [timesheet_id], references: [id]) timesheet_id Int bank_code BankCodes @relation("ExpenseBankCodes", fields: [bank_code_id], references: [id]) bank_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()) bank_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 OAuthSessions { id String @id @default(cuid()) user Users @relation("UserOAuthSessions", fields: [user_id], references: [id]) user_id String @db.Uuid application String access_token String @unique refresh_token String @unique sid 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("oauth_sessions") } model Blobs { sha256 String @id @db.Char(64) size Int mime String storage_path String refcount Int @default(0) created_at DateTime @default(now()) attachments Attachments[] @@map("blobs") } model Attachments { id Int @id @default(autoincrement()) sha256 String @db.Char(64) blob Blobs @relation(fields: [sha256], references: [sha256], onUpdate: Cascade) owner_type String //EXPENSES ou éventuellement autre chose comme scan ONU ou photos d'employés, etc owner_id String //expense_id, employee_id, etc original_name String status AttachmentStatus @default(ACTIVE) retention_policy RetentionPolicy created_by String created_at DateTime @default(now()) @@index([owner_type, owner_id, created_at]) @@index([sha256]) @@map("attachments") } enum AttachmentStatus { ACTIVE DELETED } enum RetentionPolicy { EXPENSE_7Y TICKET_2Y PROFILE_KEEP_LAST3 } 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 WEDDING // mariage @@map("leave_types") } enum LeaveApprovalStatus { PENDING APPROVED DENIED CANCELLED ESCALATED @@map("leave_approval_status") }