organization.prisma 6.4 KB

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