generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id               Int                @id @default(autoincrement())
  createdAt        DateTime           @default(now())
  email            String             @unique
  username         String?            @unique
  firstName        String
  lastName         String
  city             String
  country          String
  address          String
  phone            String
  password         String
  isActive         Boolean            @default(true)
  role             Role               @default(MANAGER)
  profileImage     String?
  bio              String?
  socialLinks      Json?
  customFields     Json?
  lastLogin        DateTime?          @updatedAt
  activityLogs     ActivityLog[]      @relation("UserActivityLogs")
  calendarEvents   CalendarEvent[]
  managedClients   Client[]           @relation("UserClients")
  InvoiceComment   InvoiceComment[]
  managerData      ManagerData?
  receivedMessages Message[]          @relation("ReceivedMessages")
  sentMessages     Message[]          @relation("SentMessages")
  notifications    Notification[]
  projects         Project[]
  managedTasks     Task[]             @relation("ResponsibleTasks")
  assignedTasks    TaskCollaborator[]
  taskComments     TaskComment[]
}

model ManagerData {
  id             Int             @id @default(autoincrement())
  userId         Int             @unique
  clients        Client[]
  communications Communication[]
  documents      Document[]
  factures       Facture[]
  folders        Folder[]
  invoices       Invoice[]
  user           User            @relation(fields: [userId], references: [id])
  tasks          Task[]
}

model Client {
  id                      Int             @id @default(autoincrement())
  lastName                String
  firstName               String
  dateOfBirth             DateTime?
  nationality             String?
  socialSecurityNumber    String?         @unique
  street                  String?
  streetNumber            String?
  postalCode              String?
  stateCanton             String?
  country                 String?
  mobilePhone             String?
  otherPhone              String?
  email                   String?
  taxIdentificationNumber String?
  bankAccountNumbers      Json?
  creditCardInfo          Json?
  paymentCoordinates      Json?
  monthlySalary           Float?
  secondaryIncomeSources  Json?
  bonuses                 Float?
  taxDeclarations         Json?
  payStubs                Json?
  expenseHistory          Json?
  consumerCredits         Json?
  debtAmount              Float?
  unpaidBills             Json?
  recurringSubscriptions  Json?
  bankAccountBalances     Json?
  savingsBook             Json?
  realEstateProperties    Json?
  netWorthEstimate        Float?
  vehicles                Json?
  jewelry                 Json?
  creationDate            DateTime        @default(now())
  updateDate              DateTime        @updatedAt
  status                  FolderStatus    @default(PENDING)
  managerId               Int?
  accountHolder           String?
  accountNumber           String?
  accountPurpose          String?
  accountStatus           String?
  bank                    String?
  contractStart           DateTime?
  employer                String?
  fatherContact           String?
  fatherName              String?
  financialOther          String?
  motherContact           String?
  motherName              String?
  professionalCity        String?
  professionalCountry     String?
  professionalOther       String?
  professionalPhone       String?
  professionalResponsible String?
  professionalStatus      String?
  relationOther           String?
  spouseContact           String?
  spouseName              String?
  customFields            Json?
  contractEnd             DateTime?
  contractType            String?
  fatherCountry           String?
  motherCountry           String?
  partnerContact          String?
  partnerCountry          String?
  partnerName             String?
  professionalCanton      String?
  managerDataId           Int?
  assignedManagerIds      Int[]
  activityLogs            ActivityLog[]   @relation("ClientActivityLogs")
  managerData             ManagerData?    @relation(fields: [managerDataId], references: [id])
  manager                 User?           @relation("UserClients", fields: [managerId], references: [id])
  communications          Communication[]
  documents               Document[]
  factures                Facture[]
  folders                 Folder[]
  invoices                Invoice[]
  partners                Partner[]
  tasks                   Task[]
}

model Folder {
  id             Int              @id @default(autoincrement())
  createdAt      DateTime         @default(now())
  status         FolderStatus     @default(PROGRESS)
  name           String
  description    String?
  clientId       Int?
  managerDataId  Int?
  activityLogs   ActivityLog[]
  communications Communication[]
  bankAccounts   CompteBancaire[]
  documents      Document[]
  jobs           Emploi[]
  client         Client?          @relation(fields: [clientId], references: [id])
  managerData    ManagerData?     @relation(fields: [managerDataId], references: [id])
  invoices       Invoice[]
  relations      Relation[]
  tasks          Task[]
}

