434 lines
13 KiB
Plaintext
434 lines
13 KiB
Plaintext
// 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_STAGING")
|
|
}
|
|
|
|
model Users {
|
|
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
|
|
first_name String
|
|
last_name String
|
|
email String @unique
|
|
phone_number String
|
|
residence String?
|
|
role Roles @default(GUEST)
|
|
|
|
employee Employees? @relation("UserEmployee")
|
|
oauth_sessions OAuthSessions[] @relation("UserOAuthSessions")
|
|
preferences Preferences? @relation("UserPreferences")
|
|
user_module_access userModuleAccess? @relation("UserModuleAccess")
|
|
|
|
@@map("users")
|
|
}
|
|
|
|
model userModuleAccess {
|
|
id Int @id @default(autoincrement())
|
|
user Users @relation("UserModuleAccess", fields: [user_id], references: [id])
|
|
user_id String @unique @db.Uuid
|
|
|
|
timesheets Boolean @default(false) //wich allows an employee to enter shifts and expenses
|
|
timesheets_approval Boolean @default(false) //wich allows the approbation of timesheets by a supervisor or above
|
|
employee_list Boolean @default(false) //wich shows the lists of employee to show names, emails, titles and profile picture
|
|
employee_management Boolean @default(false) //wich offers CRUD for employees, schedule_presets and manage module access
|
|
personal_profile Boolean @default(false) //wich governs profile details, preferances and dashboard access
|
|
dashboard Boolean @default(false) //wich allows access to the main page of the app
|
|
|
|
@@map("user_module_access")
|
|
}
|
|
|
|
model Employees {
|
|
id Int @id @default(autoincrement())
|
|
user Users @relation("UserEmployee", fields: [user_id], references: [id])
|
|
user_id String @unique @db.Uuid
|
|
supervisor Employees? @relation("EmployeeSupervisor", fields: [supervisor_id], references: [id])
|
|
supervisor_id Int?
|
|
schedule_preset SchedulePresets? @relation("EmployeesSchedulePreset", fields: [schedule_preset_id], references: [id])
|
|
schedule_preset_id Int?
|
|
|
|
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)
|
|
|
|
crew Employees[] @relation("EmployeeSupervisor")
|
|
timesheet Timesheets[] @relation("TimesheetEmployee")
|
|
leave_request LeaveRequests[] @relation("LeaveRequestEmployee")
|
|
|
|
@@map("employees")
|
|
}
|
|
|
|
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
|
|
|
|
comment String
|
|
dates DateTime[] @db.Date
|
|
payable_hours Decimal? @db.Decimal(5, 2)
|
|
requested_hours Decimal? @db.Decimal(5, 2)
|
|
approval_status LeaveApprovalStatus @default(PENDING)
|
|
leave_type LeaveTypes
|
|
|
|
archive LeaveRequestsArchive[] @relation("LeaveRequestToArchive")
|
|
|
|
@@unique([employee_id, leave_type, dates], name: "leave_per_employee_date")
|
|
@@index([employee_id, dates])
|
|
@@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
|
|
date DateTime @db.Date
|
|
payable_hours Decimal? @db.Decimal(5, 2)
|
|
requested_hours Decimal? @db.Decimal(5, 2)
|
|
comment String
|
|
leave_type LeaveTypes
|
|
approval_status LeaveApprovalStatus
|
|
|
|
@@unique([leave_request_id])
|
|
@@index([employee_id, date])
|
|
@@map("leave_requests_archive")
|
|
}
|
|
|
|
//pay-period vue
|
|
view PayPeriods {
|
|
pay_year Int
|
|
pay_period_no Int
|
|
label String
|
|
payday DateTime @db.Date
|
|
period_start DateTime @db.Date
|
|
period_end DateTime @db.Date
|
|
|
|
@@map("pay_period")
|
|
}
|
|
|
|
model Timesheets {
|
|
id Int @id @default(autoincrement())
|
|
employee Employees @relation("TimesheetEmployee", fields: [employee_id], references: [id])
|
|
employee_id Int
|
|
|
|
start_date DateTime @db.Date
|
|
is_approved Boolean @default(false)
|
|
|
|
shift Shifts[] @relation("ShiftTimesheet")
|
|
expense Expenses[] @relation("ExpensesTimesheet")
|
|
archive TimesheetsArchive[] @relation("TimesheetsToArchive")
|
|
|
|
@@unique([employee_id, start_date], name: "employee_id_start_date")
|
|
@@map("timesheets")
|
|
}
|
|
|
|
model TimesheetsArchive {
|
|
id Int @id @default(autoincrement())
|
|
timesheet Timesheets @relation("TimesheetsToArchive", fields: [timesheet_id], references: [id])
|
|
timesheet_id Int
|
|
|
|
employee_id Int
|
|
is_approved Boolean
|
|
archive_at DateTime @default(now())
|
|
|
|
@@map("timesheets_archive")
|
|
}
|
|
|
|
model SchedulePresets {
|
|
id Int @id @default(autoincrement())
|
|
name String
|
|
is_default Boolean @default(false)
|
|
|
|
shifts SchedulePresetShifts[] @relation("SchedulePresetShiftsSchedulePreset")
|
|
employees Employees[] @relation("EmployeesSchedulePreset")
|
|
|
|
@@map("schedule_presets")
|
|
}
|
|
|
|
model SchedulePresetShifts {
|
|
id Int @id @default(autoincrement())
|
|
preset SchedulePresets @relation("SchedulePresetShiftsSchedulePreset", fields: [preset_id], references: [id])
|
|
preset_id Int
|
|
bank_code BankCodes @relation("SchedulePresetShiftsBankCodes", fields: [bank_code_id], references: [id])
|
|
bank_code_id Int
|
|
|
|
sort_order Int
|
|
start_time DateTime @db.Time(0)
|
|
end_time DateTime @db.Time(0)
|
|
is_remote Boolean @default(false)
|
|
week_day Weekday
|
|
|
|
@@unique([preset_id, week_day, sort_order], name: "unique_preset_shift_per_day_order")
|
|
@@index([preset_id, week_day])
|
|
@@map("schedule_preset_shifts")
|
|
}
|
|
|
|
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
|
|
|
|
date DateTime @db.Date
|
|
start_time DateTime @db.Time(0)
|
|
end_time DateTime @db.Time(0)
|
|
is_approved Boolean @default(false)
|
|
is_remote Boolean @default(false)
|
|
comment String?
|
|
|
|
archive ShiftsArchive[] @relation("ShiftsToArchive")
|
|
|
|
@@unique([timesheet_id, date, start_time], name: "unique_ts_id_date_start_time")
|
|
@@map("shifts")
|
|
}
|
|
|
|
model ShiftsArchive {
|
|
id Int @id @default(autoincrement())
|
|
shift Shifts @relation("ShiftsToArchive", fields: [shift_id], references: [id])
|
|
shift_id Int
|
|
|
|
date DateTime @db.Date
|
|
start_time DateTime @db.Time(0)
|
|
end_time DateTime @db.Time(0)
|
|
timesheet_id Int
|
|
bank_code_id Int
|
|
comment String?
|
|
archive_at DateTime @default(now())
|
|
|
|
@@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")
|
|
SchedulePresetShifts SchedulePresetShifts[] @relation("SchedulePresetShiftsBankCodes")
|
|
|
|
@@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
|
|
attachment_record Attachments? @relation("ExpenseAttachment", fields: [attachment], references: [id], onDelete: SetNull)
|
|
attachment Int?
|
|
|
|
date DateTime @db.Date
|
|
amount Decimal? @db.Decimal(12, 2)
|
|
mileage Decimal? @db.Decimal(12, 2)
|
|
comment String
|
|
supervisor_comment String?
|
|
is_approved Boolean @default(false)
|
|
|
|
archive ExpensesArchive[] @relation("ExpensesToArchive")
|
|
|
|
@@unique([timesheet_id, date, amount, mileage], name: "unique_ts_id_date_amount_mileage")
|
|
@@map("expenses")
|
|
}
|
|
|
|
model ExpensesArchive {
|
|
id Int @id @default(autoincrement())
|
|
expense Expenses @relation("ExpensesToArchive", fields: [expense_id], references: [id])
|
|
expense_id Int
|
|
attachment_record Attachments? @relation("ExpenseArchiveAttachment", fields: [attachment], references: [id], onDelete: SetNull)
|
|
attachment Int?
|
|
|
|
timesheet_id Int
|
|
archived_at DateTime @default(now())
|
|
bank_code_id Int
|
|
date DateTime @db.Date
|
|
amount Decimal? @db.Decimal(12, 2)
|
|
mileage Decimal? @db.Decimal(12, 2)
|
|
comment 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 Sessions {
|
|
id String @id
|
|
sid String @unique
|
|
data String
|
|
expiresAt DateTime
|
|
|
|
@@map("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[] @relation("AttachmnentBlob")
|
|
|
|
@@map("blobs")
|
|
}
|
|
|
|
model Attachments {
|
|
id Int @id @default(autoincrement())
|
|
blob Blobs @relation("AttachmnentBlob", fields: [sha256], references: [sha256], onUpdate: Cascade)
|
|
sha256 String @db.Char(64)
|
|
|
|
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())
|
|
|
|
expenses Expenses[] @relation("ExpenseAttachment")
|
|
expenses_archive ExpensesArchive[] @relation("ExpenseArchiveAttachment")
|
|
|
|
AttachmentVariants AttachmentVariants[] @relation("attachmentVariantAttachment")
|
|
|
|
@@index([owner_type, owner_id, created_at])
|
|
@@index([sha256])
|
|
@@map("attachments")
|
|
}
|
|
|
|
model AttachmentVariants {
|
|
id Int @id @default(autoincrement())
|
|
attachment_id Int
|
|
attachment Attachments @relation("attachmentVariantAttachment", fields: [attachment_id], references: [id], onDelete: Cascade)
|
|
variant String
|
|
path String
|
|
bytes Int
|
|
width Int?
|
|
height Int?
|
|
created_at DateTime @default(now())
|
|
|
|
@@unique([attachment_id, variant])
|
|
@@map("attachment_variants")
|
|
}
|
|
|
|
model Preferences {
|
|
id Int @id @default(autoincrement())
|
|
user Users @relation("UserPreferences", fields: [user_id], references: [id])
|
|
user_id String @unique @db.Uuid
|
|
|
|
notifications Boolean @default(true)
|
|
is_dark_mode Boolean? @default(false)
|
|
display_language String @default("fr-FR") //'fr-FR' | 'en-CA';
|
|
is_lefty_mode Boolean @default(false)
|
|
is_employee_list_grid Boolean @default(true)
|
|
is_timesheet_approval_grid Boolean @default(true)
|
|
|
|
@@map("preferences")
|
|
}
|
|
|
|
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 Modules {
|
|
timesheets
|
|
timesheets_approval
|
|
employee_list
|
|
employee_management
|
|
personal_profile
|
|
dashboard
|
|
|
|
@@map("modules")
|
|
}
|
|
|
|
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
|
|
HOLIDAY // férier
|
|
|
|
@@map("leave_types")
|
|
}
|
|
|
|
enum LeaveApprovalStatus {
|
|
PENDING
|
|
APPROVED
|
|
DENIED
|
|
CANCELLED
|
|
ESCALATED
|
|
|
|
@@map("leave_approval_status")
|
|
}
|
|
|
|
enum Weekday {
|
|
SUN
|
|
MON
|
|
TUE
|
|
WED
|
|
THU
|
|
FRI
|
|
SAT
|
|
}
|