4
0

organization.prisma 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. smsMessages SmsMessage[]
  51. telegramMessages TelegramMessage[]
  52. whatsappMessages WhatsappMessage[]
  53. technicians Technician[]
  54. workBays WorkBay[]
  55. timeEntries TimeEntry[]
  56. pushDevices PushDevice[]
  57. appSetupCodes TechnicianSetupCode[]
  58. technicianLoginCodes TechnicianLoginCode[]
  59. auditLogs AuditLog[]
  60. statusReports StatusReport[]
  61. reportSchedules ReportSchedule[]
  62. scheduledMessages ScheduledMessage[]
  63. webhooks Webhook[]
  64. stockMovements StockMovement[]
  65. tireWarehouses TireWarehouse[]
  66. tireLocations TireLocation[]
  67. tireSets TireSet[]
  68. workOrderStatuses WorkOrderStatus[]
  69. tireSetAttachments TireSetAttachment[]
  70. tireMovements TireMovement[]
  71. tireTreatments TireTreatment[]
  72. integrationConnections IntegrationConnection[]
  73. externalCalendarEvents ExternalCalendarEvent[]
  74. importBatches ImportBatch[]
  75. vehicleInspectionStatuses VehicleInspectionStatus[]
  76. inspectionReminderCampaigns InspectionReminderCampaign[]
  77. inspectionReminderSends InspectionReminderSend[]
  78. documentDesigns DocumentDesign[]
  79. documentDesignSnapshots DocumentDesignSnapshot[]
  80. documentAssetSnapshots DocumentAssetSnapshot[]
  81. @@map("organizations")
  82. }
  83. model OrganizationMember {
  84. id String @id @default(cuid())
  85. role String @default("member")
  86. userId String
  87. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  88. organizationId String
  89. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  90. roleId String?
  91. customRole Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
  92. signature MemberSignature?
  93. @@unique([userId, organizationId])
  94. @@map("organization_members")
  95. }
  96. /// A member's handwritten signature, drawn or uploaded in account settings,
  97. /// for the Signature section of the documents they issue.
  98. ///
  99. /// Kept per workshop rather than per person: a mechanic who works for two
  100. /// shops signs each one's paper, and leaving a workshop takes the signature
  101. /// with the membership. The image is held in the row (a PNG or JPEG of a few
  102. /// kilobytes) so a document can print it without the upload folder, and so
  103. /// replacing it never touches a file an issued invoice still needs; issued
  104. /// documents keep their own copy in DocumentAssetSnapshot.
  105. model MemberSignature {
  106. id String @id @default(cuid())
  107. memberId String @unique
  108. member OrganizationMember @relation(fields: [memberId], references: [id], onDelete: Cascade)
  109. mimeType String
  110. data Bytes
  111. createdAt DateTime @default(now())
  112. updatedAt DateTime @updatedAt
  113. @@map("member_signatures")
  114. }
  115. model Role {
  116. id String @id @default(cuid())
  117. name String
  118. isAdmin Boolean @default(false)
  119. createdAt DateTime @default(now())
  120. updatedAt DateTime @updatedAt
  121. organizationId String
  122. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  123. permissions Permission[]
  124. members OrganizationMember[]
  125. teamInvitations TeamInvitation[]
  126. @@unique([organizationId, name])
  127. @@map("roles")
  128. }
  129. model Permission {
  130. id String @id @default(cuid())
  131. action String
  132. subject String
  133. roleId String
  134. role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
  135. @@unique([roleId, action, subject])
  136. @@index([roleId])
  137. @@map("permissions")
  138. }
  139. model SystemSetting {
  140. id String @id @default(cuid())
  141. key String @unique
  142. value String
  143. @@map("system_settings")
  144. }
  145. model TeamInvitation {
  146. id String @id @default(cuid())
  147. email String
  148. role String @default("member")
  149. token String @unique
  150. status String @default("pending") // pending | accepted | cancelled
  151. expiresAt DateTime
  152. createdAt DateTime @default(now())
  153. organizationId String
  154. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  155. invitedById String
  156. roleId String?
  157. customRole Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
  158. @@unique([email, organizationId])
  159. @@index([token])
  160. @@map("team_invitations")
  161. }