model CompteBancaire {
  id             Int            @id @default(autoincrement())
  bankName       String
  accountNumber  String?
  accountHolder  String?
  accountPurpose AccountPurpose @default(CURRENT)
  status         AccountStatus  @default(ACTIVE)
  creationDate   DateTime       @default(now())
  updateDate     DateTime       @updatedAt
  folderId       Int
  folder         Folder         @relation(fields: [folderId], references: [id])
}

model Emploi {
  id             Int       @id @default(autoincrement())
  employer       String
  manager        String?
  address        String?
  phone          String?
  city           String?
  country        String?
  contractStart  DateTime?
  contractStatus String?
  creationDate   DateTime  @default(now())
  updateDate     DateTime  @updatedAt
  folderId       Int
  folder         Folder    @relation(fields: [folderId], references: [id])
}

model Relation {
  id           Int      @id @default(autoincrement())
  fatherName   String?
  motherName   String?
  spouseName   String?
  relationType String
  contact      String?
  creationDate DateTime @default(now())
  updateDate   DateTime @updatedAt
  folderId     Int
  folder       Folder   @relation(fields: [folderId], references: [id])
}

model Document {
  id               Int            @id @default(autoincrement())
  name             String
  fileType         String
  path             String
  isPermanent      Boolean        @default(false)
  documentCategory String?
  documentType     DocumentType?
  uploadDate       DateTime       @default(now())
  folderId         Int?
  clientId         Int?
  communicationId  Int?
  invoiceId        Int?
  parentId         Int?
  partnerId        Int?
  managerDataId    Int?
  client           Client?        @relation(fields: [clientId], references: [id])
  communication    Communication? @relation(fields: [communicationId], references: [id])
  folder           Folder?        @relation(fields: [folderId], references: [id])
  invoice          Invoice?       @relation(fields: [invoiceId], references: [id])
  managerData      ManagerData?   @relation(fields: [managerDataId], references: [id])
  parent           Document?      @relation("DocumentChildren", fields: [parentId], references: [id])
  children         Document[]     @relation("DocumentChildren")
  partner          Partner?       @relation(fields: [partnerId], references: [id])
}

model Partner {
  id           Int           @id @default(autoincrement())
  partnerType  PartnerType   @default(OTHER)
  name         String
  contactName  String?
  phone        String?
  email        String?
  address      String?
  city         String?
  country      String?
  postalCode   String?
  clientId     Int
  street       String?
  streetNumber String?
  activityLogs ActivityLog[] @relation("PartnerActivityLogs")
  documents    Document[]
  events       Event[]
  factures     Facture[]
  client       Client        @relation(fields: [clientId], references: [id])
}

model Event {
  id              Int            @id @default(autoincrement())
  title           String
  description     String?
  status          EventStatus    @default(TODO)
  calendarEventId Int?
  actionToDo      String?
  createdAt       DateTime       @default(now())
  dueDate         DateTime?
  eventDate       DateTime
  fileUrl         String?
  partnerId       Int
  remarks         String?
  calendarEvent   CalendarEvent? @relation(fields: [calendarEventId], references: [id])
  partner         Partner        @relation(fields: [partnerId], references: [id])
}

model Notification {
  id          Int              @id @default(autoincrement())
  userId      Int
  type        NotificationType
  content     String
  isRead      Boolean          @default(false)
  createdAt   DateTime         @default(now())
  relatedId   Int?
  relatedType String?
  user        User             @relation(fields: [userId], references: [id])
}

model CalendarEvent {
  id          Int      @id @default(autoincrement())
  title       String
  description String?
  start       DateTime
  end         DateTime
  allDay      Boolean  @default(false)
  color       String?
  userId      Int?
  user        User?    @relation(fields: [userId], references: [id])
  events      Event[]
  tasks       Task[]
}

