schema.prisma 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. generator client {
  2. provider = "prisma-client-js"
  3. binaryTargets = ["native", "windows"]
  4. }
  5. datasource mysql {
  6. provider = "mysql"
  7. url = env("DATABASE_URL")
  8. }
  9. model Station {
  10. id Int @id @default(autoincrement())
  11. name String
  12. long Decimal?
  13. lat Decimal?
  14. address String?
  15. city String?
  16. country String?
  17. municipality String?
  18. description String?
  19. stationCompanies StationCompany[]
  20. trajetsDepartingFrom Trajet[] @relation("TrajetsDepartingFrom") // Ajout de la relation inverse
  21. trajetsArrivingAt Trajet[] @relation("TrajetsArrivingAt") // Ajout de la relation inverse
  22. }
  23. model Company {
  24. id Int @id @default(autoincrement())
  25. name String @unique
  26. address String
  27. managerId Int @unique
  28. manager User @relation("CompanyManager", fields: [managerId], references: [id])
  29. employees User[] @relation("CompanyEmployees")
  30. drivers Driver[] @relation("CompanyDrivers")
  31. stationCompanies StationCompany[]
  32. vehicules Vehicule[] @relation("CompanyVehicules")
  33. trajets Trajet[] @relation("CompanyTrajets") // Relation inverse avec Trajet
  34. }
  35. model StationCompany {
  36. id Int @id @default(autoincrement())
  37. stationId Int
  38. companyId Int
  39. stationChiefId Int
  40. company Company @relation(fields: [companyId], references: [id])
  41. stationChief User @relation("UserStationChief", fields: [stationChiefId], references: [id])
  42. station Station @relation(fields: [stationId], references: [id])
  43. @@unique([stationId, companyId])
  44. @@index([companyId], map: "StationCompany_companyId_fkey")
  45. @@index([stationChiefId], map: "StationCompany_stationChiefId_fkey")
  46. }
  47. model Driver {
  48. id Int @id @default(autoincrement())
  49. name String @unique
  50. address String
  51. telephone String
  52. companyId Int?
  53. userId Int @unique
  54. company Company? @relation("CompanyDrivers", fields: [companyId], references: [id])
  55. user User @relation("UserDriver", fields: [userId], references: [id])
  56. vehicules Vehicule[] @relation("DriverVehicules")
  57. @@index([companyId], map: "Driver_companyId_fkey")
  58. }
  59. model User {
  60. id Int @id @default(autoincrement())
  61. name String?
  62. otherName String?
  63. address String?
  64. telephone String?
  65. email String @unique
  66. password String
  67. role UserRole @default(USER)
  68. companyId Int? // Nouveau champ pour la relation employé-entreprise
  69. company Company? @relation("CompanyEmployees", fields: [companyId], references: [id])
  70. managedCompany Company? @relation("CompanyManager")
  71. driver Driver? @relation("UserDriver")
  72. reservations Reservation[] @relation("UserReservations")
  73. stationCompanies StationCompany[] @relation("UserStationChief")
  74. transactions Transaction[] @relation("UserTransactions")
  75. @@index([companyId], map: "User_companyId_fkey")
  76. }
  77. model Vehicule {
  78. id Int @id @default(autoincrement())
  79. number_places Int
  80. color String
  81. type String
  82. immatriculation String @unique
  83. model String
  84. companyId Int
  85. driverId Int?
  86. status VehiculeStatus @default(INACTIF)
  87. places Place[] @relation("VehiculePlaces")
  88. trajets Trajet[] @relation("VehiculeTrajets")
  89. company Company @relation("CompanyVehicules", fields: [companyId], references: [id])
  90. driver Driver? @relation("DriverVehicules", fields: [driverId], references: [id])
  91. @@index([companyId], map: "Vehicule_companyId_fkey")
  92. @@index([driverId], map: "Vehicule_driverId_fkey")
  93. }
  94. model Place {
  95. id Int @id @default(autoincrement())
  96. number Int
  97. vehiculeId Int
  98. isAvailable Boolean @default(true) // Indique si la place est disponible
  99. occupiedAt DateTime? // Date d'occupation si la place est occupée
  100. vehicule Vehicule @relation("VehiculePlaces", fields: [vehiculeId], references: [id])
  101. reservations Reservation[] @relation("PlaceReservations")
  102. @@index([vehiculeId], map: "Place_vehiculeId_fkey")
  103. }
  104. model Trajet {
  105. id Int @id @default(autoincrement())
  106. departAt DateTime
  107. arriveAt DateTime
  108. // depart String // Ancien champ
  109. // arrive String // Ancien champ
  110. departStationId Int // Nouveau champ pour l'ID de la station de départ
  111. arriveStationId Int // Nouveau champ pour l'ID de la station d'arrivée
  112. vehiculeId Int
  113. companyId Int? // Relation directe avec Company (optionnel temporairement)
  114. pricePerSeat Float @default(0.0) // Prix par place
  115. reservations Reservation[] @relation("TrajetReservations")
  116. vehicule Vehicule @relation("VehiculeTrajets", fields: [vehiculeId], references: [id])
  117. company Company? @relation("CompanyTrajets", fields: [companyId], references: [id]) // Relation directe avec Company
  118. departStation Station @relation("TrajetsDepartingFrom", fields: [departStationId], references: [id]) // Relation vers la station de départ
  119. arriveStation Station @relation("TrajetsArrivingAt", fields: [arriveStationId], references: [id]) // Relation vers la station d'arrivée
  120. @@index([vehiculeId], map: "Trajet_vehiculeId_fkey")
  121. @@index([companyId], map: "Trajet_companyId_fkey") // Index pour la relation avec Company
  122. @@index([departStationId], map: "Trajet_departStationId_fkey") // Index pour la nouvelle clé étrangère
  123. @@index([arriveStationId], map: "Trajet_arriveStationId_fkey") // Index pour la nouvelle clé étrangère
  124. }
  125. model Reservation {
  126. id Int @id @default(autoincrement())
  127. dateAt DateTime
  128. placeId Int
  129. userId Int
  130. trajetId Int
  131. qrcode Qrcode? @relation("ReservationQrcode")
  132. place Place @relation("PlaceReservations", fields: [placeId], references: [id])
  133. trajet Trajet @relation("TrajetReservations", fields: [trajetId], references: [id])
  134. user User @relation("UserReservations", fields: [userId], references: [id])
  135. transaction Transaction? @relation("ReservationTransaction")
  136. @@index([placeId], map: "Reservation_placeId_fkey")
  137. @@index([trajetId], map: "Reservation_trajetId_fkey")
  138. @@index([userId], map: "Reservation_userId_fkey")
  139. }
  140. model Transaction {
  141. id String @id @default(uuid())
  142. amount Float?
  143. currency String?
  144. status String?
  145. provider String?
  146. reference String?
  147. metadata Json?
  148. createdAt DateTime? @default(now())
  149. updatedAt DateTime? @updatedAt
  150. userId Int @unique
  151. reservationId Int @unique
  152. reservation Reservation @relation("ReservationTransaction", fields: [reservationId], references: [id])
  153. user User @relation("UserTransactions", fields: [userId], references: [id])
  154. @@index([userId], map: "Transaction_userId_fkey")
  155. }
  156. model Qrcode {
  157. id String @id @default(uuid())
  158. reservationId Int @unique
  159. createdAt DateTime @default(now())
  160. scannedAt DateTime?
  161. value String
  162. reservation Reservation @relation("ReservationQrcode", fields: [reservationId], references: [id])
  163. }
  164. enum UserRole {
  165. USER
  166. ADMIN
  167. DRIVER
  168. MANAGER
  169. EMPLOYEE
  170. }
  171. enum VehiculeStatus {
  172. ACTIF
  173. INACTIF
  174. MAINTENANCE
  175. }