schema.prisma 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. generator client {
  2. provider = "prisma-client-js"
  3. }
  4. datasource db {
  5. provider = "postgresql"
  6. url = env("DATABASE_URL")
  7. }
  8. model User {
  9. id String @id @default(cuid())
  10. name String
  11. email String @unique
  12. emailVerified Boolean @default(false)
  13. image String?
  14. isSuperAdmin Boolean @default(false)
  15. createdAt DateTime @default(now())
  16. updatedAt DateTime @updatedAt
  17. twoFactorEnabled Boolean @default(false)
  18. termsAcceptedAt DateTime?
  19. lastLogin DateTime?
  20. lastSeen DateTime?
  21. sessions Session[]
  22. accounts Account[]
  23. vehicles Vehicle[]
  24. customers Customer[]
  25. settings AppSetting[]
  26. inventoryParts InventoryPart[]
  27. quotes Quote[]
  28. customFieldDefinitions CustomFieldDefinition[]
  29. twoFactor TwoFactor?
  30. organizationMembers OrganizationMember[]
  31. @@map("users")
  32. }
  33. model AppSetting {
  34. id String @id @default(cuid())
  35. key String
  36. value String
  37. userId String
  38. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  39. organizationId String?
  40. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  41. @@unique([organizationId, key])
  42. @@index([organizationId])
  43. @@map("app_settings")
  44. }
  45. model Session {
  46. id String @id @default(cuid())
  47. expiresAt DateTime
  48. token String @unique
  49. createdAt DateTime @default(now())
  50. updatedAt DateTime @updatedAt
  51. ipAddress String?
  52. userAgent String?
  53. userId String
  54. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  55. @@index([userId])
  56. @@map("sessions")
  57. }
  58. model Account {
  59. id String @id @default(cuid())
  60. accountId String
  61. providerId String
  62. userId String
  63. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  64. accessToken String?
  65. refreshToken String?
  66. idToken String?
  67. accessTokenExpiresAt DateTime?
  68. refreshTokenExpiresAt DateTime?
  69. scope String?
  70. password String?
  71. createdAt DateTime @default(now())
  72. updatedAt DateTime @updatedAt
  73. @@index([userId])
  74. @@map("accounts")
  75. }
  76. model Verification {
  77. id String @id @default(cuid())
  78. identifier String
  79. value String
  80. expiresAt DateTime
  81. createdAt DateTime? @default(now())
  82. updatedAt DateTime? @updatedAt
  83. @@map("verifications")
  84. }
  85. model TwoFactor {
  86. id String @id @default(cuid())
  87. secret String
  88. backupCodes String
  89. userId String @unique
  90. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  91. @@map("two_factor")
  92. }
  93. model Vehicle {
  94. id String @id @default(cuid())
  95. make String
  96. model String
  97. year Int
  98. vin String?
  99. licensePlate String?
  100. color String?
  101. mileage Int @default(0)
  102. fuelType String? @default("gasoline")
  103. transmission String? @default("automatic")
  104. engineSize String?
  105. purchaseDate DateTime?
  106. purchasePrice Float?
  107. imageUrl String?
  108. isArchived Boolean @default(false)
  109. archiveReason String?
  110. maintenanceDismissed Boolean @default(false)
  111. maintenanceDismissedAt DateTime?
  112. createdAt DateTime @default(now())
  113. updatedAt DateTime @updatedAt
  114. userId String
  115. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  116. organizationId String?
  117. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  118. customerId String?
  119. customer Customer? @relation(fields: [customerId], references: [id], onDelete: SetNull)
  120. serviceRecords ServiceRecord[]
  121. notes Note[]
  122. fuelLogs FuelLog[]
  123. reminders Reminder[]
  124. quotes Quote[]
  125. recurringInvoices RecurringInvoice[]
  126. inspections Inspection[]
  127. @@index([organizationId])
  128. @@map("vehicles")
  129. }
  130. model ServiceRecord {
  131. id String @id @default(cuid())
  132. title String
  133. description String?
  134. type String @default("maintenance")
  135. status String @default("completed")
  136. cost Float @default(0)
  137. mileage Int?
  138. serviceDate DateTime @default(now())
  139. shopName String?
  140. techName String?
  141. parts String?
  142. laborHours Float?
  143. diagnosticNotes String?
  144. invoiceNotes String?
  145. subtotal Float @default(0)
  146. taxRate Float @default(0)
  147. taxAmount Float @default(0)
  148. totalAmount Float @default(0)
  149. invoiceNumber String?
  150. discountType String?
  151. discountValue Float @default(0)
  152. discountAmount Float @default(0)
  153. manuallyPaid Boolean @default(false)
  154. publicToken String? @unique
  155. createdAt DateTime @default(now())
  156. updatedAt DateTime @updatedAt
  157. vehicleId String
  158. vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade)
  159. partItems ServicePart[]
  160. laborItems ServiceLabor[]
  161. attachments ServiceAttachment[]
  162. payments Payment[]
  163. @@index([vehicleId])
  164. @@map("service_records")
  165. }
  166. model Note {
  167. id String @id @default(cuid())
  168. title String
  169. content String
  170. isPinned Boolean @default(false)
  171. createdAt DateTime @default(now())
  172. updatedAt DateTime @updatedAt
  173. vehicleId String
  174. vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade)
  175. @@index([vehicleId])
  176. @@map("notes")
  177. }
  178. model FuelLog {
  179. id String @id @default(cuid())
  180. date DateTime @default(now())
  181. mileage Int
  182. gallons Float
  183. pricePerGallon Float
  184. totalCost Float
  185. isFillUp Boolean @default(true)
  186. station String?
  187. notes String?
  188. createdAt DateTime @default(now())
  189. updatedAt DateTime @updatedAt
  190. vehicleId String
  191. vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade)
  192. @@index([vehicleId])
  193. @@map("fuel_logs")
  194. }
  195. model Reminder {
  196. id String @id @default(cuid())
  197. title String
  198. description String?
  199. dueDate DateTime?
  200. dueMileage Int?
  201. isCompleted Boolean @default(false)
  202. createdAt DateTime @default(now())
  203. updatedAt DateTime @updatedAt
  204. vehicleId String
  205. vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade)
  206. @@index([vehicleId])
  207. @@map("reminders")
  208. }
  209. model Customer {
  210. id String @id @default(cuid())
  211. name String
  212. email String?
  213. phone String?
  214. address String?
  215. company String?
  216. notes String?
  217. createdAt DateTime @default(now())
  218. updatedAt DateTime @updatedAt
  219. userId String
  220. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  221. organizationId String?
  222. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  223. vehicles Vehicle[]
  224. quotes Quote[]
  225. smsMessages SmsMessage[]
  226. @@index([organizationId])
  227. @@map("customers")
  228. }
  229. model Payment {
  230. id String @id @default(cuid())
  231. amount Float
  232. date DateTime @default(now())
  233. method String @default("other")
  234. note String?
  235. provider String?
  236. externalId String?
  237. createdAt DateTime @default(now())
  238. updatedAt DateTime @updatedAt
  239. serviceRecordId String
  240. serviceRecord ServiceRecord @relation(fields: [serviceRecordId], references: [id], onDelete: Cascade)
  241. @@index([serviceRecordId])
  242. @@map("payments")
  243. }
  244. model ServiceAttachment {
  245. id String @id @default(cuid())
  246. fileName String
  247. fileUrl String
  248. fileType String
  249. fileSize Int
  250. category String @default("diagnostic")
  251. description String?
  252. includeInInvoice Boolean @default(true)
  253. createdAt DateTime @default(now())
  254. serviceRecordId String
  255. serviceRecord ServiceRecord @relation(fields: [serviceRecordId], references: [id], onDelete: Cascade)
  256. @@index([serviceRecordId])
  257. @@map("service_attachments")
  258. }
  259. model ServicePart {
  260. id String @id @default(cuid())
  261. partNumber String?
  262. name String
  263. quantity Float @default(1)
  264. unitPrice Float @default(0)
  265. total Float @default(0)
  266. serviceRecordId String
  267. serviceRecord ServiceRecord @relation(fields: [serviceRecordId], references: [id], onDelete: Cascade)
  268. @@index([serviceRecordId])
  269. @@map("service_parts")
  270. }
  271. model ServiceLabor {
  272. id String @id @default(cuid())
  273. description String
  274. hours Float @default(0)
  275. rate Float @default(0)
  276. total Float @default(0)
  277. serviceRecordId String
  278. serviceRecord ServiceRecord @relation(fields: [serviceRecordId], references: [id], onDelete: Cascade)
  279. @@index([serviceRecordId])
  280. @@map("service_labor")
  281. }
  282. model InventoryPart {
  283. id String @id @default(cuid())
  284. partNumber String?
  285. name String
  286. description String?
  287. category String?
  288. quantity Int @default(0)
  289. minQuantity Int @default(0)
  290. unitCost Float @default(0)
  291. sellPrice Float @default(0)
  292. supplier String?
  293. supplierPhone String?
  294. supplierEmail String?
  295. supplierUrl String?
  296. imageUrl String?
  297. location String?
  298. isArchived Boolean @default(false)
  299. createdAt DateTime @default(now())
  300. updatedAt DateTime @updatedAt
  301. userId String
  302. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  303. organizationId String?
  304. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  305. @@index([organizationId])
  306. @@map("inventory_parts")
  307. }
  308. model Quote {
  309. id String @id @default(cuid())
  310. quoteNumber String?
  311. title String
  312. description String?
  313. status String @default("draft")
  314. validUntil DateTime?
  315. subtotal Float @default(0)
  316. taxRate Float @default(0)
  317. taxAmount Float @default(0)
  318. discountType String?
  319. discountValue Float @default(0)
  320. discountAmount Float @default(0)
  321. totalAmount Float @default(0)
  322. notes String?
  323. publicToken String?
  324. customerMessage String?
  325. convertedToId String?
  326. createdAt DateTime @default(now())
  327. updatedAt DateTime @updatedAt
  328. userId String
  329. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  330. organizationId String?
  331. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  332. customerId String?
  333. customer Customer? @relation(fields: [customerId], references: [id], onDelete: SetNull)
  334. vehicleId String?
  335. vehicle Vehicle? @relation(fields: [vehicleId], references: [id], onDelete: SetNull)
  336. inspectionId String?
  337. inspection Inspection? @relation(fields: [inspectionId], references: [id], onDelete: SetNull)
  338. partItems QuotePart[]
  339. laborItems QuoteLabor[]
  340. @@index([organizationId])
  341. @@map("quotes")
  342. }
  343. model QuotePart {
  344. id String @id @default(cuid())
  345. partNumber String?
  346. name String
  347. quantity Float @default(1)
  348. unitPrice Float @default(0)
  349. total Float @default(0)
  350. quoteId String
  351. quote Quote @relation(fields: [quoteId], references: [id], onDelete: Cascade)
  352. @@index([quoteId])
  353. @@map("quote_parts")
  354. }
  355. model QuoteLabor {
  356. id String @id @default(cuid())
  357. description String
  358. hours Float @default(0)
  359. rate Float @default(0)
  360. total Float @default(0)
  361. quoteId String
  362. quote Quote @relation(fields: [quoteId], references: [id], onDelete: Cascade)
  363. @@index([quoteId])
  364. @@map("quote_labor")
  365. }
  366. model CustomFieldDefinition {
  367. id String @id @default(cuid())
  368. name String
  369. label String
  370. fieldType String @default("text")
  371. options String?
  372. required Boolean @default(false)
  373. entityType String
  374. sortOrder Int @default(0)
  375. isActive Boolean @default(true)
  376. createdAt DateTime @default(now())
  377. updatedAt DateTime @updatedAt
  378. userId String
  379. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  380. organizationId String?
  381. organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  382. values CustomFieldValue[]
  383. @@unique([organizationId, name, entityType])
  384. @@index([organizationId])
  385. @@map("custom_field_definitions")
  386. }
  387. model CustomFieldValue {
  388. id String @id @default(cuid())
  389. value String
  390. entityId String
  391. entityType String
  392. fieldId String
  393. field CustomFieldDefinition @relation(fields: [fieldId], references: [id], onDelete: Cascade)
  394. @@unique([fieldId, entityId])
  395. @@index([fieldId])
  396. @@map("custom_field_values")
  397. }
  398. model Organization {
  399. id String @id @default(cuid())
  400. name String
  401. createdAt DateTime @default(now())
  402. updatedAt DateTime @updatedAt
  403. members OrganizationMember[]
  404. roles Role[]
  405. vehicles Vehicle[]
  406. customers Customer[]
  407. quotes Quote[]
  408. inventoryParts InventoryPart[]
  409. customFieldDefinitions CustomFieldDefinition[]
  410. settings AppSetting[]
  411. subscription Subscription?
  412. invitations TeamInvitation[]
  413. inspectionTemplates InspectionTemplate[]
  414. smsMessages SmsMessage[]
  415. @@map("organizations")
  416. }
  417. model OrganizationMember {
  418. id String @id @default(cuid())
  419. role String @default("member")
  420. userId String
  421. user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  422. organizationId String
  423. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  424. roleId String?
  425. customRole Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
  426. @@unique([userId, organizationId])
  427. @@map("organization_members")
  428. }
  429. model Role {
  430. id String @id @default(cuid())
  431. name String
  432. isAdmin Boolean @default(false)
  433. createdAt DateTime @default(now())
  434. updatedAt DateTime @updatedAt
  435. organizationId String
  436. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  437. permissions Permission[]
  438. members OrganizationMember[]
  439. teamInvitations TeamInvitation[]
  440. @@unique([organizationId, name])
  441. @@map("roles")
  442. }
  443. model Permission {
  444. id String @id @default(cuid())
  445. action String
  446. subject String
  447. roleId String
  448. role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
  449. @@unique([roleId, action, subject])
  450. @@index([roleId])
  451. @@map("permissions")
  452. }
  453. model SystemSetting {
  454. id String @id @default(cuid())
  455. key String @unique
  456. value String
  457. @@map("system_settings")
  458. }
  459. model TeamInvitation {
  460. id String @id @default(cuid())
  461. email String
  462. role String @default("member")
  463. token String @unique
  464. status String @default("pending") // pending | accepted | cancelled
  465. expiresAt DateTime
  466. createdAt DateTime @default(now())
  467. organizationId String
  468. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  469. invitedById String
  470. roleId String?
  471. customRole Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
  472. @@unique([email, organizationId])
  473. @@index([token])
  474. @@map("team_invitations")
  475. }
  476. // Stripe-ready models (implementation in follow-up)
  477. model SubscriptionPlan {
  478. id String @id @default(cuid())
  479. name String
  480. stripePriceId String? @unique
  481. price Float @default(0)
  482. interval String @default("month") // "month" | "year"
  483. maxMembers Int @default(1)
  484. features String? // JSON feature flags
  485. isActive Boolean @default(true)
  486. createdAt DateTime @default(now())
  487. updatedAt DateTime @updatedAt
  488. subscriptions Subscription[]
  489. @@map("subscription_plans")
  490. }
  491. model Subscription {
  492. id String @id @default(cuid())
  493. status String @default("active") // active | canceled | past_due | trialing
  494. stripeSubscriptionId String? @unique
  495. stripeCustomerId String?
  496. currentPeriodStart DateTime?
  497. currentPeriodEnd DateTime?
  498. cancelAtPeriodEnd Boolean @default(false)
  499. createdAt DateTime @default(now())
  500. updatedAt DateTime @updatedAt
  501. organizationId String @unique
  502. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  503. planId String
  504. plan SubscriptionPlan @relation(fields: [planId], references: [id])
  505. @@map("subscriptions")
  506. }
  507. model RecurringInvoice {
  508. id String @id @default(cuid())
  509. title String
  510. description String?
  511. frequency String // "weekly" | "biweekly" | "monthly" | "quarterly" | "yearly"
  512. nextRunDate DateTime
  513. endDate DateTime?
  514. isActive Boolean @default(true)
  515. lastRunAt DateTime?
  516. runCount Int @default(0)
  517. // Template fields (copied to ServiceRecord on generation)
  518. type String @default("maintenance")
  519. cost Float @default(0)
  520. taxRate Float @default(0)
  521. invoiceNotes String?
  522. vehicleId String
  523. vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade)
  524. createdAt DateTime @default(now())
  525. updatedAt DateTime @updatedAt
  526. templateParts RecurringPart[]
  527. templateLabor RecurringLabor[]
  528. @@index([vehicleId])
  529. @@index([nextRunDate, isActive])
  530. @@map("recurring_invoices")
  531. }
  532. model RecurringPart {
  533. id String @id @default(cuid())
  534. name String
  535. partNumber String?
  536. quantity Int @default(1)
  537. unitPrice Float @default(0)
  538. recurringInvoiceId String
  539. recurringInvoice RecurringInvoice @relation(fields: [recurringInvoiceId], references: [id], onDelete: Cascade)
  540. @@map("recurring_parts")
  541. }
  542. model RecurringLabor {
  543. id String @id @default(cuid())
  544. description String
  545. hours Float @default(0)
  546. rate Float @default(0)
  547. recurringInvoiceId String
  548. recurringInvoice RecurringInvoice @relation(fields: [recurringInvoiceId], references: [id], onDelete: Cascade)
  549. @@map("recurring_labor")
  550. }
  551. model InspectionTemplate {
  552. id String @id @default(cuid())
  553. name String
  554. description String?
  555. isDefault Boolean @default(false)
  556. createdAt DateTime @default(now())
  557. updatedAt DateTime @updatedAt
  558. organizationId String
  559. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  560. sections InspectionTemplateSection[]
  561. inspections Inspection[]
  562. @@index([organizationId])
  563. @@map("inspection_templates")
  564. }
  565. model InspectionTemplateSection {
  566. id String @id @default(cuid())
  567. name String
  568. sortOrder Int @default(0)
  569. templateId String
  570. template InspectionTemplate @relation(fields: [templateId], references: [id], onDelete: Cascade)
  571. items InspectionTemplateItem[]
  572. @@index([templateId])
  573. @@map("inspection_template_sections")
  574. }
  575. model InspectionTemplateItem {
  576. id String @id @default(cuid())
  577. name String
  578. sortOrder Int @default(0)
  579. sectionId String
  580. section InspectionTemplateSection @relation(fields: [sectionId], references: [id], onDelete: Cascade)
  581. @@index([sectionId])
  582. @@map("inspection_template_items")
  583. }
  584. model Inspection {
  585. id String @id @default(cuid())
  586. status String @default("in_progress")
  587. mileage Int?
  588. notes String?
  589. publicToken String? @unique
  590. completedAt DateTime?
  591. createdAt DateTime @default(now())
  592. updatedAt DateTime @updatedAt
  593. vehicleId String
  594. vehicle Vehicle @relation(fields: [vehicleId], references: [id], onDelete: Cascade)
  595. templateId String
  596. template InspectionTemplate @relation(fields: [templateId], references: [id])
  597. technicianId String
  598. organizationId String
  599. items InspectionItem[]
  600. quoteRequests InspectionQuoteRequest[]
  601. quotes Quote[]
  602. @@index([vehicleId])
  603. @@index([organizationId])
  604. @@map("inspections")
  605. }
  606. model InspectionItem {
  607. id String @id @default(cuid())
  608. name String
  609. section String
  610. sortOrder Int @default(0)
  611. condition String @default("not_inspected")
  612. notes String?
  613. imageUrls String[] @default([])
  614. inspectionId String
  615. inspection Inspection @relation(fields: [inspectionId], references: [id], onDelete: Cascade)
  616. @@index([inspectionId])
  617. @@map("inspection_items")
  618. }
  619. model InspectionQuoteRequest {
  620. id String @id @default(cuid())
  621. status String @default("pending")
  622. message String?
  623. selectedItemIds String[]
  624. createdAt DateTime @default(now())
  625. inspectionId String
  626. inspection Inspection @relation(fields: [inspectionId], references: [id], onDelete: Cascade)
  627. organizationId String
  628. @@index([organizationId])
  629. @@index([inspectionId])
  630. @@map("inspection_quote_requests")
  631. }
  632. model Notification {
  633. id String @id @default(cuid())
  634. type String
  635. title String
  636. message String
  637. entityType String
  638. entityId String
  639. entityUrl String
  640. read Boolean @default(false)
  641. organizationId String
  642. createdAt DateTime @default(now())
  643. @@index([organizationId, createdAt(sort: Desc)])
  644. @@index([organizationId, read])
  645. @@map("notifications")
  646. }
  647. model SmsMessage {
  648. id String @id @default(cuid())
  649. direction String // "inbound" | "outbound"
  650. fromNumber String
  651. toNumber String
  652. body String
  653. status String @default("queued") // queued | sent | delivered | failed | received
  654. providerMsgId String?
  655. errorMessage String?
  656. relatedEntityType String?
  657. relatedEntityId String?
  658. createdAt DateTime @default(now())
  659. updatedAt DateTime @updatedAt
  660. organizationId String
  661. organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  662. customerId String?
  663. customer Customer? @relation(fields: [customerId], references: [id], onDelete: SetNull)
  664. @@index([organizationId, customerId, createdAt(sort: Desc)])
  665. @@index([organizationId, createdAt(sort: Desc)])
  666. @@index([toNumber, organizationId])
  667. @@map("sms_messages")
  668. }