model ActivityLog {
  id              Int            @id @default(autoincrement())
  createdAt       DateTime       @default(now())
  action          String
  entityType      String
  entityId        Int
  description     String?
  userId          Int?
  folderId        Int?
  partnerId       Int?
  communicationId Int?
  clientId        Int?
  taskId          Int?
  client          Client?        @relation("ClientActivityLogs", fields: [clientId], references: [id])
  communication   Communication? @relation("CommunicationActivityLogs", fields: [communicationId], references: [id])
  folder          Folder?        @relation(fields: [folderId], references: [id])
  partner         Partner?       @relation("PartnerActivityLogs", fields: [partnerId], references: [id])
  task            Task?          @relation("TaskActivityLogs", fields: [taskId], references: [id])
  user            User?          @relation("UserActivityLogs", fields: [userId], references: [id])
}

model Invoice {
  id             Int              @id @default(autoincrement())
  invoiceNumber  String           @unique
  issueDate      DateTime
  dueDate        DateTime
  amount         Float
  status         InvoiceStatus    @default(OPEN)
  description    String?
  clientId       Int?
  folderId       Int?
  managerDataId  Int?
  documents      Document[]
  client         Client?          @relation(fields: [clientId], references: [id])
  folder         Folder?          @relation(fields: [folderId], references: [id])
  managerData    ManagerData?     @relation(fields: [managerDataId], references: [id])
  InvoiceComment InvoiceComment[]
}

model InvoiceComment {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  content   String
  invoiceId Int
  userId    Int
  invoice   Invoice  @relation(fields: [invoiceId], references: [id])
  user      User     @relation(fields: [userId], references: [id])
}

model Communication {
  id                Int               @id @default(autoincrement())
  createdAt         DateTime          @default(now())
  type              CommunicationType @default(SENT)
  subject           String?
  content           String
  communicationType String?
  detailedType      String?
  attachments       Json?
  clientId          Int?
  folderId          Int?
  managerDataId     Int?
  activityLogs      ActivityLog[]     @relation("CommunicationActivityLogs")
  client            Client?           @relation(fields: [clientId], references: [id])
  folder            Folder?           @relation(fields: [folderId], references: [id])
  managerData       ManagerData?      @relation(fields: [managerDataId], references: [id])
  documents         Document[]
}

model Task {
  id              Int                @id @default(autoincrement())
  title           String
  description     String?
  startDate       DateTime?
  dueDate         DateTime?
  status          TaskStatus         @default(PENDING)
  priority        String?
  isAutomatic     Boolean            @default(false)
  completedAt     DateTime?
  duration        String?
  appreciation    String?
  responsibleId   Int
  clientId        Int?
  folderId        Int?
  calendarEventId Int?
  isPrivate       Boolean            @default(false)
  managerDataId   Int?
  activityLogs    ActivityLog[]      @relation("TaskActivityLogs")
  calendarEvent   CalendarEvent?     @relation(fields: [calendarEventId], references: [id])
  client          Client?            @relation(fields: [clientId], references: [id])
  folder          Folder?            @relation(fields: [folderId], references: [id])
  managerData     ManagerData?       @relation(fields: [managerDataId], references: [id])
  responsible     User               @relation("ResponsibleTasks", fields: [responsibleId], references: [id])
  collaborators   TaskCollaborator[]
  comments        TaskComment[]
  dependentTasks  TaskDependency[]   @relation("DependentTasks")
  dependencies    TaskDependency[]   @relation("TaskDependencies")
}

model TaskDependency {
  id              Int      @id @default(autoincrement())
  taskId          Int
  dependentTaskId Int
  type            String?
  createdAt       DateTime @default(now())
  dependentTask   Task     @relation("DependentTasks", fields: [dependentTaskId], references: [id])
  task            Task     @relation("TaskDependencies", fields: [taskId], references: [id])
}

model TaskCollaborator {
  id      Int      @id @default(autoincrement())
  taskId  Int
  userId  Int
  role    String
  addedAt DateTime @default(now())
  task    Task     @relation(fields: [taskId], references: [id])
  user    User     @relation(fields: [userId], references: [id])
}

model TaskComment {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  content   String
  taskId    Int
  userId    Int
  task      Task     @relation(fields: [taskId], references: [id])
  user      User     @relation(fields: [userId], references: [id])
}

model Message {
  id             Int      @id @default(autoincrement())
  senderId       Int
  recipientId    Int?
  content        String
  isGroupMessage Boolean  @default(false)
  isRead         Boolean  @default(false)
  fileUrl        String?
  fileName       String?
  fileSize       Int?
  createdAt      DateTime @default(now())
  recipient      User?    @relation("ReceivedMessages", fields: [recipientId], references: [id])
  sender         User     @relation("SentMessages", fields: [senderId], references: [id])
}

