// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" url = env("DATABASE_URL") } model User { id String @id @default(cuid()) email String @unique password String name String? roleId String? role Role? @relation(fields: [roleId], references: [id], onDelete: SetNull) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt conversations ConversationParticipant[] sentMessages Message[] notifications Notification[] } model Role { id String @id @default(cuid()) name String @unique description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt users User[] permissions RolePermission[] } model Permission { id String @id @default(cuid()) name String @unique description String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt roles RolePermission[] } model RolePermission { id String @id @default(cuid()) roleId String role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) permissionId String permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) @@unique([roleId, permissionId]) @@index([roleId]) @@index([permissionId]) } model Chauffeur { id String @id @default(cuid()) nom String prenom String dateNaissance DateTime telephone String email String adresse String heuresContrat Int @default(35) // Nombre d'heures dans le contrat (ex: 35h) dateDebutContrat DateTime // Date de début du contrat dateFinContrat DateTime? // Date de fin du contrat (modifiable à tout moment, peut être null) heuresRestantes Int @default(35) // Heures restantes (calculé/géré séparément) status String @default("Disponible") // Disponible, Vacances, Arrêt Maladie createdAt DateTime @default(now()) updatedAt DateTime @updatedAt trajets Trajet[] // Relation avec les trajets } model UniversPro { id String @id @default(cuid()) nom String prenom String telephone String email String adresse String // Adresse de résidence nomEntreprise String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Adherent { id String @id @default(cuid()) nom String prenom String dateNaissance DateTime adresse String // Adresse de résidence email String telephone String // Informations complémentaires situation String? // Sélecteur à option prescripteur String? // Sélecteur à option facturation String? // Sélecteur à option forfait String? // Sélecteur à option (formule avec prix par trajet) commentaire String? // Texte libre telephoneSecondaire String? // Téléphone secondaire instructions String? // Instructions createdAt DateTime @default(now()) updatedAt DateTime @updatedAt trajets Trajet[] // Relation avec les trajets } model Trajet { id String @id @default(cuid()) date DateTime // Date et heure du trajet adresseDepart String // Adresse de départ adresseArrivee String // Adresse d'arrivée commentaire String? // Commentaire optionnel instructions String? // Instructions pour le trajet statut String @default("Planifié") // Planifié, En cours, Terminé, Annulé, Validé archived Boolean @default(false) // Indique si le trajet est archivé adherentId String // Référence à l'adhérent adherent Adherent @relation(fields: [adherentId], references: [id]) chauffeurId String? // Référence au chauffeur (optionnel) chauffeur Chauffeur? @relation(fields: [chauffeurId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Conversation { id String @id @default(cuid()) name String? // Nom pour les groupes (null pour les conversations individuelles) type String @default("direct") // "direct" ou "group" createdAt DateTime @default(now()) updatedAt DateTime @updatedAt participants ConversationParticipant[] messages Message[] } model ConversationParticipant { id String @id @default(cuid()) conversationId String conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) joinedAt DateTime @default(now()) lastReadAt DateTime? // Dernière fois que l'utilisateur a lu les messages createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([conversationId, userId]) @@index([userId]) @@index([conversationId]) } model Message { id String @id @default(cuid()) conversationId String conversation Conversation @relation(fields: [conversationId], references: [id], onDelete: Cascade) senderId String sender User @relation(fields: [senderId], references: [id]) content String? // Contenu textuel du message (peut être null si seulement des fichiers) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt files MessageFile[] @@index([conversationId, createdAt]) @@index([senderId]) } model MessageFile { id String @id @default(cuid()) messageId String message Message @relation(fields: [messageId], references: [id], onDelete: Cascade) filename String // Nom original du fichier filepath String // Chemin de stockage du fichier fileType String // Type MIME du fichier fileSize Int // Taille en bytes createdAt DateTime @default(now()) @@index([messageId]) } model AdherentOption { id String @id @default(cuid()) type String // "situation", "prescripteur", "facturation", "forfait" value String // La valeur de l'option order Int @default(0) // Ordre d'affichage createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([type, value]) @@index([type]) } model Notification { id String @id @default(cuid()) userId String // Utilisateur destinataire de la notification user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // "message", "trajet_created", "trajet_cancelled", "trajet_completed" title String // Titre de la notification message String // Message de la notification read Boolean @default(false) // Indique si la notification a été lue link String? // Lien optionnel vers la ressource (ex: /dashboard/messagerie, /dashboard/calendrier) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId, read]) @@index([userId, createdAt]) }