organization.prisma 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. model AppSetting {
  2. id String @id @default(cuid())
  3. key String
  4. value String
  5. userId String
  6. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  7. organizationId String?
  8. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  9. @@unique([organizationId, key])
  10. @@index([organizationId])
  11. @@map("app_settings")
  12. }
  13. /// A user-defined dashboard card: a named, filtered table over one entity.
  14. /// The config shape (entity, filters, columns, limit) is validated against
  15. /// the field registry in customCardActions — nothing here reaches SQL raw.
  16. model DashboardWidget {
  17. id String @id @default(cuid())
  18. name String
  19. config Json
  20. userId String
  21. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  22. organizationId String
  23. createdAt DateTime @default(now())
  24. updatedAt DateTime @updatedAt
  25. @@index([userId, organizationId])
  26. @@map("dashboard_widgets")
  27. }
  28. model Organization {
  29. id String @id @default(cuid())
  30. name String
  31. portalSlug String? @unique
  32. createdAt DateTime @default(now())
  33. updatedAt DateTime @updatedAt
  34. members OrganizationMember[]
  35. roles Role[]
  36. vehicles Vehicle[]
  37. serviceRecords ServiceRecord[]
  38. reminders Reminder[]
  39. customers Customer[]
  40. quotes Quote[]
  41. inventoryParts InventoryPart[]
  42. laborPresets LaborPreset[]
  43. customFieldDefinitions CustomFieldDefinition[]
  44. settings AppSetting[]
  45. emailTemplates EmailTemplate[]
  46. subscription Subscription?
  47. invitations TeamInvitation[]
  48. inspectionTemplates InspectionTemplate[]
  49. conditionMarks ConditionMark[]
  50. conditionMarkTypes ConditionMarkType[]
  51. smsMessages SmsMessage[]
  52. telegramMessages TelegramMessage[]
  53. whatsappMessages WhatsappMessage[]
  54. technicians Technician[]
  55. workBays WorkBay[]
  56. timeEntries TimeEntry[]
  57. pushDevices PushDevice[]
  58. appSetupCodes TechnicianSetupCode[]
  59. scopedSessions Session[]
  60. technicianLoginCodes TechnicianLoginCode[]
  61. auditLogs AuditLog[]
  62. statusReports StatusReport[]
  63. reportSchedules ReportSchedule[]
  64. scheduledMessages ScheduledMessage[]
  65. webhooks Webhook[]
  66. stockMovements StockMovement[]
  67. tireWarehouses TireWarehouse[]
  68. tireLocations TireLocation[]
  69. tireSets TireSet[]
  70. workOrderStatuses WorkOrderStatus[]
  71. tireSetAttachments TireSetAttachment[]
  72. tireMovements TireMovement[]
  73. tireTreatments TireTreatment[]
  74. integrationConnections IntegrationConnection[]
  75. externalCalendarEvents ExternalCalendarEvent[]
  76. importBatches ImportBatch[]
  77. vehicleInspectionStatuses VehicleInspectionStatus[]
  78. inspectionReminderCampaigns InspectionReminderCampaign[]
  79. inspectionReminderSends InspectionReminderSend[]
  80. documentDesigns DocumentDesign[]
  81. documentDesignSnapshots DocumentDesignSnapshot[]
  82. documentAssetSnapshots DocumentAssetSnapshot[]
  83. @@map("organizations")
  84. }
  85. model OrganizationMember {
  86. id String @id @default(cuid())
  87. role String @default("member")
  88. userId String
  89. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  90. organizationId String
  91. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  92. roleId String?
  93. customRole Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
  94. signature MemberSignature?
  95. @@unique([userId, organizationId])
  96. @@map("organization_members")
  97. }
  98. /// A member's handwritten signature, drawn or uploaded in account settings,
  99. /// for the Signature section of the documents they issue.
  100. ///
  101. /// Kept per workshop rather than per person: a mechanic who works for two
  102. /// shops signs each one's paper, and leaving a workshop takes the signature
  103. /// with the membership. The image is held in the row (a PNG or JPEG of a few
  104. /// kilobytes) so a document can print it without the upload folder, and so
  105. /// replacing it never touches a file an issued invoice still needs; issued
  106. /// documents keep their own copy in DocumentAssetSnapshot.
  107. model MemberSignature {
  108. id String @id @default(cuid())
  109. memberId String @unique
  110. member OrganizationMember @relation(fields: [memberId], references: [id], onDelete: Cascade)
  111. mimeType String
  112. data Bytes
  113. createdAt DateTime @default(now())
  114. updatedAt DateTime @updatedAt
  115. @@map("member_signatures")
  116. }
  117. model Role {
  118. id String @id @default(cuid())
  119. name String
  120. isAdmin Boolean @default(false)
  121. createdAt DateTime @default(now())
  122. updatedAt DateTime @updatedAt
  123. organizationId String
  124. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  125. permissions Permission[]
  126. members OrganizationMember[]
  127. teamInvitations TeamInvitation[]
  128. @@unique([organizationId, name])
  129. @@map("roles")
  130. }
  131. model Permission {
  132. id String @id @default(cuid())
  133. action String
  134. subject String
  135. roleId String
  136. role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
  137. @@unique([roleId, action, subject])
  138. @@index([roleId])
  139. @@map("permissions")
  140. }
  141. model SystemSetting {
  142. id String @id @default(cuid())
  143. key String @unique
  144. value String
  145. @@map("system_settings")
  146. }
  147. model TeamInvitation {
  148. id String @id @default(cuid())
  149. email String
  150. role String @default("member")
  151. token String @unique
  152. status String @default("pending") // pending | accepted | cancelled
  153. expiresAt DateTime
  154. createdAt DateTime @default(now())
  155. organizationId String
  156. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  157. invitedById String
  158. roleId String?
  159. customRole Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
  160. @@unique([email, organizationId])
  161. @@index([token])
  162. @@map("team_invitations")
  163. }