model Facture {
  id            String       @id @default(uuid())
  type          String
  titre         String
  dateReception DateTime
  echeance      DateTime
  statut        String
  remarque      String?
  pdfPath       String?
  createdAt     DateTime     @default(now())
  updatedAt     DateTime     @updatedAt
  partenaireId  Int
  montant       Float?
  clientId      Int?
  datePaiement  DateTime?
  managerDataId Int?
  client        Client?      @relation(fields: [clientId], references: [id])
  managerData   ManagerData? @relation(fields: [managerDataId], references: [id])
  partner       Partner      @relation(fields: [partenaireId], references: [id])
}

model Project {
  id        Int      @id @default(autoincrement())
  title     String
  userId    Int
  createdAt DateTime @default(now())
  user      User     @relation(fields: [userId], references: [id])
}

enum Role {
  ADMIN
  MANAGER
  CHIEF_MANAGER
}

enum TaskStatus {
  PENDING
  IN_PROGRESS
  COMPLETED
  OVERDUE
}

enum NotificationType {
  TASK_ASSIGNED
  TASK_DEADLINE
  MESSAGE_RECEIVED
  PERMISSION_REQUEST
  SYSTEM_ALERT
  CLIENT_UPDATE
  DOCUMENT_UPLOAD
  TRANSFER
}

enum FolderStatus {
  PENDING
  FINISHED
  PROGRESS
  URGENT
}

enum DocumentType {
  HEALTH_INVOICE
  OTHER_INVOICE
  MAIL_COURRIER_MANUSCRIT
  MAIL_COURRIER_DACTYLOGRAPHIE
  MAIL_LETTRE_RECOMMANDEE
  MAIL_LETTRE_ADMINISTRATIVE
  MAIL_LETTRE_MOTIVATION
  MAIL_LETTRE_RECLAMATION
  MAIL_LETTRE_RESILIATION
  MAIL_LETTRE_INVITATION
  EMAIL_PROFESSIONNEL
  EMAIL_DEMANDE_REPONSE
  EMAIL_CONVOCATION
  EMAIL_CONFIRMATION
  OFFICIAL_CONVOCATION
  OFFICIAL_AVIS
  OFFICIAL_NOTIFICATION
  OFFICIAL_COMPTE_RENDU
  OFFICIAL_RAPPORT_ACTIVITE
  APPOINTMENT_DEED
  IDENTITY_CARD
  DAY_PERMIT
  PASSPORT
  EMPLOYMENT_CONTRACT
  ENTRY_INVENTORY
  LEASE_AGREEMENT
  LAMAL_INSURANCE_POLICY
  LIABILITY_INSURANCE_POLICY
  CAR_INSURANCE
  SUBSIDY_DECISION
  ECA_INSURANCE_POLICY
  TAX_DECLARATION
  TAX_DECISION
  ANNUAL_REPORT
  CORPORATE_FUND_DECISION
  TRAVEL
  PHONE_CONTRACT
  OTHER
}

enum AccountPurpose {
  CURRENT
  PRIVATE
  SAVINGS
}

enum AccountStatus {
  ACTIVE
  INACTIVE
}

enum PartnerType {
  HEALTH_INSURANCE
  COMPENSATION_FUND
  JUSTICE_OF_PEACE
  TAX
  MUNICIPALITY
  RESIDENTS_CONTROL
  EMPLOYER
  AI_OFFICE
  HEALTH_INSURANCE_OFFICE
  DEBT_COLLECTION_OFFICE
  PC_PENSION_FUND
  SOCIAL_CSR
  RECOVERY_AGENCY
  LIABILITY_INSURANCE
  LANDLORD
  HOME_INSURANCE
  TELECOMMUNICATION
  BANK
  SCHOLARSHIP_OFFICE
  GUARDIAN_CURATOR
  SERAFE
  DOCTOR
  CAR_SERVICE
  NURSING_HOME
  SWISS_RAILWAYS
  MECHANIC
  INTRUM
  MILITARY_TAX
  OTHER
}

enum EventStatus {
  DONE
  TODO
}

enum InvoiceStatus {
  OPEN
  PAID
  OVERDUE
  CANCELLED
}

enum CommunicationType {
  RECEIVED
  SENT
}
