procbay-schema 1.0.171 → 1.0.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/package.json +13 -22
  2. package/prisma/schema.prisma +4 -5
  3. package/scripts/sync-schemas.js +1 -5
  4. package/src/create-prisma-client.js +9 -49
  5. package/src/prisma/client.d.ts +1 -0
  6. package/src/prisma/client.js +4 -0
  7. package/src/prisma/default.d.ts +1 -0
  8. package/src/prisma/default.js +4 -0
  9. package/src/prisma/edge.d.ts +1 -0
  10. package/src/prisma/edge.js +2900 -0
  11. package/src/{generated/prisma/internal/prismaNamespaceBrowser.ts → prisma/index-browser.js} +980 -739
  12. package/src/prisma/index.d.ts +286683 -0
  13. package/src/prisma/index.js +2929 -2
  14. package/src/prisma/libquery_engine-darwin.dylib.node +0 -0
  15. package/src/prisma/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  16. package/src/prisma/package.json +140 -0
  17. package/src/prisma/query_engine-windows.dll.node +0 -0
  18. package/src/prisma/runtime/edge-esm.js +34 -0
  19. package/src/prisma/runtime/edge.js +34 -0
  20. package/src/prisma/runtime/index-browser.d.ts +370 -0
  21. package/src/prisma/runtime/index-browser.js +16 -0
  22. package/src/prisma/runtime/library.d.ts +3647 -0
  23. package/src/prisma/runtime/library.js +146 -0
  24. package/src/prisma/runtime/react-native.js +83 -0
  25. package/src/prisma/runtime/wasm.js +35 -0
  26. package/src/prisma/schema.prisma +3820 -0
  27. package/src/prisma/wasm.d.ts +1 -0
  28. package/src/prisma/wasm.js +2862 -0
  29. package/prisma.config.js +0 -19
  30. package/src/generated/prisma/browser.ts +0 -574
  31. package/src/generated/prisma/client.bundle.mjs +0 -6733
  32. package/src/generated/prisma/client.ts +0 -598
  33. package/src/generated/prisma/commonInputTypes.ts +0 -2911
  34. package/src/generated/prisma/enums.ts +0 -730
  35. package/src/generated/prisma/internal/class.ts +0 -1304
  36. package/src/generated/prisma/internal/prismaNamespace.ts +0 -12506
  37. package/src/generated/prisma/models/ActivityLog.ts +0 -1590
  38. package/src/generated/prisma/models/AdminAlert.ts +0 -1547
  39. package/src/generated/prisma/models/ApprovalCondition.ts +0 -2085
  40. package/src/generated/prisma/models/ApprovalDelegation.ts +0 -3057
  41. package/src/generated/prisma/models/ApprovalDelegationDelegate.ts +0 -1784
  42. package/src/generated/prisma/models/ApprovalHierarchy.ts +0 -3083
  43. package/src/generated/prisma/models/ApprovalJourney.ts +0 -2867
  44. package/src/generated/prisma/models/ApprovalLevel.ts +0 -2335
  45. package/src/generated/prisma/models/ApprovalLevelEscalation.ts +0 -2128
  46. package/src/generated/prisma/models/ApprovalLevelEscalationUser.ts +0 -1863
  47. package/src/generated/prisma/models/ApprovalLevelUser.ts +0 -1863
  48. package/src/generated/prisma/models/ApprovalManagement.ts +0 -1728
  49. package/src/generated/prisma/models/Attribute.ts +0 -2075
  50. package/src/generated/prisma/models/AttributeValue.ts +0 -1882
  51. package/src/generated/prisma/models/Bid.ts +0 -2719
  52. package/src/generated/prisma/models/BidLog.ts +0 -3560
  53. package/src/generated/prisma/models/BlanketPurchaseOrder.ts +0 -3527
  54. package/src/generated/prisma/models/BlanketPurchaseOrderItem.ts +0 -2532
  55. package/src/generated/prisma/models/BlanketPurchaseOrderRelease.ts +0 -2713
  56. package/src/generated/prisma/models/BoqEventItem.ts +0 -4056
  57. package/src/generated/prisma/models/Budget.ts +0 -1954
  58. package/src/generated/prisma/models/BudgetHold.ts +0 -1904
  59. package/src/generated/prisma/models/BusinessEntity.ts +0 -3901
  60. package/src/generated/prisma/models/BusinessEntityDepartment.ts +0 -2032
  61. package/src/generated/prisma/models/BusinessEntityLocation.ts +0 -1567
  62. package/src/generated/prisma/models/Catalogue.ts +0 -2081
  63. package/src/generated/prisma/models/CatalogueCart.ts +0 -2305
  64. package/src/generated/prisma/models/CatalogueVendor.ts +0 -2252
  65. package/src/generated/prisma/models/Category.ts +0 -3091
  66. package/src/generated/prisma/models/CategoryBudget.ts +0 -2690
  67. package/src/generated/prisma/models/City.ts +0 -2180
  68. package/src/generated/prisma/models/Cms.ts +0 -1492
  69. package/src/generated/prisma/models/ContactUs.ts +0 -1654
  70. package/src/generated/prisma/models/Conversation.ts +0 -2389
  71. package/src/generated/prisma/models/ConversationParticipant.ts +0 -1833
  72. package/src/generated/prisma/models/CounterOffer.ts +0 -2156
  73. package/src/generated/prisma/models/Country.ts +0 -3394
  74. package/src/generated/prisma/models/Currency.ts +0 -1642
  75. package/src/generated/prisma/models/CustomerNotification.ts +0 -1653
  76. package/src/generated/prisma/models/Department.ts +0 -2372
  77. package/src/generated/prisma/models/DepartmentBudget.ts +0 -2494
  78. package/src/generated/prisma/models/DynamicForm.ts +0 -2021
  79. package/src/generated/prisma/models/EmailTemplate.ts +0 -1516
  80. package/src/generated/prisma/models/Event.ts +0 -6819
  81. package/src/generated/prisma/models/EventConfigurations.ts +0 -1736
  82. package/src/generated/prisma/models/EventCriteria.ts +0 -2134
  83. package/src/generated/prisma/models/EventItems.ts +0 -2821
  84. package/src/generated/prisma/models/EventRfiForm.ts +0 -2020
  85. package/src/generated/prisma/models/EventRfiFormLog.ts +0 -2608
  86. package/src/generated/prisma/models/EventStrategies.ts +0 -1857
  87. package/src/generated/prisma/models/EventVendorCriteria.ts +0 -2186
  88. package/src/generated/prisma/models/EventVendors.ts +0 -3446
  89. package/src/generated/prisma/models/Expense.ts +0 -1625
  90. package/src/generated/prisma/models/ExportLog.ts +0 -1822
  91. package/src/generated/prisma/models/Faq.ts +0 -1753
  92. package/src/generated/prisma/models/FaqCategory.ts +0 -1610
  93. package/src/generated/prisma/models/FiscalYear.ts +0 -1460
  94. package/src/generated/prisma/models/FormMaster.ts +0 -1831
  95. package/src/generated/prisma/models/GRN.ts +0 -3354
  96. package/src/generated/prisma/models/GRNItem.ts +0 -2119
  97. package/src/generated/prisma/models/Industry.ts +0 -1642
  98. package/src/generated/prisma/models/Invoice.ts +0 -2949
  99. package/src/generated/prisma/models/InvoiceItem.ts +0 -2397
  100. package/src/generated/prisma/models/Item.ts +0 -10644
  101. package/src/generated/prisma/models/ItemAttribute.ts +0 -1750
  102. package/src/generated/prisma/models/ItemAttributeValue.ts +0 -1802
  103. package/src/generated/prisma/models/ItemDocument.ts +0 -1590
  104. package/src/generated/prisma/models/Location.ts +0 -2711
  105. package/src/generated/prisma/models/Message.ts +0 -2744
  106. package/src/generated/prisma/models/MessageRecipient.ts +0 -1759
  107. package/src/generated/prisma/models/Module.ts +0 -1630
  108. package/src/generated/prisma/models/Permission.ts +0 -1640
  109. package/src/generated/prisma/models/PurchaseIntake.ts +0 -4672
  110. package/src/generated/prisma/models/PurchaseIntakeItem.ts +0 -2366
  111. package/src/generated/prisma/models/PurchaseOrder.ts +0 -4012
  112. package/src/generated/prisma/models/PurchaseOrderActivityLog.ts +0 -1720
  113. package/src/generated/prisma/models/PurchaseOrderItem.ts +0 -2623
  114. package/src/generated/prisma/models/Quotation.ts +0 -3207
  115. package/src/generated/prisma/models/QuotationLog.ts +0 -3239
  116. package/src/generated/prisma/models/Region.ts +0 -1746
  117. package/src/generated/prisma/models/RequestedCatalogue.ts +0 -1618
  118. package/src/generated/prisma/models/RequestedCatalogueDetails.ts +0 -2252
  119. package/src/generated/prisma/models/Role.ts +0 -1907
  120. package/src/generated/prisma/models/RolePermission.ts +0 -1737
  121. package/src/generated/prisma/models/SendBack.ts +0 -1830
  122. package/src/generated/prisma/models/SerialNumberConfiguration.ts +0 -1254
  123. package/src/generated/prisma/models/SmtpConfig.ts +0 -1522
  124. package/src/generated/prisma/models/State.ts +0 -2174
  125. package/src/generated/prisma/models/Strategies.ts +0 -1791
  126. package/src/generated/prisma/models/SubModule.ts +0 -1450
  127. package/src/generated/prisma/models/Subregion.ts +0 -1870
  128. package/src/generated/prisma/models/SupportCategory.ts +0 -1712
  129. package/src/generated/prisma/models/SupportTicket.ts +0 -2478
  130. package/src/generated/prisma/models/SupportingDocument.ts +0 -2283
  131. package/src/generated/prisma/models/Template.ts +0 -2429
  132. package/src/generated/prisma/models/TemplateField.ts +0 -1916
  133. package/src/generated/prisma/models/TemplateStrategies.ts +0 -1614
  134. package/src/generated/prisma/models/TenantConfiguration.ts +0 -1694
  135. package/src/generated/prisma/models/TicketAssignment.ts +0 -1742
  136. package/src/generated/prisma/models/TicketHistory.ts +0 -1789
  137. package/src/generated/prisma/models/TicketReply.ts +0 -1640
  138. package/src/generated/prisma/models/Uom.ts +0 -1752
  139. package/src/generated/prisma/models/UomCategory.ts +0 -1558
  140. package/src/generated/prisma/models/UploadLog.ts +0 -1731
  141. package/src/generated/prisma/models/User.ts +0 -19397
  142. package/src/generated/prisma/models/UserDepartmentEntity.ts +0 -2099
  143. package/src/generated/prisma/models/UserEventConfiguration.ts +0 -1370
  144. package/src/generated/prisma/models/UserLoginActivity.ts +0 -1693
  145. package/src/generated/prisma/models/UserRole.ts +0 -1696
  146. package/src/generated/prisma/models/UserVendorSocketTokens.ts +0 -1450
  147. package/src/generated/prisma/models/VendorReference.ts +0 -1707
  148. package/src/generated/prisma/models.ts +0 -122
@@ -0,0 +1,3820 @@
1
+ // This is your Prisma schema file,
2
+ // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
+
4
+ // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
5
+ // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
6
+
7
+ generator client {
8
+ provider = "prisma-client-js"
9
+ output = "../src/prisma"
10
+ binaryTargets = ["native", "windows", "darwin", "debian-openssl-3.0.x"]
11
+ }
12
+
13
+ datasource db {
14
+ provider = "postgresql"
15
+ url = env("DEFAULT_DATABASE_URL")
16
+ }
17
+
18
+ //---------------------------------- SERIAL NUMBER CONFIGURATION MODEL START ------------------------------------------------
19
+ model SerialNumberConfiguration {
20
+ id Int @id @default(autoincrement())
21
+ module String? @unique
22
+ alias String?
23
+ initial_number Int?
24
+ current_number Int?
25
+ created_at DateTime? @default(now())
26
+
27
+ @@index([module])
28
+ @@map("serial_number_configurations")
29
+ }
30
+
31
+ //---------------------------------- SERIALNUMBERCONFIGURATION MODEL END ------------------------------------------------
32
+
33
+ //---------------------------------- USER MODEL START ------------------------------------------------
34
+
35
+ enum StatusEnum {
36
+ Active
37
+ InActive
38
+ Blocked
39
+ Suspended
40
+ PENDING_FOR_APPROVAL
41
+ REJECTED_FOR_APPROVAL
42
+ }
43
+
44
+ enum EnvironmentEnum {
45
+ PRODUCTION
46
+ SANDBOX
47
+ }
48
+
49
+ model User {
50
+ id Int @id @default(autoincrement())
51
+ uuid String? @unique @default(uuid())
52
+ unique_id String? @unique
53
+ name String?
54
+ first_name String?
55
+ middle_name String?
56
+ last_name String?
57
+ email_id String? @unique
58
+ password String?
59
+ country_code String?
60
+ mobile_number String? @unique
61
+ status StatusEnum @default(InActive)
62
+ reject_reason String?
63
+ is_email_verified Boolean @default(false)
64
+ is_mobile_verified Boolean @default(false)
65
+ profile_picture String?
66
+ invitation_status Boolean @default(false)
67
+ reset_token String?
68
+ reset_token_expiry DateTime? @db.Timestamptz(6)
69
+ access_token_expiry String?
70
+ token_version Int? @default(0) // This will be used to invalidate old refresh tokens
71
+ is_logged_in Boolean @default(false)
72
+ created_at DateTime @default(now()) @db.Timestamptz(6)
73
+ created_by Int?
74
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
75
+ updated_by Int?
76
+ is_deleted Boolean @default(false)
77
+ deleted_at DateTime? @db.Timestamptz(6)
78
+ deleted_by Int?
79
+ user_environment EnvironmentEnum @default(PRODUCTION)
80
+ contract_role String?
81
+ user_roles UserRole[]
82
+ user_department_entities UserDepartmentEntity[]
83
+ approval_hierarchy ApprovalHierarchy[]
84
+ approval_journey ApprovalJourney[]
85
+ approval_journey_original ApprovalJourney[] @relation("OriginalApprover")
86
+ approval_level_escalation ApprovalLevelEscalation[]
87
+ approval_delegations_as_approver ApprovalDelegation[] @relation("DelegatingApprover")
88
+ approval_delegations_as_delegate ApprovalDelegation[] @relation("DelegateUser")
89
+ approval_delegation_delegates ApprovalDelegationDelegate[] @relation("DelegationDelegate")
90
+ ticket_replies TicketReply[] @relation("user_reply")
91
+ ticket_assignment_by TicketAssignment[] @relation("user_assigned_by")
92
+ ticket_assignment_to TicketAssignment[] @relation("user_assigned_to")
93
+ ticket_assignment_by_user TicketHistory[] @relation("user_assigned_by")
94
+ ticket_assignment_to_user TicketHistory[] @relation("user_assigned_to")
95
+ admin_alerts AdminAlert[]
96
+ purchase_intake PurchaseIntake[]
97
+ approval_level_user ApprovalLevelUser[]
98
+ approval_level_escalation_user ApprovalLevelEscalationUser[]
99
+ purchase_intake_deleted_by PurchaseIntake[] @relation("purchase_intake_deleted_by")
100
+ template Template[]
101
+ event Event[]
102
+ form_master FormMaster[]
103
+ dynamic_form DynamicForm[]
104
+ purchase_order PurchaseOrder[]
105
+ purchase_order_activity_log PurchaseOrderActivityLog[]
106
+ user_socket_tokens UserVendorSocketTokens[]
107
+ activity_logs ActivityLog[]
108
+ contact_us ContactUs[]
109
+ upload_logs UploadLog[]
110
+ export_logs ExportLog[]
111
+ department_head Department[] @relation("department_head")
112
+ budget_manager Department[] @relation("budget_manager")
113
+ vendor_reference VendorReference[]
114
+ catalogue_cart CatalogueCart[]
115
+ send_back_approvers SendBack[] @relation("send_back_approver")
116
+ send_back_requestors SendBack[] @relation("send_back_requestor")
117
+ user_login_activities UserLoginActivity[]
118
+ event_rfi_form_logs EventRfiFormLog[]
119
+ conversations_as_admin Conversation[] @relation("ConversationAdminUser")
120
+ conversation_participants ConversationParticipant[] @relation("ConversationParticipantUser")
121
+ messages_sent Message[] @relation("MessageSenderUser")
122
+ message_recipients MessageRecipient[] @relation("MessageRecipientUser")
123
+ blanket_po BlanketPurchaseOrder[]
124
+ purchase_intake_initiated_by PurchaseIntake[] @relation("purchase_intake_initiated_by")
125
+ approval_management ApprovalManagement[]
126
+
127
+ @@map("users")
128
+ }
129
+
130
+ //---------------------------------- USER MODEL END ------------------------------------------------
131
+
132
+ //---------------------------------- ROLE MODEL START ------------------------------------------------
133
+ model Role {
134
+ id Int @id @default(autoincrement())
135
+ role_name String?
136
+ slug String @unique
137
+ description String?
138
+ is_active Boolean @default(false)
139
+ created_at DateTime @default(now()) @db.Timestamptz(6)
140
+ created_by Int?
141
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
142
+ updated_by Int?
143
+ is_deleted Boolean @default(false)
144
+ deleted_at DateTime? @db.Timestamptz(6)
145
+ deleted_by Int?
146
+ user_roles UserRole[]
147
+ role_permission RolePermission[]
148
+ approval_hierarchy ApprovalHierarchy[]
149
+
150
+ @@map("roles")
151
+ }
152
+
153
+ //---------------------------------- ROLE MODEL END ------------------------------------------------
154
+
155
+ //---------------------------------- USER ROLE MODEL START ------------------------------------------------
156
+ model UserRole {
157
+ id Int @id @default(autoincrement())
158
+ user_id Int
159
+ role_id Int
160
+ created_at DateTime @default(now()) @db.Timestamptz(6)
161
+ created_by Int?
162
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
163
+ updated_by Int?
164
+ deleted_at DateTime? @db.Timestamptz(6)
165
+ deleted_by Int?
166
+ user User @relation(fields: [user_id], references: [id], onDelete: Cascade)
167
+ role Role @relation(fields: [role_id], references: [id], onDelete: Cascade)
168
+
169
+ @@map("user_roles")
170
+ }
171
+
172
+ //---------------------------------- USER ROLE MODEL END ------------------------------------------------
173
+
174
+ //---------------------------------- PERMISSION MODEL START ------------------------------------------------
175
+ model Permission {
176
+ id Int @id @default(autoincrement())
177
+ permissions_name String?
178
+ slug String @unique
179
+ description String?
180
+ model String?
181
+ is_active Boolean @default(false)
182
+ is_deleted Boolean @default(false)
183
+ created_at DateTime @default(now()) @db.Timestamptz(6)
184
+ created_by Int?
185
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
186
+ updated_by Int?
187
+ deleted_at DateTime? @db.Timestamptz(6)
188
+ deleted_by Int?
189
+ role_permission RolePermission[]
190
+
191
+ @@map("permissions")
192
+ }
193
+
194
+ //---------------------------------- PERMISSION MODEL END ------------------------------------------------
195
+
196
+ //---------------------------------- ROLE PERMISSION MODEL START ------------------------------------------------
197
+ model RolePermission {
198
+ id Int @id @default(autoincrement())
199
+ permission_id Int
200
+ role_id Int
201
+ created_at DateTime @default(now()) @db.Timestamptz(6)
202
+ created_by Int?
203
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
204
+ updated_by Int?
205
+ is_deleted Boolean @default(false)
206
+ deleted_at DateTime? @db.Timestamptz(6)
207
+ deleted_by Int?
208
+
209
+ permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)
210
+ role Role @relation(fields: [role_id], references: [id], onDelete: Cascade)
211
+
212
+ @@map("role_permissions")
213
+ }
214
+
215
+ //---------------------------------- ROLE PERMISSION MODEL END ------------------------------------------------
216
+
217
+ //---------------------------------- DEPARTMENT MODEL START ------------------------------------------------
218
+ model Department {
219
+ id Int @id @default(autoincrement())
220
+ uuid String? @unique @default(uuid())
221
+ department_code String? @unique
222
+ department_name String?
223
+ department_slug String? @unique
224
+ department_head Int?
225
+ department_head_user User? @relation("department_head", fields: [department_head], references: [id])
226
+ budget_manager Int?
227
+ budget_manager_user User? @relation("budget_manager", fields: [budget_manager], references: [id])
228
+ description String?
229
+ is_active Boolean @default(false)
230
+ created_at DateTime @default(now()) @db.Timestamptz(6)
231
+ created_by Int?
232
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
233
+ updated_by Int?
234
+ is_deleted Boolean @default(false)
235
+ deleted_at DateTime? @db.Timestamptz(6)
236
+ deleted_by Int?
237
+ // user_department UserDepartment[]
238
+ department_budget DepartmentBudget[]
239
+ business_entity_departments BusinessEntityDepartment[]
240
+
241
+ @@map("departments")
242
+ }
243
+
244
+ //---------------------------------- DEPARTMENT MODEL END ------------------------------------------------
245
+
246
+ //---------------------------------- USER DEPARTMENT MODEL START ------------------------------------------------
247
+ model UserDepartmentEntity {
248
+ id Int @id @default(autoincrement())
249
+ uuid String? @unique @default(uuid())
250
+ user_id Int?
251
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
252
+ bussiness_entity_department_id Int?
253
+ bussiness_entity_department BusinessEntityDepartment? @relation(fields: [bussiness_entity_department_id], references: [id], onDelete: Cascade)
254
+ business_entity_id Int?
255
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])
256
+ is_primary Boolean? @default(false)
257
+ is_deleted Boolean? @default(false)
258
+ created_at DateTime @default(now()) @db.Timestamptz(6)
259
+ created_by Int?
260
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
261
+ updated_by Int?
262
+ deleted_at DateTime? @db.Timestamptz(6)
263
+ deleted_by Int?
264
+
265
+ @@unique([user_id, bussiness_entity_department_id])
266
+ @@map("user_department_entities")
267
+ }
268
+
269
+ //---------------------------------- USER DEPARTMENT MODEL END ------------------------------------------------
270
+
271
+ //---------------------------------- BUSINESS ENTITY DEPARTMENT MODEL START ------------------------------------------------
272
+ // Many-to-many join table: one Department can belong to many BusinessEntities,
273
+ // one BusinessEntity can have many Departments.
274
+ model BusinessEntityDepartment {
275
+ id Int @id @default(autoincrement())
276
+ uuid String? @unique @default(uuid())
277
+ business_entity_id Int?
278
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])
279
+ department_id Int?
280
+ department Department? @relation(fields: [department_id], references: [id])
281
+ is_active Boolean? @default(true)
282
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
283
+ created_by Int?
284
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
285
+ updated_by Int?
286
+ is_deleted Boolean? @default(false)
287
+ deleted_at DateTime? @db.Timestamptz(6)
288
+ deleted_by Int?
289
+ userDepartmentEntities UserDepartmentEntity[]
290
+
291
+ @@unique([business_entity_id, department_id])
292
+ @@map("business_entity_departments")
293
+ }
294
+
295
+ //---------------------------------- BUSINESS ENTITY DEPARTMENT MODEL END ------------------------------------------------
296
+
297
+ //---------------------------------- INDUSTRY MODEL START ----------------------------------
298
+ model Industry {
299
+ id Int @id @default(autoincrement())
300
+ uuid String? @unique @default(uuid())
301
+ name String? @unique
302
+ slug String?
303
+ is_active Boolean @default(true)
304
+ description String?
305
+ created_by Int?
306
+ created_at DateTime @default(now()) @db.Timestamptz(6)
307
+ updated_by Int?
308
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
309
+ is_deleted Boolean @default(false)
310
+ deleted_by Int?
311
+ deleted_at DateTime? @db.Timestamptz(6)
312
+ categories Category[]
313
+
314
+ @@map("industries")
315
+ }
316
+
317
+ //---------------------------------- INDUSTRY MODEL END ----------------------------------
318
+
319
+ //---------------------------------- CATEGORY MODEL START ----------------------------------
320
+ model Category {
321
+ id Int @id @default(autoincrement())
322
+ uuid String? @unique @default(uuid())
323
+ industry_id Int?
324
+ industry Industry? @relation(fields: [industry_id], references: [id])
325
+ name String? @unique
326
+ slug String?
327
+ is_active Boolean @default(true)
328
+ parent_id Int @default(0)
329
+ description String?
330
+ image_url String?
331
+ created_by Int?
332
+ created_at DateTime @default(now()) @db.Timestamptz(6)
333
+ updated_by Int?
334
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
335
+ is_deleted Boolean @default(false)
336
+ deleted_by Int?
337
+ deleted_at DateTime? @db.Timestamptz(6)
338
+ attributes Attribute[]
339
+ category_uom UomCategory[]
340
+ category_budget CategoryBudget[]
341
+ item_category Item[] @relation("ItemCategory")
342
+ item_sub_category Item[] @relation("ItemSubCategory")
343
+ boq_event_items_as_category BoqEventItem[] @relation("CategoryBoqEventItemAsCategory")
344
+ boq_event_items_as_sub_category BoqEventItem[] @relation("SubCategoryBoqEventItemAsSubCategory")
345
+
346
+ @@map("categories")
347
+ }
348
+
349
+ //---------------------------------- CATEGORY MODEL END ----------------------------------
350
+
351
+ //---------------------------------- ATTRIBUTE MODEL START ----------------------------------
352
+ model Attribute {
353
+ id Int @id @default(autoincrement())
354
+ uuid String? @unique @default(uuid())
355
+ category_id Int?
356
+ category Category? @relation(fields: [category_id], references: [id])
357
+ attribute_name String?
358
+ is_required Boolean? @default(false)
359
+ is_active Boolean? @default(true)
360
+ slug String?
361
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
362
+ created_by Int?
363
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
364
+ updated_by Int?
365
+ is_deleted Boolean? @default(false)
366
+ deleted_at DateTime? @db.Timestamptz(6)
367
+ deleted_by Int?
368
+ attribute_values AttributeValue[]
369
+ item_attributes ItemAttribute[]
370
+
371
+ @@unique([category_id, attribute_name])
372
+ @@map("attributes")
373
+ }
374
+
375
+ //---------------------------------- ATTRIBUTE MODEL END ----------------------------------
376
+
377
+ //---------------------------------- ATTRIBUTEVALUE MODEL START ----------------------------------
378
+ model AttributeValue {
379
+ id Int @id @default(autoincrement())
380
+ uuid String? @unique @default(uuid())
381
+ attribute_id Int?
382
+ attribute Attribute? @relation(fields: [attribute_id], references: [id])
383
+ attribute_value_name String?
384
+ is_active Boolean @default(true)
385
+ slug String?
386
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
387
+ created_by Int?
388
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
389
+ updated_by Int?
390
+ is_deleted Boolean? @default(false)
391
+ deleted_at DateTime? @db.Timestamptz(6)
392
+ deleted_by Int?
393
+ item_attribute_values ItemAttributeValue[]
394
+
395
+ @@unique([attribute_id, attribute_value_name])
396
+ @@map("attribute_values")
397
+ }
398
+
399
+ //---------------------------------- ATTRIBUTEVALUE MODEL END ----------------------------------
400
+
401
+ //---------------------------------- ITEM MODEL START ----------------------------------
402
+ model Item {
403
+ id Int @id @default(autoincrement())
404
+ uuid String? @unique @default(uuid())
405
+ is_parent Boolean @default(false)
406
+ parent_id Int? @default(0)
407
+ category_id Int?
408
+ category Category? @relation("ItemCategory", fields: [category_id], references: [id])
409
+ sub_category_id Int?
410
+ sub_category Category? @relation("ItemSubCategory", fields: [sub_category_id], references: [id])
411
+ uomId Int?
412
+ uom Uom? @relation(fields: [uomId], references: [id])
413
+ item_code String? @unique @db.VarChar(500)
414
+ item_name String? @db.VarChar(500)
415
+ item_handler String? @db.VarChar(1000)
416
+ slug String? @unique @db.VarChar(1000)
417
+ description String? @db.VarChar(1000)
418
+ terms_and_conditions String[] @db.VarChar(1000)
419
+ keywords String[] @db.VarChar(1000)
420
+ tags Json? @db.JsonB
421
+ cost_price Decimal? @default(0.00) @db.Decimal(10, 2)
422
+ selling_price Decimal? @default(0.00) @db.Decimal(10, 2)
423
+ profit Decimal? @default(0.00) @db.Decimal(10, 2)
424
+ margin Decimal? @default(0.00) @db.Decimal(10, 2)
425
+ title String? @db.VarChar(500)
426
+ continue_selling_when_out_of_stock Boolean? @default(false)
427
+ physical_product Boolean? @default(false)
428
+ variant_attributes Json? @db.JsonB // {"color": "red", "size": "large", "material": "cotton"}
429
+ variant_display_name String? @db.VarChar(500) // "Red Large Cotton" - auto-generated or custom
430
+ available_qty Int? @default(0)
431
+ inventory_reason String? @db.VarChar(500)
432
+ reserved_quantity Int? @default(0)
433
+ stock_in_hand Int? @default(0)
434
+ reorder_level Int? @default(0) // NEW: When to reorder
435
+ max_stock_level Int? // NEW: Maximum stock level
436
+ sku String? @unique @db.VarChar(500)
437
+ is_taxable Boolean? @default(false)
438
+ bar_code String? @unique @db.VarChar(500) // Made unique
439
+ physical_item Boolean? @default(false)
440
+ track_quantity Boolean? @default(false)
441
+ weight Decimal? @default(0.00) @db.Decimal(10, 2)
442
+ dimensions Json? @db.JsonB // {"length": 10, "width": 5, "height": 2, "unit": "cm"}
443
+ shipping_weight Decimal? @db.Decimal(10, 2) // Different from product weight
444
+ media Json? @db.JsonB
445
+ specifications Json? @db.JsonB
446
+ template_suffix String?
447
+ seo_page_title String?
448
+ seo_meta_keyword String?
449
+ seo_meta_description String?
450
+ step_completed Int? @default(0)
451
+ is_published Boolean? @default(false)
452
+ published_at DateTime? @db.Timestamptz(6)
453
+ published_by Int?
454
+ is_active Boolean @default(true)
455
+ is_featured Boolean @default(false) // NEW: For featured products
456
+ is_default_variant Boolean @default(false) // NEW: Default variant for parent
457
+ sort_order Int @default(0) // NEW: For ordering variants
458
+ min_order_qty Int @default(1) // Minimum order quantity
459
+ max_order_qty Int? // Maximum order quantity
460
+ is_bulk_pricing_enabled Boolean @default(false) // For bulk pricing
461
+ bulk_pricing_tiers Json? @db.JsonB // [{"qty": 10, "price": 20}, {"qty": 50, "price": 18}]
462
+ created_by Int?
463
+ created_at DateTime @default(now()) @db.Timestamptz(6)
464
+ updated_by Int?
465
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
466
+ is_deleted Boolean @default(false)
467
+ deleted_by Int?
468
+ deleted_at DateTime? @db.Timestamptz(6)
469
+ purchase_intake_items PurchaseIntakeItem[]
470
+ item_attributes ItemAttribute[]
471
+ item_attribute_values ItemAttributeValue[]
472
+ item_documents ItemDocument[]
473
+ event_items EventItems[]
474
+ purchase_order_items PurchaseOrderItem[]
475
+ requested_catalogue_items RequestedCatalogueDetails[] @relation("ParentItemRequests")
476
+ requested_catalogue_variants RequestedCatalogueDetails[] @relation("VariantItemRequests")
477
+ catalogue_items Catalogue[] @relation("ParentItemCatalogue")
478
+ catalogue_variants Catalogue[] @relation("VariantItemCatalogue")
479
+ catalogue_vendor_items CatalogueVendor[] @relation("ParentItemCatalogueVendor")
480
+ catalogue_vendor_variants CatalogueVendor[] @relation("VariantItemCatalogueVendor")
481
+ catalogue_cart_items CatalogueCart[] @relation("ParentItemCatalogueCart")
482
+ catalogue_cart_variants CatalogueCart[] @relation("VariantItemCatalogueCart")
483
+ blanket_po_items BlanketPurchaseOrderItem[]
484
+
485
+ @@index([parent_id, is_active, is_deleted]) // For variant queries
486
+ @@index([is_parent, is_published, is_active]) // For parent product queries
487
+ @@index([available_qty]) // For stock queries
488
+ @@index([reorder_level, available_qty]) // For low stock alerts
489
+ @@index([category_id, is_published, is_active]) // For category browsing
490
+ @@index([created_at]) // For recent products
491
+ @@index([selling_price]) // For price filtering
492
+ @@map("item")
493
+ }
494
+
495
+ //---------------------------------- ITEM MODEL END ----------------------------------
496
+
497
+ //---------------------------------- PURCHASEINTAKES MODEL START ----------------------------------
498
+
499
+ // Enum for priority levels
500
+ enum PurchaseIntakePriorityEnum {
501
+ Urgent
502
+ High
503
+ Medium
504
+ Low
505
+ }
506
+
507
+ // Enum for status levels
508
+ enum PurchaseIntakeStatusEnum {
509
+ APPROVED
510
+ IN_PROGRESS
511
+ PENDING
512
+ REJECTED
513
+ COMPLETED
514
+ CANCELLED
515
+ AUTO_APPROVED
516
+ AUTO_REJECTED
517
+ SEND_BACK
518
+ EXPIRED
519
+ }
520
+
521
+ enum PurchaseRequestStatusEnum {
522
+ Open
523
+ InProgress
524
+ OnHold
525
+ Partial
526
+ Closed
527
+ Cancelled
528
+ Completed
529
+ Rejected
530
+ Expired
531
+ }
532
+
533
+ enum PurchaseIntakeTypeEnum {
534
+ PURCHASE_INTAKE
535
+ FAST_CATALOGUE
536
+ BLANKET_PURCHASE_ORDER
537
+ }
538
+
539
+ model PurchaseIntake {
540
+ id Int @id @default(autoincrement())
541
+ uuid String? @unique @default(uuid())
542
+ pi_number String? @unique
543
+ pr_number String? @unique
544
+ requestor_id Int?
545
+ user User? @relation(fields: [requestor_id], references: [id], onDelete: Cascade)
546
+ type PurchaseIntakeTypeEnum @default(PURCHASE_INTAKE)
547
+ department String?
548
+ request_date DateTime? @default(now()) @db.Timestamptz(6)
549
+ items_or_services_description String?
550
+ priority PurchaseIntakePriorityEnum
551
+ estimated_budget Float?
552
+ status PurchaseIntakeStatusEnum @default(PENDING)
553
+ pr_status PurchaseRequestStatusEnum @default(Open)
554
+ reject_reason String?
555
+ pr_reject_reason String?
556
+ attachments Json?
557
+ if_yes_attach_quotations Json?
558
+ others Json?
559
+ send_back_count Int? @default(0)
560
+ is_active Boolean @default(true)
561
+ created_at DateTime @default(now()) @db.Timestamptz(6)
562
+ created_by Int?
563
+ updated_by Int?
564
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
565
+ is_deleted Boolean @default(false)
566
+ delete_reason String?
567
+ deleted_at DateTime? @db.Timestamptz(6)
568
+ deleted_by Int?
569
+ deleted_by_user User? @relation("purchase_intake_deleted_by", fields: [deleted_by], references: [id])
570
+ initiated_by Int?
571
+ initiated_by_user User? @relation("purchase_intake_initiated_by", fields: [initiated_by], references: [id])
572
+ business_entity_id Int?
573
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id])
574
+ purchase_intake_item PurchaseIntakeItem[]
575
+ events Event[]
576
+ event_items EventItems[]
577
+ purchase_order_items PurchaseOrderItem[]
578
+ send_backs SendBack[]
579
+ blanket_po_items BlanketPurchaseOrderItem[]
580
+
581
+ @@map("purchase_intakes")
582
+ }
583
+
584
+ //---------------------------------- PURCHASEINTAKES MODEL END ----------------------------------
585
+
586
+ //---------------------------------- PURCHASEINTAKESITEMS MODEL START ----------------------------------
587
+
588
+ enum PurchaseIntakeItemEnum {
589
+ Open
590
+ InProgress
591
+ OnHold
592
+ Partial
593
+ Closed
594
+ Cancelled
595
+ Completed
596
+ Rejected
597
+ Expired
598
+ }
599
+
600
+ enum SendBackIntakeStatusEnum {
601
+ PENDING
602
+ ACCEPTED
603
+ COUNTERED
604
+ REJECTED
605
+ }
606
+
607
+ enum SendBackApproverStatusEnum {
608
+ PENDING
609
+ ACCEPTED
610
+ COUNTERED
611
+ REJECTED
612
+ SEND_BACK
613
+ }
614
+
615
+ model PurchaseIntakeItem {
616
+ id Int @id @default(autoincrement())
617
+ uuid String? @unique @default(uuid())
618
+ purchase_intakes_id Int?
619
+ purchase_intake PurchaseIntake? @relation(fields: [purchase_intakes_id], references: [id], onDelete: Cascade)
620
+ item_id Int?
621
+ items Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)
622
+ vendor_id Int?
623
+ quantity Int?
624
+ initial_quantity Int?
625
+ open_quantity Int?
626
+ closed_quantity Int? @default(0)
627
+ unit_of_measurement String?
628
+ price Decimal? @default(0.00) @db.Decimal(10, 2)
629
+ location_id Int?
630
+ location Location? @relation(fields: [location_id], references: [id], onDelete: Cascade)
631
+ status PurchaseIntakeItemEnum @default(Open)
632
+ send_back_intake_status SendBackIntakeStatusEnum @default(PENDING)
633
+ send_back_approver_status SendBackApproverStatusEnum @default(PENDING)
634
+ suggested_quantity Int?
635
+ counter_quantity Int?
636
+ created_at DateTime @default(now()) @db.Timestamptz(6)
637
+
638
+ @@map("purchase_intakes_items")
639
+ }
640
+
641
+ //---------------------------------- PURCHASEINTAKESITEMS MODEL END ----------------------------------
642
+
643
+ //---------------------------------- SEND BACK MODEL END ---------------------------------------
644
+
645
+ model SendBack {
646
+ id Int @id @default(autoincrement())
647
+ uuid String? @unique @default(uuid())
648
+ purchase_intake_id Int?
649
+ purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade)
650
+ item_json Json? @db.JsonB
651
+ send_back_reason String?
652
+ send_back_approver_id Int?
653
+ send_back_approver User? @relation("send_back_approver", fields: [send_back_approver_id], references: [id], onDelete: Cascade)
654
+ send_back_requestor_id Int?
655
+ send_back_requestor User? @relation("send_back_requestor", fields: [send_back_requestor_id], references: [id], onDelete: Cascade)
656
+ created_at DateTime @default(now()) @db.Timestamptz(6)
657
+
658
+ @@map("send_backs")
659
+ }
660
+
661
+ //---------------------------------- SEND BACK MODEL END ---------------------------------------
662
+
663
+ //---------------------------------- EMAILTEMPLATE MODEL END ------------------------------------------------
664
+ model EmailTemplate {
665
+ id Int @id @default(autoincrement())
666
+ uuid String? @unique @default(uuid())
667
+ template_name String?
668
+ template_slug String? @unique @db.VarChar(100)
669
+ subject String?
670
+ html_content String?
671
+ macro String?
672
+ module_name String?
673
+ is_active Boolean? @default(true)
674
+ is_deleted Boolean? @default(false)
675
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
676
+ created_by Int?
677
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
678
+ updated_by Int?
679
+ deleted_at DateTime? @db.Timestamptz(6)
680
+ deleted_by Int?
681
+
682
+ @@map("email_templates")
683
+ }
684
+
685
+ //---------------------------------- EMAILTEMPLATE MODEL END ------------------------------------------------
686
+
687
+ //---------------------------------- SMTP MODEL START ------------------------------------------------
688
+ model SmtpConfig {
689
+ id Int @id @default(autoincrement())
690
+ smtp_server String @unique
691
+ port Int?
692
+ username String?
693
+ password String?
694
+ from_email String?
695
+ encryption String?
696
+ test_email String?
697
+ is_active Boolean @default(false)
698
+ is_deleted Boolean @default(false)
699
+ created_at DateTime @default(now()) @db.Timestamptz(6)
700
+ created_by Int?
701
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
702
+ updated_by Int?
703
+ deleted_at DateTime? @db.Timestamptz(6)
704
+ deleted_by Int?
705
+
706
+ @@map("smtp_config")
707
+ }
708
+
709
+ //---------------------------------- SMTP MODEL END ------------------------------------------------
710
+
711
+ //---------------------------------- APPROVAL HIERARCHY MODEL START ------------------------------------------------
712
+ enum InitiatorTypeEnum {
713
+ Role
714
+ User
715
+ }
716
+
717
+ model ApprovalHierarchy {
718
+ id Int @id @default(autoincrement())
719
+ uuid String? @unique @default(uuid())
720
+ name String?
721
+ slug String? @unique
722
+ module String?
723
+ task String?
724
+ initiator_type InitiatorTypeEnum
725
+ roleId Int?
726
+ role Role? @relation(fields: [roleId], references: [id], onDelete: Cascade)
727
+ userId Int?
728
+ user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
729
+ business_entity_id Int?
730
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: SetNull)
731
+ is_active Boolean @default(true)
732
+ is_deleted Boolean @default(false)
733
+ created_at DateTime @default(now()) @db.Timestamptz(6)
734
+ created_by Int?
735
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
736
+ updated_by Int?
737
+ deleted_at DateTime? @db.Timestamptz(6)
738
+ deleted_by Int?
739
+ approval_condition ApprovalCondition[]
740
+ approval_level ApprovalLevel[]
741
+ approval_journey ApprovalJourney[]
742
+ approval_delegations ApprovalDelegation[] // Delegations filtered by this hierarchy
743
+
744
+ @@map("approval_hierarchy")
745
+ }
746
+
747
+ //---------------------------------- APPROVAL HIERARCHY MODEL END ------------------------------------------------
748
+
749
+ //---------------------------------- APPROVAL CONDITION MODEL START ------------------------------------------------
750
+
751
+ enum ConditionTypeEnum {
752
+ Price
753
+ Escalation
754
+ }
755
+
756
+ model ApprovalCondition {
757
+ id Int @id @default(autoincrement())
758
+ uuid String? @unique @default(uuid())
759
+ approval_hierarchy_id Int?
760
+ approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)
761
+ conditions ConditionTypeEnum
762
+ price_from Float?
763
+ price_to Float?
764
+ is_active Boolean @default(true)
765
+ is_deleted Boolean @default(false)
766
+ created_at DateTime @default(now()) @db.Timestamptz(6)
767
+ created_by Int?
768
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
769
+ updated_by Int?
770
+ deleted_at DateTime? @db.Timestamptz(6)
771
+ deleted_by Int?
772
+ approval_level ApprovalLevel[]
773
+ approval_delegations ApprovalDelegation[] // Delegations filtered by this condition
774
+
775
+ @@map("approval_conditions")
776
+ }
777
+
778
+ //---------------------------------- APPROVAL CONDITION MODEL END ------------------------------------------------
779
+
780
+ //---------------------------------- APPROVAL LEVEL MODEL START ------------------------------------------------
781
+
782
+ model ApprovalLevel {
783
+ id Int @id @default(autoincrement())
784
+ uuid String? @unique @default(uuid())
785
+ approval_hierarchy_id Int?
786
+ approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)
787
+ approval_condition_id Int?
788
+ approval_condition ApprovalCondition? @relation(fields: [approval_condition_id], references: [id], onDelete: Cascade)
789
+ level String?
790
+ valid_till_hours Int?
791
+ valid_till_minutes Int?
792
+ is_active Boolean @default(true)
793
+ is_deleted Boolean @default(false)
794
+ created_at DateTime @default(now()) @db.Timestamptz(6)
795
+ created_by Int?
796
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
797
+ updated_by Int?
798
+ deleted_at DateTime? @db.Timestamptz(6)
799
+ deleted_by Int?
800
+ approval_level_escalation ApprovalLevelEscalation[]
801
+ approval_level_users ApprovalLevelUser[]
802
+
803
+ @@map("approval_levels")
804
+ }
805
+
806
+ //---------------------------------- APPROVAL LEVEL MODEL END ------------------------------------------------
807
+
808
+ //---------------------------------- APPROVAL LEVEL USER MODEL START ------------------------------------------------
809
+
810
+ model ApprovalLevelUser {
811
+ id Int @id @default(autoincrement())
812
+ uuid String? @unique @default(uuid())
813
+ approval_level_id Int?
814
+ approval_level ApprovalLevel? @relation(fields: [approval_level_id], references: [id], onDelete: Cascade)
815
+ approver_id Int?
816
+ user User? @relation(fields: [approver_id], references: [id], onDelete: Cascade)
817
+ is_active Boolean @default(true)
818
+ is_deleted Boolean @default(false)
819
+ created_at DateTime @default(now()) @db.Timestamptz(6)
820
+ created_by Int?
821
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
822
+ updated_by Int?
823
+ deleted_at DateTime? @db.Timestamptz(6)
824
+ deleted_by Int?
825
+
826
+ @@unique([approval_level_id, approver_id])
827
+ @@map("approval_level_users")
828
+ }
829
+
830
+ //---------------------------------- APPROVAL LEVEL USER MODEL END ------------------------------------------------
831
+
832
+ //---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL START ------------------------------------------------
833
+
834
+ model ApprovalLevelEscalation {
835
+ id Int @id @default(autoincrement())
836
+ uuid String? @unique @default(uuid())
837
+ approval_level_id Int?
838
+ approval_level ApprovalLevel? @relation(fields: [approval_level_id], references: [id], onDelete: Cascade)
839
+ escalation_approver_id Int?
840
+ user User? @relation(fields: [escalation_approver_id], references: [id], onDelete: Cascade)
841
+ valid_till_hours Int?
842
+ valid_till_minutes Int?
843
+ is_active Boolean @default(true)
844
+ is_deleted Boolean @default(false)
845
+ created_at DateTime @default(now()) @db.Timestamptz(6)
846
+ created_by Int?
847
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
848
+ updated_by Int?
849
+ deleted_at DateTime? @db.Timestamptz(6)
850
+ deleted_by Int?
851
+ approval_level_escalation_users ApprovalLevelEscalationUser[]
852
+
853
+ @@map("approval_level_escalations")
854
+ }
855
+
856
+ //---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL END ------------------------------------------------
857
+
858
+ // --------------------------------- APPROVAL LEVEL ESCALATIONS USERS MODEL START ------------------------------------------------
859
+
860
+ model ApprovalLevelEscalationUser {
861
+ id Int @id @default(autoincrement())
862
+ uuid String? @unique @default(uuid())
863
+ approval_level_escalation_id Int?
864
+ approval_level_escalation ApprovalLevelEscalation? @relation(fields: [approval_level_escalation_id], references: [id], onDelete: Cascade)
865
+ approver_id Int?
866
+ user User? @relation(fields: [approver_id], references: [id], onDelete: Cascade)
867
+ is_active Boolean @default(true)
868
+ is_deleted Boolean @default(false)
869
+ created_at DateTime @default(now()) @db.Timestamptz(6)
870
+ created_by Int?
871
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
872
+ updated_by Int?
873
+ deleted_at DateTime? @db.Timestamptz(6)
874
+ deleted_by Int?
875
+
876
+ @@unique([approval_level_escalation_id, approver_id])
877
+ @@map("approval_level_escalation_users")
878
+ }
879
+
880
+ //---------------------------------- APPROVAL LEVEL ESCALATIONS MODEL END ------------------------------------------------
881
+
882
+ //---------------------------------- UOM MODEL START ------------------------------------------------
883
+
884
+ model Uom {
885
+ id Int @id @default(autoincrement())
886
+ uuid String? @unique @default(uuid())
887
+ uom_code String? @unique @db.VarChar(25)
888
+ description String? @db.VarChar(300)
889
+ is_active Boolean? @default(false)
890
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
891
+ created_by Int?
892
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
893
+ updated_by Int?
894
+ is_deleted Boolean? @default(false)
895
+ deleted_at DateTime? @db.Timestamptz(6)
896
+ deleted_by Int?
897
+
898
+ items Item[]
899
+
900
+ uom_category UomCategory[]
901
+
902
+ @@map("uoms")
903
+ }
904
+
905
+ //---------------------------------- UOM MODEL END ------------------------------------------------
906
+
907
+ //---------------------------------- UOM CATEGORY MODEL START ------------------------------------------------
908
+
909
+ model UomCategory {
910
+ id Int @id @default(autoincrement())
911
+ uuid String? @unique @default(uuid())
912
+ Category Category? @relation(fields: [categoryId], references: [id], onDelete: Cascade)
913
+ categoryId Int?
914
+ Uom Uom? @relation(fields: [uomId], references: [id], onDelete: Cascade)
915
+ uomId Int?
916
+ created_by Int?
917
+
918
+ @@map("uom_categories")
919
+ }
920
+
921
+ //---------------------------------- UOM CATEGORY MODEL START ------------------------------------------------
922
+
923
+ //---------------------------------- PRODUCT ATTRIBUTE MODEL START ------------------------------------------------
924
+ model ItemAttribute {
925
+ id Int @id @default(autoincrement())
926
+ uuid String? @unique @default(uuid())
927
+ item_id Int?
928
+ item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)
929
+ attribute_id Int?
930
+ attribute Attribute? @relation(fields: [attribute_id], references: [id])
931
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
932
+ created_by Int?
933
+
934
+ item_attribute_values ItemAttributeValue[]
935
+
936
+ @@unique([item_id, attribute_id])
937
+ @@index([item_id])
938
+ @@map("item_attributes")
939
+ }
940
+
941
+ //---------------------------------- PRODUCT ATTRIBUTE MODEL END ------------------------------------------------
942
+
943
+ //---------------------------------- PRODUCT ATTRIBUTE VALUE MODEL START ------------------------------------------------
944
+ model ItemAttributeValue {
945
+ id Int @id @default(autoincrement())
946
+ uuid String? @unique @default(uuid())
947
+ item_id Int?
948
+ item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)
949
+ item_attribute_id Int?
950
+ item_attribute ItemAttribute? @relation(fields: [item_attribute_id], references: [id], onDelete: Cascade)
951
+ attribute_value_id Int?
952
+ attribute_value AttributeValue? @relation(fields: [attribute_value_id], references: [id])
953
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
954
+ created_by Int?
955
+
956
+ @@unique([item_id, item_attribute_id, attribute_value_id])
957
+ @@index([item_id])
958
+ @@map("item_attribute_values")
959
+ }
960
+
961
+ //---------------------------------- PRODUCT ATTRIBUTE VALUE MODEL START ------------------------------------------------
962
+
963
+ //---------------------------------- ITEM DOCUMENTS MODEL START ------------------------------------------------
964
+
965
+ model ItemDocument {
966
+ id Int @id @default(autoincrement())
967
+ uuid String? @unique @default(uuid())
968
+ item_id Int?
969
+ item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)
970
+ original_document String?
971
+ optimized_image String?
972
+ thumbnail_image String?
973
+ original_name String?
974
+ original_extension String?
975
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
976
+ created_by Int?
977
+
978
+ @@map("item_documents")
979
+ }
980
+
981
+ //---------------------------------- ITEM IMAGES MODEL END ------------------------------------------------
982
+
983
+ //---------------------------------- APPROVAL JOURNEY MODEL START ------------------------------------------------
984
+
985
+ enum ApprovalJourneyStatusEnum {
986
+ Pending
987
+ Approved
988
+ AutoApproved
989
+ Rejected
990
+ AutoRejected
991
+ Escalated
992
+ NA
993
+ Cancelled
994
+ SendBack
995
+ }
996
+
997
+ model ApprovalJourney {
998
+ id Int @id @default(autoincrement())
999
+ uuid String? @unique @default(uuid())
1000
+ parent_id String?
1001
+ journy_type String?
1002
+ approval_hierarchy_id Int?
1003
+ approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: Cascade)
1004
+ approvar_id Int?
1005
+ user User? @relation(fields: [approvar_id], references: [id], onDelete: Cascade)
1006
+ original_approver_id Int? // Original approver when delegation is active
1007
+ original_approver User? @relation("OriginalApprover", fields: [original_approver_id], references: [id], onDelete: SetNull)
1008
+ delegation_id Int? // Reference to active delegation
1009
+ delegation ApprovalDelegation? @relation(fields: [delegation_id], references: [id], onDelete: SetNull)
1010
+ level String?
1011
+ status ApprovalJourneyStatusEnum @default(Pending)
1012
+ reject_reason String?
1013
+ journey_task String?
1014
+ is_approver_turn Boolean @default(false)
1015
+ duration String? // Duration in hours and minutes (e.g. "2h 30m")
1016
+ valid_to DateTime? @db.Timestamptz(6) // Explicitly use timestamptz
1017
+ valid_till DateTime? @db.Timestamptz(6) // Explicitly use timestamptz
1018
+ batch_id String?
1019
+ is_deleted Boolean @default(false)
1020
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1021
+ created_by Int?
1022
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1023
+ updated_by Int?
1024
+ deleted_at DateTime? @db.Timestamptz(6)
1025
+ deleted_by Int?
1026
+
1027
+ @@map("approval_journey")
1028
+ }
1029
+
1030
+ //---------------------------------- APPROVAL JOURNEY MODEL END ------------------------------------------------
1031
+
1032
+ //---------------------------------- APPROVAL DELEGATION MODEL START ------------------------------------------------
1033
+ enum ApprovalDelegationStatusEnum {
1034
+ PENDING
1035
+ ACTIVE
1036
+ COMPLETED
1037
+ CANCELLED
1038
+ }
1039
+
1040
+ model ApprovalDelegation {
1041
+ id Int @id @default(autoincrement())
1042
+ uuid String? @unique @default(uuid())
1043
+ approver_id Int? // Original approver who is delegating
1044
+ approver User? @relation("DelegatingApprover", fields: [approver_id], references: [id], onDelete: Cascade)
1045
+ delegate_id Int? // DEPRECATED: Use delegation_delegates instead. Kept for backward compatibility
1046
+ delegate User? @relation("DelegateUser", fields: [delegate_id], references: [id], onDelete: Cascade)
1047
+ journy_type String? // Optional: Filter by module type (e.g., "purchase-intake", "contract")
1048
+ journey_task String? // Optional: Filter by task (e.g., "contract-creation-approval")
1049
+ approval_hierarchy_id Int? // Optional: Filter by specific hierarchy
1050
+ approval_hierarchy ApprovalHierarchy? @relation(fields: [approval_hierarchy_id], references: [id], onDelete: SetNull)
1051
+ approval_condition_id Int? // Optional: Filter by specific condition within hierarchy (includes price range) - Most granular
1052
+ approval_condition ApprovalCondition? @relation(fields: [approval_condition_id], references: [id], onDelete: SetNull)
1053
+ start_date DateTime @db.Timestamptz(6) // When delegation becomes active
1054
+ end_date DateTime @db.Timestamptz(6) // When delegation expires
1055
+ status ApprovalDelegationStatusEnum @default(PENDING)
1056
+ reason String? // Reason for delegation (e.g., "On leave", "Out of office")
1057
+ is_active Boolean @default(true) // Can be manually deactivated
1058
+ is_deleted Boolean @default(false)
1059
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1060
+ created_by Int?
1061
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1062
+ updated_by Int?
1063
+ deleted_at DateTime? @db.Timestamptz(6)
1064
+ deleted_by Int?
1065
+ approval_journey ApprovalJourney[] // All approval journeys using this delegation
1066
+ delegation_delegates ApprovalDelegationDelegate[] // Multiple delegates for this delegation
1067
+
1068
+ @@index([approver_id, is_active, is_deleted])
1069
+ @@index([approver_id, journy_type, journey_task, is_active, is_deleted])
1070
+ @@index([approver_id, approval_hierarchy_id, approval_condition_id, is_active, is_deleted])
1071
+ @@index([approver_id, approval_hierarchy_id, is_active, is_deleted])
1072
+ @@index([delegate_id, is_active, is_deleted])
1073
+ @@index([start_date, end_date])
1074
+ @@map("approval_delegations")
1075
+ }
1076
+
1077
+ model ApprovalDelegationDelegate {
1078
+ id Int @id @default(autoincrement())
1079
+ delegation_id Int
1080
+ delegation ApprovalDelegation @relation(fields: [delegation_id], references: [id], onDelete: Cascade)
1081
+ delegate_id Int // User who will receive the delegated tasks
1082
+ delegate User @relation("DelegationDelegate", fields: [delegate_id], references: [id], onDelete: Cascade)
1083
+ is_deleted Boolean @default(false)
1084
+ is_active Boolean @default(true)
1085
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1086
+ created_by Int?
1087
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1088
+ updated_by Int?
1089
+ deleted_at DateTime? @db.Timestamptz(6)
1090
+ deleted_by Int?
1091
+
1092
+ @@unique([delegation_id, delegate_id])
1093
+ @@index([delegation_id])
1094
+ @@index([delegate_id])
1095
+ @@map("approval_delegation_delegates")
1096
+ }
1097
+
1098
+ //---------------------------------- APPROVAL DELEGATION MODEL END ------------------------------------------------
1099
+
1100
+ //---------------------------------- TEMPLATE MODEL START ------------------------------------------------
1101
+
1102
+ model Template {
1103
+ id Int @id @default(autoincrement())
1104
+ uuid String? @unique @default(uuid())
1105
+ template_code String? @unique
1106
+ template_name String? @unique
1107
+ template_type Json?
1108
+ currency_id Int?
1109
+ currency Currency? @relation(fields: [currency_id], references: [id], onDelete: Cascade)
1110
+ fields TemplateField[]
1111
+ is_active Boolean? @default(false)
1112
+ is_deleted Boolean? @default(false)
1113
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1114
+ created_by Int?
1115
+ user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)
1116
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1117
+ updated_by Int?
1118
+ deleted_at DateTime? @db.Timestamptz(6)
1119
+ deleted_by Int?
1120
+ event Event[]
1121
+ template_strategies TemplateStrategies[]
1122
+
1123
+ @@map("templates")
1124
+ }
1125
+
1126
+ //---------------------------------- TEMPLATE MODEL END ------------------------------------------------
1127
+
1128
+ //---------------------------------- TEMPLATE STRATEGIES MODEL START ------------------------------------------------
1129
+ model TemplateStrategies {
1130
+ id Int @id @default(autoincrement())
1131
+ template_id Int
1132
+ strategy_id Int
1133
+ template Template @relation(fields: [template_id], references: [id], onDelete: Cascade)
1134
+ strategy Strategies @relation(fields: [strategy_id], references: [id], onDelete: Cascade)
1135
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1136
+ created_by Int?
1137
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1138
+ updated_by Int?
1139
+
1140
+ @@unique([template_id, strategy_id])
1141
+ @@map("template_strategies")
1142
+ }
1143
+
1144
+ //---------------------------------- TEMPLATE STRATEGIES MODEL END ------------------------------------------------
1145
+
1146
+ //---------------------------------- TEMPLATE FIELD MODEL START ------------------------------------------------
1147
+
1148
+ enum FieldType {
1149
+ TEXT
1150
+ NUMBER
1151
+ FORMULA
1152
+ DATE
1153
+ TIME
1154
+ DATETIME
1155
+ PERCENTAGE
1156
+ MEDIA
1157
+ CURRENCY
1158
+ CURRENCY_FORMULA
1159
+ VALUE_FORMULA
1160
+ }
1161
+
1162
+ enum FieldRole {
1163
+ BUYER
1164
+ VENDOR
1165
+ AUTO_CALCULATED
1166
+ }
1167
+
1168
+ enum FieldPlacement {
1169
+ GLOBAL
1170
+ LOCAL
1171
+ }
1172
+
1173
+ model TemplateField {
1174
+ id Int @id @default(autoincrement())
1175
+ uuid String? @unique @default(uuid())
1176
+ template_id Int
1177
+ template Template @relation(fields: [template_id], references: [id])
1178
+ field_name String?
1179
+ field_slug String?
1180
+ field_type FieldType?
1181
+ field_role FieldRole?
1182
+ field_placement FieldPlacement?
1183
+ field_formula String? // Optional formula for formula-driven fields
1184
+ is_mandatory Boolean? @default(false)
1185
+ buyer_only Boolean? @default(false)
1186
+ position Int?
1187
+ is_deleted Boolean? @default(false)
1188
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1189
+ created_by Int?
1190
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1191
+ updated_by Int?
1192
+ deleted_at DateTime? @db.Timestamptz(6)
1193
+ deleted_by Int?
1194
+
1195
+ @@map("template_fields")
1196
+ }
1197
+
1198
+ //---------------------------------- TEMPLATE FIELD MODEL END ------------------------------------------------
1199
+
1200
+ //---------------------------------- FAQ CATEGORY MODEL START ------------------------------------------------
1201
+
1202
+ model FaqCategory {
1203
+ id Int @id @default(autoincrement())
1204
+ uuid String? @unique @default(uuid())
1205
+ category_name String? @unique @db.VarChar(255)
1206
+ slug String? @unique @db.VarChar(255)
1207
+ is_active Boolean? @default(false)
1208
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1209
+ created_by Int?
1210
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1211
+ updated_by Int?
1212
+ is_deleted Boolean? @default(false)
1213
+ deleted_at DateTime? @db.Timestamptz(6)
1214
+ deleted_by Int?
1215
+ faqs Faq[]
1216
+
1217
+ @@map("faq_categories")
1218
+ }
1219
+
1220
+ //---------------------------------- FAQ CATEGORY MODEL END ------------------------------------------------
1221
+
1222
+ //---------------------------------- FAQ MODEL START ------------------------------------------------
1223
+
1224
+ enum FaqType {
1225
+ ADMIN
1226
+ BUYER
1227
+ VENDOR
1228
+ }
1229
+
1230
+ model Faq {
1231
+ id Int @id @default(autoincrement())
1232
+ uuid String? @unique @default(uuid())
1233
+ faq_type FaqType?
1234
+ faq_category_id Int?
1235
+ faq_category FaqCategory? @relation(fields: [faq_category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1236
+ question String? @db.Text()
1237
+ answer String? @db.Text()
1238
+ is_active Boolean? @default(false)
1239
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1240
+ created_by Int?
1241
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1242
+ updated_by Int?
1243
+ is_deleted Boolean? @default(false)
1244
+ deleted_at DateTime? @db.Timestamptz(6)
1245
+ deleted_by Int?
1246
+
1247
+ @@unique([faq_category_id, question, faq_type]) // Composite unique constraint
1248
+ @@map("faqs")
1249
+ }
1250
+
1251
+ //---------------------------------- FAQ MODEL END ------------------------------------------------
1252
+
1253
+ //---------------------------------- EVENT START END ------------------------------------------------
1254
+
1255
+ enum EventStatus {
1256
+ Draft
1257
+ Live
1258
+ Closed
1259
+ Upcoming
1260
+ Cancelled
1261
+ }
1262
+
1263
+ enum EventType {
1264
+ RFQ
1265
+ RFI
1266
+ RFP
1267
+ RAUC
1268
+ FAUC
1269
+ BOQ
1270
+ }
1271
+
1272
+ enum EventPhase {
1273
+ Upcoming
1274
+ Invitation
1275
+ PreBids
1276
+ Bidding
1277
+ Evaluation
1278
+ ClosingSoon
1279
+ Closed
1280
+ PartialClosed
1281
+ Expired
1282
+ }
1283
+
1284
+ model Event {
1285
+ id Int @id @default(autoincrement())
1286
+ uuid String? @unique @default(uuid())
1287
+ code String? @unique
1288
+ template_id Int?
1289
+ template Template? @relation(fields: [template_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1290
+ type EventType?
1291
+ name String?
1292
+ start_date DateTime? @db.Timestamptz(6) // Explicitly use timestamptz
1293
+ end_date DateTime? @db.Timestamptz(6) // Explicitly use timestamptz
1294
+ duration String?
1295
+ attachments Json?
1296
+ terms_conditions String?
1297
+ step_completed Int?
1298
+ status EventStatus? @default(Draft)
1299
+ event_phase EventPhase?
1300
+ purchase_intake_id Int?
1301
+ purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1302
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1303
+ created_by Int?
1304
+ user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)
1305
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1306
+ updated_by Int?
1307
+ is_deleted Boolean? @default(false)
1308
+ reason String?
1309
+ is_published Boolean @default(false)
1310
+ deleted_at DateTime? @db.Timestamptz(6)
1311
+ business_entity_id Int?
1312
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1313
+ deleted_by Int?
1314
+ event_items EventItems[]
1315
+ boq_event_items BoqEventItem[]
1316
+ event_vendors EventVendors[]
1317
+ event_configurations EventConfigurations[]
1318
+ event_strategies EventStrategies[]
1319
+ bids Bid[]
1320
+ bid_logs BidLog[]
1321
+ quotations Quotation[]
1322
+ quotation_logs QuotationLog[]
1323
+ event_rfi_form EventRfiForm[]
1324
+ event_rfi_form_logs EventRfiFormLog[]
1325
+ purchase_order PurchaseOrder[]
1326
+ event_criteria EventCriteria[]
1327
+ conversations Conversation[]
1328
+ blanket_po BlanketPurchaseOrder[]
1329
+
1330
+ @@map("events")
1331
+ }
1332
+
1333
+ //---------------------------------- EVENT MODEL END ------------------------------------------------
1334
+
1335
+ //---------------------------------- EVENT ITEMS MODEL START ------------------------------------------------
1336
+
1337
+ model EventItems {
1338
+ id Int @id @default(autoincrement())
1339
+ uuid String? @unique @default(uuid())
1340
+ event_id Int?
1341
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1342
+ item_id Int?
1343
+ item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1344
+ purchase_intake_id Int?
1345
+ purchase_intake PurchaseIntake? @relation(fields: [purchase_intake_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1346
+ dynamic_fields Json?
1347
+ is_active Boolean? @default(true)
1348
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1349
+ created_by Int?
1350
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1351
+ updated_by Int?
1352
+ is_deleted Boolean? @default(false)
1353
+ deleted_at DateTime? @db.Timestamptz(6)
1354
+ deleted_by Int?
1355
+ bids Bid[]
1356
+ bid_logs BidLog[]
1357
+ quotations Quotation[]
1358
+ quotation_logs QuotationLog[]
1359
+
1360
+ @@map("event_items")
1361
+ }
1362
+
1363
+ //---------------------------------- EVENT ITEMS MODEL END ------------------------------------------------
1364
+
1365
+ //---------------------------------- BOQ EVENT ITEMS MODEL START ------------------------------------------------
1366
+ /// BOQ lines for events without item-master linkage (free-text / JSON fields), parallel to Sourcebay-style event items.
1367
+ model BoqEventItem {
1368
+ id Int @id @default(autoincrement())
1369
+ uuid String? @unique @default(uuid())
1370
+ category_id Int?
1371
+ category Category? @relation("CategoryBoqEventItemAsCategory", fields: [category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1372
+ sub_category_id Int?
1373
+ sub_category Category? @relation("SubCategoryBoqEventItemAsSubCategory", fields: [sub_category_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1374
+ event_id Int?
1375
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1376
+ part_name String?
1377
+ description String? @db.Text
1378
+ part_no String?
1379
+ quantity Decimal? @db.Decimal(18, 4)
1380
+ uom String?
1381
+ dynamic_fields Json?
1382
+ version Int @default(1)
1383
+ parent_version_id Int?
1384
+ parent_version BoqEventItem? @relation("BoqEventItemVersionRelation", fields: [parent_version_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1385
+ sort_order Int @default(0)
1386
+ is_active Boolean? @default(true)
1387
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1388
+ created_by Int?
1389
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1390
+ updated_by Int?
1391
+ is_deleted Boolean? @default(false)
1392
+ deleted_at DateTime? @db.Timestamptz(6)
1393
+ deleted_by Int?
1394
+
1395
+ bids Bid[]
1396
+ bid_logs BidLog[]
1397
+ quotations Quotation[]
1398
+ quotation_logs QuotationLog[]
1399
+ purchase_order_items PurchaseOrderItem[]
1400
+ boq_event_items BoqEventItem[] @relation("BoqEventItemVersionRelation")
1401
+
1402
+ @@index([event_id])
1403
+ @@map("boq_event_items")
1404
+ }
1405
+
1406
+ //---------------------------------- BOQ EVENT ITEMS MODEL END ------------------------------------------------
1407
+
1408
+ //---------------------------------- VENDOR EVENTS MODEL START ------------------------------------------------
1409
+
1410
+ enum EventVendorStatus {
1411
+ Pending
1412
+ Approved
1413
+ Rejected
1414
+ }
1415
+
1416
+ enum EventVendorBidStatus {
1417
+ INVITED
1418
+ VIEWED
1419
+ DRAFT
1420
+ BIDSUBMITTED
1421
+ SUBMITTED
1422
+ ENDED
1423
+ NORESPONSE
1424
+ EVALUATION
1425
+ WON
1426
+ NOTAWARDED
1427
+ CANCELLED
1428
+ EXPIRED
1429
+ ACCEPTED
1430
+ REJECTED
1431
+ LASTBIDREJECTED
1432
+ BLOCKED
1433
+ }
1434
+
1435
+ model EventVendors {
1436
+ id Int @id @default(autoincrement())
1437
+ uuid String? @unique @default(uuid())
1438
+ /// Global vendor primary key in procbay_vendor_db.procbay_schema.vendors (cross-database; see view procbay_schema.event_vendor_with_vendor).
1439
+ vendor_id Int?
1440
+ event_id Int?
1441
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1442
+ is_active Boolean? @default(true)
1443
+ is_email_sent Boolean? @default(false)
1444
+ is_restricted Boolean? @default(false)
1445
+ status EventVendorStatus @default(Pending)
1446
+ reason String?
1447
+ is_wishlisted Boolean? @default(false)
1448
+ event_vendor_bid_status EventVendorBidStatus? @default(INVITED)
1449
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1450
+ created_by Int?
1451
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1452
+ updated_by Int?
1453
+ is_deleted Boolean? @default(false)
1454
+ deleted_at DateTime? @db.Timestamptz(6)
1455
+ deleted_by Int?
1456
+ bids Bid[]
1457
+ bid_logs BidLog[]
1458
+ quotations Quotation[]
1459
+ quotation_logs QuotationLog[]
1460
+ event_rfi_form_logs EventRfiFormLog[]
1461
+ purchase_order PurchaseOrder[]
1462
+ event_vendor_criteria EventVendorCriteria[]
1463
+ blanket_po BlanketPurchaseOrder[]
1464
+
1465
+ @@index([event_id, vendor_id])
1466
+ @@index([status])
1467
+ @@map("event_vendors")
1468
+ }
1469
+
1470
+ //---------------------------------- VENDOR EVENTS MODEL END ------------------------------------------------
1471
+
1472
+ //---------------------------------- EVENTS CONFIGURATIONS MODEL START ------------------------------------------------
1473
+
1474
+ model EventConfigurations {
1475
+ id Int @id @default(autoincrement())
1476
+ uuid String? @unique @default(uuid())
1477
+ event_id Int?
1478
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1479
+ rule_name String?
1480
+ rule_value Json?
1481
+ rule_slug String?
1482
+ is_active Boolean? @default(false)
1483
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1484
+ created_by Int?
1485
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1486
+ updated_by Int?
1487
+ is_deleted Boolean? @default(false)
1488
+ deleted_at DateTime? @db.Timestamptz(6)
1489
+ deleted_by Int?
1490
+
1491
+ @@map("event_configurations")
1492
+ }
1493
+
1494
+ //---------------------------------- EVENTS CONFIGURATIONS MODEL END ------------------------------------------------
1495
+
1496
+ //---------------------------------- EVENTS STRATEGIES MODEL START ------------------------------------------------
1497
+
1498
+ model EventStrategies {
1499
+ id Int @id @default(autoincrement())
1500
+ uuid String? @unique @default(uuid())
1501
+ event_id Int?
1502
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1503
+ strategy_id Int?
1504
+ strategy Strategies? @relation(fields: [strategy_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
1505
+ is_active Boolean? @default(false)
1506
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1507
+ created_by Int?
1508
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1509
+ updated_by Int?
1510
+ is_deleted Boolean? @default(false)
1511
+ deleted_at DateTime? @db.Timestamptz(6)
1512
+ deleted_by Int?
1513
+
1514
+ @@map("event_strategies")
1515
+ }
1516
+
1517
+ //---------------------------------- EVENTS STRATEGIES MODEL END ------------------------------------------------
1518
+
1519
+ //---------------------------------- STRATEGIES MODEL START ------------------------------------------------
1520
+
1521
+ model Strategies {
1522
+ id Int @id @default(autoincrement())
1523
+ uuid String? @unique @default(uuid())
1524
+ name String? @unique
1525
+ slug String? @unique
1526
+ description String?
1527
+ is_active Boolean? @default(false)
1528
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1529
+ created_by Int?
1530
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1531
+ updated_by Int?
1532
+ is_deleted Boolean? @default(false)
1533
+ deleted_at DateTime? @db.Timestamptz(6)
1534
+ deleted_by Int?
1535
+ event_strategies EventStrategies[]
1536
+ template_strategies TemplateStrategies[]
1537
+
1538
+ @@map("strategies")
1539
+ }
1540
+
1541
+ //---------------------------------- STRATEGIES MODEL END ------------------------------------------------
1542
+
1543
+ /////////////////////////////////// START CMS SCHEMA //////////////////////////////
1544
+
1545
+ enum userTypeEnum {
1546
+ ADMIN
1547
+ VENDOR
1548
+ }
1549
+
1550
+ model Cms {
1551
+ id Int @id @default(autoincrement())
1552
+ uuid String? @unique @default(uuid())
1553
+ title String?
1554
+ content String?
1555
+ type userTypeEnum
1556
+ slug String?
1557
+ images Json? @db.JsonB
1558
+ is_active Boolean @default(false)
1559
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1560
+ created_by Int?
1561
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
1562
+ updated_by Int?
1563
+ is_deleted Boolean @default(false)
1564
+ deleted_at DateTime? @db.Timestamptz(6)
1565
+ deleted_by Int?
1566
+
1567
+ @@unique([slug, type])
1568
+ @@map("cms")
1569
+ }
1570
+
1571
+ /////////////////////////////////// END CMS SCHEMA //////////////////////////////
1572
+
1573
+ //---------------------------------- CURRENCY MODEL START ------------------------------------------------
1574
+
1575
+ model Currency {
1576
+ id Int @id @default(autoincrement())
1577
+ uuid String? @unique @default(uuid())
1578
+ name String? @unique
1579
+ code String? @unique
1580
+ symbol String?
1581
+ is_active Boolean? @default(true)
1582
+ is_deleted Boolean? @default(false)
1583
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1584
+ created_by Int?
1585
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1586
+ updated_by Int?
1587
+ deleted_at DateTime? @db.Timestamptz(6)
1588
+ deleted_by Int?
1589
+ template Template[]
1590
+
1591
+ @@map("currencies")
1592
+ }
1593
+
1594
+ //---------------------------------- CURRENCY MODEL END ------------------------------------------------
1595
+
1596
+ //---------------------------------- SUPPORT TICKETS MODEL START ------------------------------------------------
1597
+
1598
+ enum TicketStatusEnum {
1599
+ OPEN
1600
+ IN_PROGRESS
1601
+ RESOLVED
1602
+ CLOSED
1603
+ REOPEN
1604
+ }
1605
+
1606
+ enum TicketPriorityEnum {
1607
+ LOW
1608
+ MEDIUM
1609
+ HIGH
1610
+ CRITICAL
1611
+ }
1612
+
1613
+ enum TicketContactMethodEnum {
1614
+ EMAIL
1615
+ PHONE
1616
+ CHAT
1617
+ }
1618
+
1619
+ model SupportTicket {
1620
+ id Int @id @default(autoincrement())
1621
+ uuid String? @unique @default(uuid())
1622
+ ticket_code String? @unique
1623
+ vendor_id Int?
1624
+ subject String?
1625
+ category_id Int?
1626
+ category SupportCategory? @relation(fields: [category_id], references: [id], onDelete: Cascade)
1627
+ priority TicketPriorityEnum @default(MEDIUM)
1628
+ description String?
1629
+ attachments Json?
1630
+ status TicketStatusEnum @default(OPEN)
1631
+ prefered_contact_method TicketContactMethodEnum
1632
+ is_active Boolean? @default(true)
1633
+ is_deleted Boolean? @default(false)
1634
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1635
+ created_by Int?
1636
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1637
+ updated_by Int?
1638
+ deleted_at DateTime? @db.Timestamptz(6)
1639
+ deleted_by Int?
1640
+ assigned_tickets TicketAssignment[]
1641
+ ticket_history TicketHistory[]
1642
+ ticket_replies TicketReply[]
1643
+
1644
+ @@map("support_tickets")
1645
+ }
1646
+
1647
+ model TicketAssignment {
1648
+ id Int @id @default(autoincrement())
1649
+ uuid String? @unique @default(uuid())
1650
+ ticket_id Int?
1651
+ support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)
1652
+ assigned_by Int?
1653
+ assigned_by_user User? @relation("user_assigned_by", fields: [assigned_by], references: [id], onDelete: Cascade)
1654
+ assigned_to Int?
1655
+ assigned_to_user User? @relation("user_assigned_to", fields: [assigned_to], references: [id], onDelete: Cascade)
1656
+ assigned_at DateTime @default(now()) @db.Timestamptz(6)
1657
+
1658
+ @@map("ticket_assignments")
1659
+ }
1660
+
1661
+ model TicketHistory {
1662
+ id Int @id @default(autoincrement())
1663
+ uuid String? @unique @default(uuid())
1664
+ ticket_id Int?
1665
+ support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)
1666
+ assigned_to Int?
1667
+ assigned_to_user User? @relation("user_assigned_to", fields: [assigned_to], references: [id], onDelete: Cascade)
1668
+ assigned_by Int?
1669
+ assigned_by_user User? @relation("user_assigned_by", fields: [assigned_by], references: [id], onDelete: Cascade)
1670
+ status TicketStatusEnum
1671
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
1672
+
1673
+ @@map("ticket_history")
1674
+ }
1675
+
1676
+ model TicketReply {
1677
+ id Int @id @default(autoincrement())
1678
+ uuid String? @unique @default(uuid())
1679
+ ticket_id Int?
1680
+ support_ticket SupportTicket? @relation(fields: [ticket_id], references: [id], onDelete: Cascade)
1681
+ user_id Int? // User who replied
1682
+ user User? @relation("user_reply", fields: [user_id], references: [id], onDelete: Cascade)
1683
+ vendor_id Int? // Vendor who replied
1684
+ message String?
1685
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1686
+
1687
+ @@map("ticket_replies")
1688
+ }
1689
+
1690
+ //---------------------------------- SUPPORT TICKETS MODEL END ------------------------------------------------
1691
+ //---------------------------------- SUPPORT CATEGORY MODEL START ------------------------------------------------
1692
+
1693
+ model SupportCategory {
1694
+ id Int @id @default(autoincrement())
1695
+ uuid String? @unique @default(uuid())
1696
+ name String? @unique
1697
+ parent_id Int? @default(0)
1698
+ description String?
1699
+ image_url String?
1700
+ is_active Boolean? @default(false)
1701
+ slug String?
1702
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1703
+ created_by Int?
1704
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1705
+ updated_by Int?
1706
+ is_deleted Boolean? @default(false)
1707
+ deleted_at DateTime? @db.Timestamptz(6)
1708
+ deleted_by Int?
1709
+ tickets SupportTicket[]
1710
+
1711
+ @@map("support_categories")
1712
+ }
1713
+
1714
+ //---------------------------------- SUPPORT CATEGORY MODEL END ------------------------------------------------
1715
+
1716
+ //------------------------------------- ADMIN ALERTS MODEL START ------------------------------------------
1717
+
1718
+ enum AlertTypeEnum {
1719
+ PURCHASE_INTAKE
1720
+ PURCHASE_REQUEST
1721
+ PURCHASE_ORDER
1722
+ APPROVAL
1723
+ QUOTATION
1724
+ RFI
1725
+ RFP
1726
+ AUCTION
1727
+ VENDOR_KYC
1728
+ GENERAL
1729
+ CONTRACT
1730
+ CONTRACT_CLAUSE
1731
+ CONTRACT_TEMPLATE
1732
+ UPLOAD
1733
+ EXPORT
1734
+ }
1735
+
1736
+ model AdminAlert {
1737
+ id Int @id @default(autoincrement())
1738
+ user_id Int?
1739
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
1740
+ alert_type AlertTypeEnum?
1741
+ title String?
1742
+ message String?
1743
+ redirect_url String?
1744
+ is_read Boolean @default(false)
1745
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1746
+ meta_data Json? @db.JsonB
1747
+
1748
+ @@map("admin_alerts")
1749
+ }
1750
+
1751
+ //------------------------------------- ADMIN ALERTS MODEL END --------------------------------------------
1752
+
1753
+ //-------------------------------------CUSTOMER NOTIFICATION MODEL START --------------------------------------------
1754
+
1755
+ enum MediumEnum {
1756
+ EMAIL
1757
+ SMS
1758
+ }
1759
+
1760
+ model CustomerNotification {
1761
+ id Int @id @default(autoincrement())
1762
+ uuid String? @unique @default(uuid())
1763
+ template_name String? @db.VarChar(255)
1764
+ remark String?
1765
+ event String? @db.VarChar(255)
1766
+ medium MediumEnum?
1767
+ is_recurring Boolean @default(false)
1768
+ title String?
1769
+ trigger_message String?
1770
+ template_slug String?
1771
+ attachments String[] @default([])
1772
+ files Json[] @db.JsonB
1773
+ is_active Boolean @default(false)
1774
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1775
+ created_by Int?
1776
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
1777
+ updated_by Int?
1778
+ is_deleted Boolean @default(false)
1779
+ deleted_at DateTime? @db.Timestamptz(6)
1780
+ deleted_by Int?
1781
+
1782
+ @@map("customer_notifications")
1783
+ }
1784
+
1785
+ //-------------------------------------CUSTOMER NOTIFICATION MODEL End --------------------------------------------
1786
+
1787
+ //-------------------------------------BID MODEL START --------------------------------------------
1788
+
1789
+ // Bid Status
1790
+ enum BidStatus {
1791
+ NOT_HIGHEST_BIDDER
1792
+ HIGHEST_BIDDER
1793
+ LOWEST_BIDDER
1794
+ NOT_LOWEST_BIDDER
1795
+ CANCELLED
1796
+ REJECTED
1797
+ ACCEPTED
1798
+ LAST_REJECTED
1799
+ COMPLETE_REJECTED
1800
+ }
1801
+
1802
+ model Bid {
1803
+ id Int @id @default(autoincrement())
1804
+ uuid String? @unique @default(uuid())
1805
+ event_id Int?
1806
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
1807
+ event_item_id Int?
1808
+ event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)
1809
+ boq_event_item_id Int?
1810
+ boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)
1811
+ event_type EventType?
1812
+ event_vendor_id Int?
1813
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
1814
+ bid_log_id Int? // Reference to BidLog for detailed bid history
1815
+ bid_log BidLog? @relation(fields: [bid_log_id], references: [id], onDelete: Cascade)
1816
+ bid_amount Float?
1817
+ version Int @default(0) // For optimistic locking
1818
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1819
+ created_by Int?
1820
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
1821
+ updated_by Int?
1822
+ is_deleted Boolean @default(false)
1823
+ deleted_at DateTime? @db.Timestamptz(6)
1824
+ deleted_by Int?
1825
+
1826
+ @@index([event_id, event_item_id])
1827
+ @@index([event_id, boq_event_item_id])
1828
+ @@map("bids")
1829
+ }
1830
+
1831
+ //-------------------------------------BID MODEL END --------------------------------------------
1832
+
1833
+ //-------------------------------------BID LOG MODEL START --------------------------------------------
1834
+
1835
+ model BidLog {
1836
+ id Int @id @default(autoincrement())
1837
+ uuid String? @unique @default(uuid())
1838
+ event_id Int?
1839
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
1840
+ event_item_id Int?
1841
+ event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)
1842
+ boq_event_item_id Int?
1843
+ boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)
1844
+ event_type EventType?
1845
+ event_vendor_id Int?
1846
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
1847
+ bid_amount Float?
1848
+ bid_status BidStatus @default(NOT_HIGHEST_BIDDER)
1849
+ bidding_rank Int?
1850
+ weightage_score Float?
1851
+ is_cancelled Boolean @default(false)
1852
+ auto_cancel Boolean @default(false)
1853
+ cancel_reason String?
1854
+ is_winner Boolean @default(false)
1855
+ is_auto_bid Boolean @default(false)
1856
+ is_placed_by_admin Boolean @default(false)
1857
+ placed_by_id Int?
1858
+ reason String?
1859
+ bid_json Json? // Flexible structure for bid details
1860
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1861
+ created_by Int?
1862
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
1863
+ updated_by Int?
1864
+ is_deleted Boolean @default(false)
1865
+ deleted_at DateTime? @db.Timestamptz(6)
1866
+ deleted_by Int?
1867
+ has_active_counter Boolean @default(false)
1868
+ counter_offer CounterOffer[]
1869
+ bid Bid[]
1870
+
1871
+ @@index([event_id, event_item_id, created_at])
1872
+ @@index([event_id, boq_event_item_id, created_at])
1873
+ @@map("bid_logs")
1874
+ }
1875
+
1876
+ //------------------------------------- BID LOG MODEL END --------------------------------------------
1877
+ //------------------------------------- QUOTATION MODEL END --------------------------------------------
1878
+
1879
+ // Quotation Status
1880
+ enum QuotationStatus {
1881
+ SUBMITTED
1882
+ UNDER_REVIEW
1883
+ ACCEPTED
1884
+ REJECTED
1885
+ REVISED
1886
+ LAST_REJECTED
1887
+ COMPLETE_REJECTED
1888
+ }
1889
+
1890
+ model Quotation {
1891
+ id Int @id @default(autoincrement())
1892
+ uuid String @unique @default(uuid())
1893
+ event_id Int?
1894
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
1895
+ event_item_id Int?
1896
+ event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)
1897
+ boq_event_item_id Int?
1898
+ boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)
1899
+ event_type EventType? // Should be RFQ, RFI, or RFP
1900
+ event_vendor_id Int?
1901
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
1902
+ quotation_log_id Int? // Reference to QuotationLog for detailed history
1903
+ quotation_log QuotationLog? @relation(fields: [quotation_log_id], references: [id], onDelete: Cascade)
1904
+ quote_amount Float?
1905
+ technical_details Json? // Flexible structure for specifications
1906
+ delivery_timeline String?
1907
+ warranty_terms String?
1908
+ payment_terms String?
1909
+ validity_period Int? // Days the quotation remains valid
1910
+ quotation_status QuotationStatus @default(SUBMITTED)
1911
+ quotation_rank Int?
1912
+ current_revision Int @default(1)
1913
+ version Int @default(0) // For optimistic locking
1914
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1915
+ created_by Int?
1916
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
1917
+ updated_by Int?
1918
+ is_deleted Boolean @default(false)
1919
+ deleted_at DateTime? @db.Timestamptz(6)
1920
+ deleted_by Int?
1921
+
1922
+ @@index([event_id, event_item_id])
1923
+ @@index([event_id, boq_event_item_id])
1924
+ @@map("quotations")
1925
+ }
1926
+
1927
+ //------------------------------------- QUOTATION MODEL END --------------------------------------------
1928
+ //------------------------------------- QUOTATION LOG MODEL END --------------------------------------------
1929
+ model QuotationLog {
1930
+ id Int @id @default(autoincrement())
1931
+ uuid String @unique @default(uuid())
1932
+ event_id Int?
1933
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
1934
+ event_item_id Int?
1935
+ event_item EventItems? @relation(fields: [event_item_id], references: [id], onDelete: Cascade)
1936
+ boq_event_item_id Int?
1937
+ boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade)
1938
+ event_type EventType?
1939
+ event_vendor_id Int?
1940
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
1941
+ quote_amount Float?
1942
+ technical_details Json?
1943
+ delivery_timeline String?
1944
+ warranty_terms String?
1945
+ payment_terms String?
1946
+ quotation_status QuotationStatus @default(SUBMITTED)
1947
+ quotation_rank Int?
1948
+ revision_number Int @default(1)
1949
+ review_comments String? // Admin feedback
1950
+ reviewed_by Int?
1951
+ quote_json Json? // Flexible structure for quotation details
1952
+ created_at DateTime @default(now()) @db.Timestamptz(6)
1953
+ created_by Int?
1954
+ updated_at DateTime @default(now()) @db.Timestamptz(6)
1955
+ updated_by Int?
1956
+ has_active_counter Boolean @default(false)
1957
+ counter_offer CounterOffer[]
1958
+ quotation Quotation[]
1959
+
1960
+ @@index([event_id, event_item_id])
1961
+ @@index([event_id, boq_event_item_id])
1962
+ @@map("quotation_logs")
1963
+ }
1964
+
1965
+ //------------------------------------- QUOTATION LOG MODEL END --------------------------------------------
1966
+
1967
+ //------------------------------------ Form Master Models Start ------------------------------------
1968
+ model FormMaster {
1969
+ id Int @id @default(autoincrement())
1970
+ uuid String? @unique @default(uuid())
1971
+ module_name String?
1972
+ module_slug String? @unique
1973
+ is_active Boolean? @default(true)
1974
+ is_deleted Boolean? @default(false)
1975
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
1976
+ created_by Int?
1977
+ user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)
1978
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
1979
+ updated_by Int?
1980
+ deleted_at DateTime? @db.Timestamptz(6)
1981
+ deleted_by Int?
1982
+ dynamic_form DynamicForm[]
1983
+
1984
+ @@map("form_masters")
1985
+ }
1986
+
1987
+ //------------------------------------ Form Master Models End ------------------------------------
1988
+
1989
+ //------------------------------------ Dynamic Form Models Start ------------------------------------
1990
+ model DynamicForm {
1991
+ id Int @id @default(autoincrement())
1992
+ uuid String? @unique @default(uuid())
1993
+ module_id Int?
1994
+ module FormMaster? @relation(fields: [module_id], references: [id], onDelete: Cascade)
1995
+ form_name String?
1996
+ form_slug String?
1997
+ description String?
1998
+ fields Json?
1999
+ form_order Int?
2000
+ is_active Boolean? @default(true)
2001
+ is_deleted Boolean? @default(false)
2002
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
2003
+ created_by Int?
2004
+ user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)
2005
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
2006
+ updated_by Int?
2007
+ deleted_at DateTime? @db.Timestamptz(6)
2008
+ deleted_by Int?
2009
+
2010
+ @@unique([module_id, form_slug])
2011
+ @@map("dynamic_forms")
2012
+ }
2013
+
2014
+ //------------------------------------ Form Builder Models End ------------------------------------
2015
+
2016
+ //------------------------------------ Modules Model Start ----------------------------
2017
+
2018
+ model Module {
2019
+ id Int @id @default(autoincrement()) // Primary Key
2020
+ uuid String? @unique @default(uuid())
2021
+ tenant_config_id Int?
2022
+ tenant_config TenantConfiguration? @relation(fields: [tenant_config_id], references: [id])
2023
+ name String?
2024
+ slug String? @unique
2025
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
2026
+ created_by Int? // Optional field if no constraints are specified
2027
+ sub_modules SubModule[]
2028
+
2029
+ @@map("modules")
2030
+ }
2031
+
2032
+ //------------------------------------ Modules Model End ----------------------------
2033
+
2034
+ //------------------------------------ Tenant Configuration Model Start ----------------------------
2035
+
2036
+ model TenantConfiguration {
2037
+ id Int @id @default(autoincrement())
2038
+ uuid String? @unique @default(uuid())
2039
+ tenant_id Int?
2040
+ tenant_name String?
2041
+ database_name String?
2042
+ tenant_subdomain String?
2043
+ currency String?
2044
+ currency_symbol String?
2045
+ industry String?
2046
+ timezone String?
2047
+ status String?
2048
+ email String?
2049
+ logo String?
2050
+ allowed_modules Module[]
2051
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
2052
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
2053
+
2054
+ @@map("tenant_configurations")
2055
+ }
2056
+
2057
+ //------------------------------------ Tenant Configuration Model End ------------------------------
2058
+
2059
+ //------------------------------------- USER LOGIN ACTIVITY MODEL START --------------------------------------------
2060
+
2061
+ enum LoginActivityUserType {
2062
+ ADMIN
2063
+ VENDOR
2064
+ }
2065
+
2066
+ model UserLoginActivity {
2067
+ id Int @id @default(autoincrement())
2068
+ user_id Int?
2069
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
2070
+ user_type LoginActivityUserType?
2071
+ ip_address String?
2072
+ user_agent String?
2073
+ browser String?
2074
+ device String?
2075
+ platform String?
2076
+ login_timestamp DateTime @default(now()) @db.Timestamptz(6)
2077
+ logout_timestamp DateTime? @db.Timestamptz(6)
2078
+ status String?
2079
+ session_id String?
2080
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2081
+
2082
+ @@map("user_login_activities")
2083
+ }
2084
+
2085
+ //------------------------------------- USER LOGIN ACTIVITY MODEL END --------------------------------------------
2086
+ //------------------------------------- REGION MODEL START --------------------------------------------
2087
+
2088
+ model Region {
2089
+ id Int @id @default(autoincrement())
2090
+ name String? @unique
2091
+ translations Json?
2092
+ wikiDataId String?
2093
+ status Boolean? @default(false)
2094
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2095
+ created_by Int?
2096
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2097
+ updated_by Int?
2098
+ is_deleted Boolean? @default(false)
2099
+ deleted_by Int?
2100
+ deleted_at DateTime? @db.Timestamptz(6)
2101
+ countries Country[]
2102
+ subregions Subregion[]
2103
+
2104
+ @@map("regions")
2105
+ }
2106
+
2107
+ //------------------------------------- REGION MODEL END --------------------------------------------
2108
+ //------------------------------------- SUB REGION MODEL START --------------------------------------------
2109
+
2110
+ model Subregion {
2111
+ id Int @id @default(autoincrement())
2112
+ name String? @unique
2113
+ translations Json?
2114
+ wikiDataId String?
2115
+ status Boolean? @default(false)
2116
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2117
+ created_by Int?
2118
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2119
+ updated_by Int?
2120
+ is_deleted Boolean? @default(false)
2121
+ deleted_by Int?
2122
+ deleted_at DateTime? @db.Timestamptz(6)
2123
+ region Region? @relation(fields: [region_id], references: [id])
2124
+ region_id Int?
2125
+ countries Country[]
2126
+
2127
+ @@index([region_id])
2128
+ @@map("subregions")
2129
+ }
2130
+
2131
+ //------------------------------------- SUB REGION MODEL END --------------------------------------------
2132
+ //------------------------------------- COUNTRY MODEL START --------------------------------------------
2133
+
2134
+ model Country {
2135
+ id Int @id @default(autoincrement())
2136
+ name String?
2137
+ iso3 String? @unique @db.Char(3)
2138
+ iso2 String? @unique @db.Char(2)
2139
+ numeric_code String? @db.Char(3)
2140
+ phonecode String?
2141
+ capital String?
2142
+ currency String?
2143
+ currency_name String?
2144
+ currency_symbol String?
2145
+ tld String?
2146
+ native String?
2147
+ region String?
2148
+ subregion String?
2149
+ nationality String?
2150
+ latitude Decimal? @db.Decimal(10, 8)
2151
+ longitude Decimal? @db.Decimal(11, 8)
2152
+ emoji String?
2153
+ emojiU String?
2154
+ timezones Json?
2155
+ translations Json?
2156
+ wikiDataId String?
2157
+ status Boolean? @default(false)
2158
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2159
+ created_by Int?
2160
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2161
+ updated_by Int?
2162
+ is_deleted Boolean? @default(false)
2163
+ deleted_by Int?
2164
+ deleted_at DateTime? @db.Timestamptz(6)
2165
+ region_relation Region? @relation(fields: [region_id], references: [id])
2166
+ region_id Int?
2167
+ subregion_relation Subregion? @relation(fields: [subregion_id], references: [id])
2168
+ subregion_id Int?
2169
+
2170
+ states State[]
2171
+ cities City[]
2172
+ locations Location[]
2173
+
2174
+ @@index([region_id])
2175
+ @@index([subregion_id])
2176
+ @@map("countries")
2177
+ }
2178
+
2179
+ //------------------------------------- COUNTRY MODEL END --------------------------------------------
2180
+ //------------------------------------- STATE MODEL START --------------------------------------------
2181
+
2182
+ model State {
2183
+ id Int @id @default(autoincrement())
2184
+ name String?
2185
+ state_code String?
2186
+ type String?
2187
+ latitude Decimal? @db.Decimal(10, 8)
2188
+ longitude Decimal? @db.Decimal(11, 8)
2189
+ wikiDataId String?
2190
+ status Boolean? @default(false)
2191
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2192
+ created_by Int?
2193
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2194
+ updated_by Int?
2195
+ is_deleted Boolean? @default(false)
2196
+ deleted_by Int?
2197
+ deleted_at DateTime? @db.Timestamptz(6)
2198
+ country Country? @relation(fields: [country_id], references: [id])
2199
+ country_id Int?
2200
+ cities City[]
2201
+ locations Location[]
2202
+
2203
+ @@unique([name, country_id, state_code], name: "name_country_id_state_code")
2204
+ @@index([country_id])
2205
+ @@map("states")
2206
+ }
2207
+
2208
+ //------------------------------------- STATE MODEL END --------------------------------------------
2209
+ //------------------------------------- CITY MODEL START --------------------------------------------
2210
+
2211
+ model City {
2212
+ id Int @id @default(autoincrement())
2213
+ name String?
2214
+ latitude Decimal? @db.Decimal(10, 8)
2215
+ longitude Decimal? @db.Decimal(11, 8)
2216
+ wikiDataId String?
2217
+ status Boolean? @default(false)
2218
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2219
+ created_by Int?
2220
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2221
+ updated_by Int?
2222
+ is_deleted Boolean? @default(false)
2223
+ deleted_by Int?
2224
+ deleted_at DateTime? @db.Timestamptz(6)
2225
+ state State? @relation(fields: [state_id], references: [id])
2226
+ state_id Int?
2227
+ country Country? @relation(fields: [country_id], references: [id])
2228
+ country_id Int?
2229
+ locations Location[]
2230
+
2231
+ @@unique([name, country_id, state_id], name: "name_country_id_state_id")
2232
+ @@index([state_id])
2233
+ @@index([country_id])
2234
+ @@map("cities")
2235
+ }
2236
+
2237
+ //------------------------------------- CITY MODEL END --------------------------------------------
2238
+ //------------------------------------- LOCATION MODEL START --------------------------------------------
2239
+
2240
+ model Location {
2241
+ id Int @id @default(autoincrement())
2242
+ name String?
2243
+ address String?
2244
+ zipcode String?
2245
+ status Boolean? @default(false)
2246
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2247
+ created_by Int?
2248
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2249
+ updated_by Int?
2250
+ is_deleted Boolean? @default(false)
2251
+ deleted_by Int?
2252
+ deleted_at DateTime? @db.Timestamptz(6)
2253
+ country Country? @relation(fields: [country_id], references: [id])
2254
+ country_id Int?
2255
+ state State? @relation(fields: [state_id], references: [id])
2256
+ state_id Int?
2257
+ city City? @relation(fields: [city_id], references: [id])
2258
+ city_id Int?
2259
+ purchase_intake_item PurchaseIntakeItem[]
2260
+ blanket_po_release BlanketPurchaseOrderRelease[]
2261
+ business_entity_locations BusinessEntityLocation[]
2262
+
2263
+ @@index([country_id])
2264
+ @@index([state_id])
2265
+ @@index([city_id])
2266
+ @@map("locations")
2267
+ }
2268
+
2269
+ //------------------------------------- LOCATION MODEL END --------------------------------------------
2270
+
2271
+ //------------------------------------ Sub Module Model Start ----------------------------
2272
+ model SubModule {
2273
+ id Int @id @default(autoincrement())
2274
+ name String
2275
+ slug String @unique
2276
+ module_id Int?
2277
+ created_by Int?
2278
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2279
+ module Module? @relation(fields: [module_id], references: [id], onDelete: Cascade)
2280
+
2281
+ @@map("sub_modules")
2282
+ }
2283
+
2284
+ //------------------------------------ Sub Module Model END ----------------------------
2285
+
2286
+ //------------------------------------ COUNTER OFFER MODEL START ------------------------------------
2287
+
2288
+ enum CounterOfferStatus {
2289
+ PENDING
2290
+ ACCEPTED
2291
+ REJECTED
2292
+ COUNTERED
2293
+ AUTO_REJECTED
2294
+ }
2295
+
2296
+ model CounterOffer {
2297
+ id Int @id @default(autoincrement())
2298
+ uuid String @unique @default(uuid())
2299
+ bid_log_id Int?
2300
+ bid_log BidLog? @relation(fields: [bid_log_id], references: [id])
2301
+ quotation_log_id Int?
2302
+ quotation_log QuotationLog? @relation(fields: [quotation_log_id], references: [id])
2303
+ counter_amount Float
2304
+ counter_message String?
2305
+ technical_details Json? // For quotations - specific changes requested
2306
+ delivery_timeline String? // For quotations
2307
+ payment_terms String? // For quotations
2308
+ warranty_terms String? // For quotations
2309
+ is_viewed Boolean @default(false)
2310
+ status CounterOfferStatus? @default(PENDING)
2311
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2312
+ created_by Int // Admin/buyer who created the counter offer
2313
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2314
+ updated_by Int?
2315
+ is_deleted Boolean @default(false)
2316
+ deleted_at DateTime? @db.Timestamptz(6)
2317
+ deleted_by Int?
2318
+
2319
+ @@index([bid_log_id])
2320
+ @@index([quotation_log_id])
2321
+ @@map("counter_offers")
2322
+ }
2323
+
2324
+ //------------------------------------ COUNTER OFFER MODEL END ------------------------------------
2325
+
2326
+ //------------------------------------ PURCHASE ORDER MODEL START ------------------------------------
2327
+
2328
+ enum PurchaseOrderStatus {
2329
+ PENDING
2330
+ REQUESTED
2331
+ REJECTED
2332
+ COMPLETED
2333
+ REVOKED
2334
+ EXPIRED
2335
+ PENDING_DELIVERY
2336
+ PARTIALLY_DELIVERED
2337
+ DELIVERED
2338
+ }
2339
+
2340
+ enum PurchaseOrderTypeEnum {
2341
+ PURCHASE_INTAKE
2342
+ FAST_CATALOGUE
2343
+ BLANKET_PURCHASE_ORDER
2344
+ }
2345
+
2346
+ enum DeliveryStatus {
2347
+ PENDING_DELIVERY
2348
+ PARTIALLY_DELIVERED
2349
+ DELIVERED
2350
+ }
2351
+
2352
+ model PurchaseOrder {
2353
+ id Int @id @default(autoincrement())
2354
+ uuid String @unique @default(uuid())
2355
+ event_id Int?
2356
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
2357
+ event_vendor_id Int?
2358
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
2359
+ vendor_id Int?
2360
+ purchase_order_no String? @unique
2361
+ purchase_order_date DateTime? @default(now()) @db.Timestamptz(6)
2362
+ total_amount Decimal? @default(0.00) @db.Decimal(10, 2)
2363
+ po_type PurchaseOrderTypeEnum? @default(PURCHASE_INTAKE)
2364
+ status PurchaseOrderStatus? @default(PENDING)
2365
+ delivery_status DeliveryStatus? @default(PENDING_DELIVERY)
2366
+ attachments Json?
2367
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2368
+ created_by Int?
2369
+ user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)
2370
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2371
+ updated_by Int?
2372
+ is_deleted Boolean @default(false)
2373
+ deleted_at DateTime? @db.Timestamptz(6)
2374
+ deleted_by Int?
2375
+ business_entity_id Int?
2376
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2377
+ purchase_order_activity_log PurchaseOrderActivityLog[]
2378
+ purchase_order_items PurchaseOrderItem[]
2379
+ blanket_po BlanketPurchaseOrder? @relation(fields: [blanket_po_id], references: [id])
2380
+ blanket_po_id Int?
2381
+ blanket_po_releases BlanketPurchaseOrderRelease[]
2382
+ grn GRN[]
2383
+ invoices Invoice[]
2384
+
2385
+ @@index([event_id])
2386
+ @@index([event_vendor_id])
2387
+ @@index([status])
2388
+ @@map("purchase_orders")
2389
+ }
2390
+
2391
+ //------------------------------------ PURCHASE ORDER MODEL END --------------------------------------
2392
+
2393
+ //------------------------------------ PURCHASE ORDER ITEMS MODEL START ------------------------------------
2394
+
2395
+ model PurchaseOrderItem {
2396
+ id Int @id @default(autoincrement())
2397
+ uuid String @unique @default(uuid())
2398
+ purchase_order_id Int?
2399
+ purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)
2400
+ purchase_request_id Int?
2401
+ purchase_request PurchaseIntake? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)
2402
+ item_id Int?
2403
+ item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2404
+ boq_event_item_id Int?
2405
+ boq_event_item BoqEventItem? @relation(fields: [boq_event_item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2406
+ vendor_id Int?
2407
+ amount Decimal? @default(0.00) @db.Decimal(10, 2)
2408
+ quantity Int?
2409
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2410
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2411
+ is_deleted Boolean @default(false)
2412
+ deleted_at DateTime? @db.Timestamptz(6)
2413
+ grn_items GRNItem[]
2414
+ invoice_items InvoiceItem[]
2415
+
2416
+ @@index([purchase_order_id])
2417
+ @@index([purchase_request_id])
2418
+ @@index([item_id])
2419
+ @@index([boq_event_item_id])
2420
+ @@map("purchase_order_items")
2421
+ }
2422
+
2423
+ //------------------------------------ PURCHASE ORDER ITEMS MODEL END --------------------------------------
2424
+
2425
+ //------------------------------------ PURCHASE ORDER ACTIVITY MODEL START --------------------------------------
2426
+
2427
+ enum POActivityType {
2428
+ CREATED
2429
+ REQUESTED
2430
+ UPLOADED
2431
+ SENT_TO_VENDOR
2432
+ COMPLETED
2433
+ CANCELLED
2434
+ OTHER
2435
+ }
2436
+
2437
+ model PurchaseOrderActivityLog {
2438
+ id Int @id @default(autoincrement())
2439
+ uuid String @unique @default(uuid())
2440
+ purchase_order_id Int?
2441
+ purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)
2442
+ user_id Int? // Could be buyer or vendor
2443
+ user User? @relation(fields: [user_id], references: [id], onDelete: SetNull)
2444
+ vendor_id Int?
2445
+ activity_type POActivityType? @default(CREATED)
2446
+ remarks String? // Optional free text for custom remarks
2447
+ metadata Json? // Any additional details (file info, etc.)
2448
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2449
+
2450
+ @@index([purchase_order_id])
2451
+ @@index([user_id])
2452
+ @@index([vendor_id])
2453
+ @@map("purchase_order_activity_logs")
2454
+ }
2455
+
2456
+ //------------------------------------ PURCHASE ORDER ACTIVITY MODEL END --------------------------------------
2457
+
2458
+ //------------------------------------- USER VENDOR SOCKET TOKENS MODEL START --------------------------------------------
2459
+
2460
+ model UserVendorSocketTokens {
2461
+ id Int @id @default(autoincrement())
2462
+ user_id Int?
2463
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
2464
+ vendor_id Int?
2465
+ socket_id String?
2466
+ status Boolean? @default(true)
2467
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2468
+
2469
+ @@map("user_vendor_socket_tokens")
2470
+ }
2471
+
2472
+ //------------------------------------- USER VENDOR SOCKET TOKENS MODEL END --------------------------------------------
2473
+
2474
+ //------------------------------------- EVENT ACTIVITY LOG MODEL START --------------------------------------------
2475
+
2476
+ model ActivityLog {
2477
+ id Int @id @default(autoincrement())
2478
+ uuid String? @unique @default(uuid())
2479
+ user_id Int?
2480
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
2481
+ vendor_id Int?
2482
+ module_name String? // e.g., "PurchaseIntake", "VendorManagement"
2483
+ module_id Int? // ID of the module instance (e.g., PurchaseIntake ID)
2484
+ activity_type String? // e.g., "created", "updated", "deleted"
2485
+ description String?
2486
+ metadata Json? // Additional details about the activity
2487
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2488
+
2489
+ @@index([user_id])
2490
+ @@index([vendor_id])
2491
+ @@map("activity_logs")
2492
+ }
2493
+
2494
+ //------------------------------------- EVENT ACTIVITY LOG MODEL END --------------------------------------------
2495
+
2496
+ //------------------------------------- CONTATC US MODEL END --------------------------------------------
2497
+
2498
+ model ContactUs {
2499
+ id Int @id @default(autoincrement())
2500
+ uuid String? @unique @default(uuid())
2501
+ full_name String?
2502
+ email String?
2503
+ mobile_code String?
2504
+ mobile String?
2505
+ description String?
2506
+ user_id Int?
2507
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
2508
+ is_reply Boolean? @default(false)
2509
+ reply_at DateTime @default(now()) @db.Timestamptz(6)
2510
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2511
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2512
+
2513
+ @@map("contact_us")
2514
+ }
2515
+
2516
+ //------------------------------------- CONTACT US MODEL END --------------------------------------------
2517
+
2518
+ //------------------------------------- UPLOAD MODEL START --------------------------------------------
2519
+
2520
+ enum UploadStatus {
2521
+ PENDING
2522
+ PROCESSING
2523
+ COMPLETED
2524
+ FAILED
2525
+ }
2526
+
2527
+ enum UploadModuleEnum {
2528
+ ITEM_LIBRARY
2529
+ CATEGORY_MASTER
2530
+ SUB_CATEGORY_MASTER
2531
+ UOM_MASTER
2532
+ ATTRIBUTE_MASTER
2533
+ }
2534
+
2535
+ model UploadLog {
2536
+ id Int @id @default(autoincrement())
2537
+ uuid String? @unique @default(uuid())
2538
+ user_id Int
2539
+ user User @relation(fields: [user_id], references: [id])
2540
+ module UploadModuleEnum?
2541
+ file_name String?
2542
+ file_size Int?
2543
+ status UploadStatus @default(PENDING)
2544
+ total_records Int?
2545
+ success_count Int?
2546
+ failure_count Int?
2547
+ error_file_path String?
2548
+ started_at DateTime @default(now())
2549
+ completed_at DateTime?
2550
+ errors Json?
2551
+
2552
+ @@map("upload_logs")
2553
+ }
2554
+
2555
+ //------------------------------------- UPLOAD MODEL END --------------------------------------------
2556
+
2557
+ //------------------------------------- USER EVENT CONFIGURATION MODEL END --------------------------------------------
2558
+
2559
+ model UserEventConfiguration {
2560
+ id Int @id @default(autoincrement())
2561
+ uuid String? @unique @default(uuid())
2562
+ name String?
2563
+ slug String? @unique
2564
+ description String?
2565
+ is_active Boolean @default(false)
2566
+ is_editable Boolean @default(false)
2567
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2568
+ created_by Int?
2569
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2570
+ updated_by Int?
2571
+
2572
+ @@map("user_event_configurations")
2573
+ }
2574
+
2575
+ //------------------------------------- USER EVENT CONFIGURATION MODEL END --------------------------------------------
2576
+
2577
+ //------------------------------------- EXPORT MODEL START ------------------------------------------------------------
2578
+
2579
+ enum ExportStatus {
2580
+ PENDING
2581
+ PROCESSING
2582
+ COMPLETED
2583
+ FAILED
2584
+ }
2585
+
2586
+ enum ExportModuleEnum {
2587
+ ITEM_LIBRARY
2588
+ CATEGORY_MASTER
2589
+ SUB_CATEGORY_MASTER
2590
+ UOM_MASTER
2591
+ ATTRIBUTE_MASTER
2592
+ }
2593
+
2594
+ model ExportLog {
2595
+ id Int @id @default(autoincrement())
2596
+ uuid String? @unique @default(uuid())
2597
+ user_id Int
2598
+ user User @relation(fields: [user_id], references: [id])
2599
+ module UploadModuleEnum?
2600
+ file_name String?
2601
+ file_size Int?
2602
+ file_path String?
2603
+ download_url String?
2604
+ error_message String?
2605
+ total_records Int?
2606
+ processed_records Int? @default(0)
2607
+ filters Json?
2608
+ status UploadStatus @default(PENDING)
2609
+ created_at DateTime @default(now())
2610
+ started_at DateTime?
2611
+ completed_at DateTime?
2612
+ expires_at DateTime? @default(dbgenerated("(NOW() + '7 days'::interval)"))
2613
+
2614
+ @@map("export_logs")
2615
+ }
2616
+
2617
+ //------------------------------------- UPLOAD MODEL END ---------------------------------------------------
2618
+
2619
+ //------------------------------------- FISCAL YEAR MODEL START --------------------------------------------
2620
+
2621
+ model FiscalYear {
2622
+ id Int @id @default(autoincrement())
2623
+ uuid String? @unique @default(uuid())
2624
+ name String? @unique // e.g., "FY 2025-26"
2625
+ start_date DateTime?
2626
+ end_date DateTime?
2627
+ is_active Boolean @default(false) // Only one active year at a time
2628
+ is_default Boolean @default(false) // Mark default for new records
2629
+ created_at DateTime @default(now())
2630
+ created_by Int?
2631
+ updated_at DateTime @updatedAt
2632
+ updated_by Int?
2633
+ is_deleted Boolean @default(false)
2634
+ deleted_at DateTime?
2635
+ deleted_by Int?
2636
+
2637
+ @@index([start_date, end_date])
2638
+ @@map("fiscal_years")
2639
+ }
2640
+
2641
+ //------------------------------------- FISCAL YEAR MODEL END --------------------------------------------
2642
+
2643
+ //------------------------------------- BUDGET MODEL START -----------------------------------------------
2644
+ enum BudgetStatus {
2645
+ WARNING
2646
+ HEALTHY
2647
+ CRITICAL
2648
+ }
2649
+
2650
+ model Budget {
2651
+ id Int @id @default(autoincrement())
2652
+ uuid String? @unique @default(uuid())
2653
+ code String? @unique // Unique code for the budget
2654
+ company_name String?
2655
+ fiscal_year String?
2656
+ currency String? @default("INR")
2657
+ initial_total_annual_budget Decimal? @db.Decimal(15, 2)
2658
+ total_annual_budget Decimal? @db.Decimal(15, 2)
2659
+ description String?
2660
+ status BudgetStatus @default(HEALTHY)
2661
+ created_by Int?
2662
+ created_at DateTime @default(now())
2663
+ updated_by Int?
2664
+ updated_at DateTime @updatedAt
2665
+ is_deleted Boolean @default(false)
2666
+ deleted_at DateTime? @db.Timestamptz(6)
2667
+ deleted_by Int?
2668
+
2669
+ // Relations
2670
+ department_budgets DepartmentBudget[]
2671
+ supporting_documents SupportingDocument[]
2672
+
2673
+ @@unique([code, fiscal_year], name: "unique_budget_code_fiscal_year")
2674
+ @@map("budgets")
2675
+ }
2676
+
2677
+ //------------------------------------- BUDGET MODEL END ---------------------------------------------------------
2678
+
2679
+ //------------------------------------- DEPARTMENT BUDGET MODEL START --------------------------------------------
2680
+ model DepartmentBudget {
2681
+ id Int @id @default(autoincrement())
2682
+ uuid String? @unique @default(uuid())
2683
+ code String? @unique // Unique code for the department budget
2684
+ budget_id Int?
2685
+ department_id Int?
2686
+ initial_allocated_budget Decimal? @db.Decimal(15, 2)
2687
+ allocated_budget Decimal? @db.Decimal(15, 2)
2688
+ remaining_budget Decimal? @default(0) @db.Decimal(15, 2)
2689
+ fiscal_year String? // e.g., "FY 2025-26"
2690
+ notes String?
2691
+ description String?
2692
+ created_by Int?
2693
+ created_at DateTime @default(now())
2694
+ updated_by Int?
2695
+ updated_at DateTime @updatedAt
2696
+ is_deleted Boolean @default(false)
2697
+ deleted_by Int?
2698
+ deleted_at DateTime? @db.Timestamptz(6)
2699
+
2700
+ // Relations
2701
+ budget Budget? @relation(fields: [budget_id], references: [id], onDelete: Cascade)
2702
+ department Department? @relation(fields: [department_id], references: [id], onDelete: Cascade)
2703
+ category_budgets CategoryBudget[]
2704
+ supporting_documents SupportingDocument[]
2705
+
2706
+ @@unique([budget_id, department_id])
2707
+ @@map("department_budgets")
2708
+ }
2709
+
2710
+ //------------------------------------- DEPARTMENT BUDGET MODEL END --------------------------------------------
2711
+
2712
+ //------------------------------------- CATEGORY BUDGET MODEL START --------------------------------------------
2713
+ model CategoryBudget {
2714
+ id Int @id @default(autoincrement())
2715
+ uuid String? @unique @default(uuid())
2716
+ department_budget_id Int?
2717
+ category_id Int?
2718
+ initial_allocated_budget Decimal? @db.Decimal(15, 2)
2719
+ allocated_budget Decimal @db.Decimal(15, 2)
2720
+ remaining_budget Decimal @default(0) @db.Decimal(15, 2)
2721
+ fiscal_year String? // e.g., "FY 2025-26"
2722
+ notes String?
2723
+ description String?
2724
+ total_held_amount Decimal @default(0) @db.Decimal(15, 2) // Running total of all PENDING holds
2725
+ crated_by Int?
2726
+ created_at DateTime @default(now())
2727
+ updated_by Int?
2728
+ updated_at DateTime @updatedAt
2729
+ is_deleted Boolean @default(false)
2730
+ deleted_by Int?
2731
+ deleted_at DateTime? @db.Timestamptz(6)
2732
+
2733
+ // Relations
2734
+ department_budget DepartmentBudget? @relation(fields: [department_budget_id], references: [id], onDelete: Cascade)
2735
+ category Category? @relation(fields: [category_id], references: [id], onDelete: Cascade)
2736
+ expenses Expense[]
2737
+ supporting_documents SupportingDocument[]
2738
+ budget_holds BudgetHold[] // New relation
2739
+
2740
+ @@unique([department_budget_id, category_id])
2741
+ @@map("category_budgets")
2742
+ }
2743
+
2744
+ //------------------------------------- CATEGORY BUDGET MODEL END --------------------------------------------------
2745
+
2746
+ enum BudgetHoldStatus {
2747
+ PENDING
2748
+ RELEASED
2749
+ REJECTED
2750
+ PARTIAL
2751
+ }
2752
+
2753
+ model BudgetHold {
2754
+ id Int @id @default(autoincrement())
2755
+ uuid String? @unique @default(uuid())
2756
+ category_budget_id Int?
2757
+ hold_amount Decimal? @default(0) @db.Decimal(15, 2)
2758
+ consumed_amount Decimal? @default(0) @db.Decimal(15, 2)
2759
+ status BudgetHoldStatus @default(PENDING)
2760
+ reference_type String? // e.g., "PURCHASE_INTAKE", "FAST_CATALOGUE", "BLANKET_PURCHASE_ORDER"
2761
+ reference_id Int? // The ID of the source record that triggered this hold
2762
+ reason String? // Why the hold was created
2763
+ held_at DateTime @default(now()) // When the hold was placed
2764
+ resolved_at DateTime? // When it was approved / rejected / released / cancelled
2765
+ created_by Int?
2766
+ created_at DateTime @default(now())
2767
+ updated_by Int?
2768
+ updated_at DateTime @updatedAt
2769
+ is_deleted Boolean @default(false)
2770
+ deleted_by Int?
2771
+ deleted_at DateTime? @db.Timestamptz(6)
2772
+
2773
+ // Relations
2774
+ category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)
2775
+
2776
+ @@map("budget_holds")
2777
+ }
2778
+
2779
+ //------------------------------------- SUPPORTING DOCUMENT MODEL START --------------------------------------------
2780
+
2781
+ model SupportingDocument {
2782
+ id Int @id @default(autoincrement())
2783
+ uuid String? @unique @default(uuid())
2784
+ budget_id Int?
2785
+ department_budget_id Int?
2786
+ category_budget_id Int?
2787
+ file_name String?
2788
+ original_name String?
2789
+ file_path String?
2790
+ file_size Int?
2791
+ mime_type String?
2792
+ created_by Int?
2793
+ created_at DateTime @default(now())
2794
+ updated_by Int?
2795
+ updated_at DateTime @updatedAt
2796
+ is_deleted Boolean @default(false)
2797
+ deleted_by Int?
2798
+ deleted_at DateTime? @db.Timestamptz(6)
2799
+
2800
+ // Relations
2801
+ budget Budget? @relation(fields: [budget_id], references: [id], onDelete: Cascade)
2802
+ department_budget DepartmentBudget? @relation(fields: [department_budget_id], references: [id], onDelete: Cascade)
2803
+ category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)
2804
+
2805
+ @@map("supporting_documents")
2806
+ }
2807
+
2808
+ //------------------------------------- SUPPORTING DOCUMENT MODEL END --------------------------------------------
2809
+
2810
+ //------------------------------------- EXPENSE MODEL START ------------------------------------------------------
2811
+
2812
+ // For tracking actual expenses against budgets
2813
+ model Expense {
2814
+ id Int @id @default(autoincrement())
2815
+ uuid String? @unique @default(uuid())
2816
+ category_budget_id Int?
2817
+ amount Decimal @db.Decimal(15, 2)
2818
+ description String?
2819
+ expense_date DateTime?
2820
+ receipt_number String?
2821
+ vendor_name String?
2822
+ notes String?
2823
+ created_at DateTime @default(now())
2824
+ updated_at DateTime @updatedAt
2825
+
2826
+ // Relations
2827
+ category_budget CategoryBudget? @relation(fields: [category_budget_id], references: [id], onDelete: Cascade)
2828
+
2829
+ @@map("expenses")
2830
+ }
2831
+
2832
+ //------------------------------------- EXPENSE MODEL END -----------------------------------------------------
2833
+
2834
+ //------------------------------------- VENDOR REFERENCE MODEL START ------------------------------------------
2835
+
2836
+ model VendorReference {
2837
+ id Int @id @default(autoincrement())
2838
+ global_vendor_id Int? // reference id from global vendor
2839
+ tenant_vendor_code String? // reference id from tenant vendor
2840
+ invited_by Int? // who invited the vendor to the tenant
2841
+ user User? @relation(fields: [invited_by], references: [id], onDelete: Cascade)
2842
+ invited_on DateTime?
2843
+ meta_data Json? // Additional metadata about the vendor
2844
+ is_deleted Boolean @default(false)
2845
+ created_at DateTime @default(now())
2846
+ created_by Int?
2847
+ updated_at DateTime @updatedAt
2848
+ updated_by Int?
2849
+ deleted_at DateTime?
2850
+ deleted_by Int?
2851
+
2852
+ @@map("vendor_references")
2853
+ }
2854
+
2855
+ //------------------------------------- VENDOR REFERENCE MODEL END ----------------------------------------------
2856
+
2857
+ //------------------------------------- FAST CATALOGUE MODEL START ----------------------------------------------
2858
+
2859
+ enum RequestedCatalogueStatusEnum {
2860
+ ACTIVE
2861
+ COMPLETED
2862
+ }
2863
+
2864
+ enum RequestedCatalogueSubmissionStatusEnum {
2865
+ PENDING
2866
+ PARTIAL
2867
+ COMPLETED
2868
+ APPROVED
2869
+ }
2870
+
2871
+ model RequestedCatalogue {
2872
+ id Int @id @default(autoincrement())
2873
+ uuid String? @unique @default(uuid())
2874
+ code String? @unique // Unique code for the catalogue
2875
+ request_status RequestedCatalogueStatusEnum? @default(ACTIVE)
2876
+ submission_status RequestedCatalogueSubmissionStatusEnum? @default(PENDING)
2877
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2878
+ created_by Int?
2879
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2880
+ updated_by Int?
2881
+ is_deleted Boolean @default(false)
2882
+ deleted_at DateTime? @db.Timestamptz(6)
2883
+ deleted_by Int?
2884
+ requested_catalogue_details RequestedCatalogueDetails[]
2885
+
2886
+ @@map("requested_catalogues")
2887
+ }
2888
+
2889
+ //------------------------------------- FAST CATALOGUE MODEL END ------------------------------------------------------
2890
+
2891
+ //------------------------------------- FAST CATALOGUE DETAILS MODEL START ----------------------------------------------
2892
+
2893
+ enum RequestedCatalogueDetailsStatusEnum {
2894
+ REQUESTED
2895
+ QUOTED
2896
+ REJECTED
2897
+ AUTO_REJECTED
2898
+ MARK_FOR_LATER
2899
+ ACCEPTED
2900
+ DECLINED
2901
+ }
2902
+
2903
+ model RequestedCatalogueDetails {
2904
+ id Int @id @default(autoincrement())
2905
+ uuid String? @unique @default(uuid())
2906
+ req_catalogue_id Int?
2907
+ req_catalogue RequestedCatalogue? @relation(fields: [req_catalogue_id], references: [id], onDelete: Cascade)
2908
+ item_id Int?
2909
+ parent_item Item? @relation("ParentItemRequests", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2910
+ variant_id Int?
2911
+ variant Item? @relation("VariantItemRequests", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2912
+ vendor_id Int?
2913
+ status RequestedCatalogueDetailsStatusEnum? @default(REQUESTED)
2914
+ stock Int?
2915
+ unit_price Decimal? @db.Decimal(15, 2)
2916
+ created_at DateTime @default(now()) @db.Timestamptz(6)
2917
+ created_by Int?
2918
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
2919
+ updated_by Int?
2920
+ is_deleted Boolean @default(false)
2921
+ deleted_at DateTime? @db.Timestamptz(6)
2922
+ deleted_by Int?
2923
+
2924
+ @@index([req_catalogue_id])
2925
+ @@index([item_id])
2926
+ @@index([variant_id])
2927
+ @@map("requested_catalogue_details")
2928
+ }
2929
+
2930
+ //------------------------------------- FAST CATALOGUE DETAILS MODEL END --------------------------------------------------
2931
+
2932
+ //---------------------------------- CATALOGUE MODEL START ---------------------------------------
2933
+
2934
+ enum CatalogueStatusEnum {
2935
+ ACTIVE
2936
+ INACTIVE
2937
+ }
2938
+
2939
+ model Catalogue {
2940
+ id Int @id @default(autoincrement())
2941
+ uuid String @unique @default(uuid())
2942
+ req_catalogue_id Int?
2943
+ item_id Int?
2944
+ parent_item Item? @relation("ParentItemCatalogue", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2945
+ variant_id Int?
2946
+ variant Item? @relation("VariantItemCatalogue", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2947
+ status CatalogueStatusEnum @default(ACTIVE)
2948
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
2949
+ created_by Int?
2950
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
2951
+ updated_by Int?
2952
+ is_deleted Boolean? @default(false)
2953
+ deleted_at DateTime? @db.Timestamptz(6)
2954
+ deleted_by Int?
2955
+ catalogue_vendors CatalogueVendor[]
2956
+
2957
+ @@index([req_catalogue_id])
2958
+ @@index([item_id])
2959
+ @@index([variant_id])
2960
+ @@map("catalogue")
2961
+ }
2962
+
2963
+ //---------------------------------- CATALOGUE MODEL END ---------------------------------------
2964
+
2965
+ //---------------------------------- CATALOGUE VENDOR MODEL START ---------------------------------------
2966
+
2967
+ enum CatalogueVendorStatusEnum {
2968
+ ACTIVE
2969
+ INACTIVE
2970
+ BLOCKED
2971
+ SUSPENDED
2972
+ PENDING_FOR_APPROVAL
2973
+ REJECTED_FOR_APPROVAL
2974
+ }
2975
+
2976
+ model CatalogueVendor {
2977
+ id Int @id @default(autoincrement())
2978
+ uuid String @unique @default(uuid())
2979
+ catalogue_id Int?
2980
+ catalogue Catalogue? @relation(fields: [catalogue_id], references: [id], onDelete: Cascade)
2981
+ item_id Int?
2982
+ parent_item Item? @relation("ParentItemCatalogueVendor", fields: [item_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2983
+ variant_id Int?
2984
+ variant Item? @relation("VariantItemCatalogueVendor", fields: [variant_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
2985
+ vendor_id Int?
2986
+ stock Int?
2987
+ price Decimal? @db.Decimal(15, 2)
2988
+ status CatalogueVendorStatusEnum @default(ACTIVE)
2989
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
2990
+ created_by Int?
2991
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
2992
+ updated_by Int?
2993
+ is_deleted Boolean? @default(false)
2994
+ deleted_at DateTime? @db.Timestamptz(6)
2995
+ deleted_by Int?
2996
+
2997
+ @@index([catalogue_id])
2998
+ @@index([vendor_id])
2999
+ @@map("catalogue_vendor")
3000
+ }
3001
+
3002
+ //---------------------------------- CATALOGUE VENDOR MODEL END ---------------------------------------
3003
+ //---------------------------------- CATALOGUE CART MODEL START ---------------------------------------
3004
+
3005
+ enum CatalogueCartTypeEnum {
3006
+ BLANKET_PURCHASE_ORDER
3007
+ FAST_CATALOGUE
3008
+ OTHER
3009
+ }
3010
+
3011
+ model CatalogueCart {
3012
+ id Int @id @default(autoincrement())
3013
+ uuid String @unique @default(uuid())
3014
+ user_id Int?
3015
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
3016
+ vendor_id Int?
3017
+ item_id Int?
3018
+ item Item? @relation("ParentItemCatalogueCart", fields: [item_id], references: [id], onDelete: Cascade)
3019
+ variant_id Int?
3020
+ variant Item? @relation("VariantItemCatalogueCart", fields: [variant_id], references: [id], onDelete: Cascade)
3021
+ quantity Int?
3022
+ catalogue_cart_type CatalogueCartTypeEnum? @default(FAST_CATALOGUE)
3023
+ price Decimal? @db.Decimal(15, 2)
3024
+ total_price Decimal? @db.Decimal(15, 2)
3025
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
3026
+ created_by Int?
3027
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3028
+ updated_by Int?
3029
+ is_deleted Boolean? @default(false)
3030
+ deleted_at DateTime? @db.Timestamptz(6)
3031
+ deleted_by Int?
3032
+
3033
+ @@index([user_id])
3034
+ @@index([item_id])
3035
+ @@index([variant_id])
3036
+ @@index([vendor_id])
3037
+ @@map("catalogue_cart")
3038
+ }
3039
+
3040
+ //---------------------------------- CATALOGUE CART MODEL END ---------------------------------------
3041
+
3042
+ //---------------------------------- RFI FORM TEMPLATE MODEL START ---------------------------------------
3043
+ model EventRfiForm {
3044
+ id Int @id @default(autoincrement())
3045
+ uuid String? @unique @default(uuid())
3046
+ event_id Int? @unique
3047
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3048
+ form_data Json? @db.JsonB
3049
+ business_entity_id Int?
3050
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3051
+ is_deleted Boolean @default(false)
3052
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3053
+ created_by Int?
3054
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3055
+ updated_by Int?
3056
+ deleted_at DateTime? @db.Timestamptz(6)
3057
+ deleted_by Int?
3058
+ event_rfi_form_logs EventRfiFormLog[]
3059
+
3060
+ @@index([event_id])
3061
+ @@map("event_rfi_forms")
3062
+ }
3063
+
3064
+ //---------------------------------- RFI FORM TEMPLATE MODEL END ---------------------------------------
3065
+
3066
+ //---------------------------------- RFI SUBMISSION LOG MODEL START ---------------------------------------
3067
+ enum EventRfiFormStatus {
3068
+ PENDING
3069
+ SUBMITTED
3070
+ APPROVED
3071
+ REJECTED
3072
+ DRAFT
3073
+ }
3074
+
3075
+ model EventRfiFormLog {
3076
+ id Int @id @default(autoincrement())
3077
+ uuid String? @unique @default(uuid())
3078
+ event_id Int?
3079
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3080
+ event_vendor_id Int?
3081
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3082
+ rfi_form_id Int?
3083
+ rfi_form EventRfiForm? @relation(fields: [rfi_form_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3084
+ rfi_form_response Json? @db.JsonB
3085
+ status EventRfiFormStatus @default(DRAFT)
3086
+ reviewed_at DateTime? @db.Timestamptz(6)
3087
+ reviewed_by Int?
3088
+ user User? @relation(fields: [reviewed_by], references: [id], onDelete: Cascade)
3089
+ comments String?
3090
+ rating Int?
3091
+ version Int @default(1)
3092
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3093
+ created_by Int?
3094
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3095
+ updated_by Int?
3096
+ is_deleted Boolean @default(false)
3097
+ deleted_at DateTime? @db.Timestamptz(6)
3098
+ deleted_by Int?
3099
+
3100
+ @@index([event_id, event_vendor_id])
3101
+ @@index([event_id, status])
3102
+ @@index([event_vendor_id])
3103
+ @@map("event_rfi_form_logs")
3104
+ }
3105
+
3106
+ //---------------------------------- RFI SUBMISSION LOG MODEL END ---------------------------------------
3107
+
3108
+ //---------------------------------- EVENT CRITERIA MODEL START ------------------------------------------------
3109
+
3110
+ model EventCriteria {
3111
+ id Int @id @default(autoincrement())
3112
+ uuid String? @unique @default(uuid())
3113
+ event_id Int?
3114
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
3115
+ criteria_name String? // e.g., "Price", "Quality", "Delivery", "Technical Specs", etc.
3116
+ criteria_slug String? // Slug for easy identification, e.g., "price", "quality", "delivery"
3117
+ weightage Decimal @db.Decimal(5, 2) // Percentage (0-100), e.g., 40, 30, 30
3118
+ is_price_criteria Boolean @default(false) // True for Price (auto-calculated from lowest bid/quotation)
3119
+ min_score Int? @default(0) // Minimum score value (default: 0)
3120
+ max_score Int? @default(5) // Maximum score value (default: 5)
3121
+ description String? // Optional description/instructions for evaluators
3122
+ display_order Int? @default(0) // Order to display criteria in UI
3123
+ is_active Boolean @default(true)
3124
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3125
+ created_by Int?
3126
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3127
+ updated_by Int?
3128
+ is_deleted Boolean @default(false)
3129
+ deleted_at DateTime? @db.Timestamptz(6)
3130
+ deleted_by Int?
3131
+
3132
+ // Relations
3133
+ event_vendor_criteria EventVendorCriteria[]
3134
+
3135
+ @@index([event_id])
3136
+ @@index([criteria_slug])
3137
+ @@index([is_price_criteria])
3138
+ @@map("event_criteria")
3139
+ }
3140
+
3141
+ //---------------------------------- EVENT CRITERIA MODEL END ------------------------------------------------
3142
+
3143
+ //---------------------------------- EVENT VENDOR CRITERIA MODEL START ------------------------------------------------
3144
+ model EventVendorCriteria {
3145
+ id Int @id @default(autoincrement())
3146
+ uuid String? @unique @default(uuid())
3147
+ event_id Int?
3148
+ event_vendor_id Int?
3149
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
3150
+ event_criteria_id Int?
3151
+ event_criteria EventCriteria? @relation(fields: [event_criteria_id], references: [id], onDelete: Cascade)
3152
+ // Raw values
3153
+ raw_score Decimal? @db.Decimal(10, 2) // For manual criteria: user input (0-5)
3154
+ raw_price Decimal? @db.Decimal(15, 2) // For price criteria: actual bid/quotation amount
3155
+ // Calculated values
3156
+ normalized_score Decimal? @db.Decimal(10, 4) // Normalized score (0-5 scale)
3157
+ weighted_contribution Decimal? @db.Decimal(10, 4) // normalized_score × (weightage/100)
3158
+ // Metadata
3159
+ notes String? // Optional notes/justification for the score
3160
+ scored_at DateTime? @db.Timestamptz(6)
3161
+ scored_by Int? // User who assigned the score
3162
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3163
+ created_by Int?
3164
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3165
+ updated_by Int?
3166
+ is_deleted Boolean @default(false)
3167
+ deleted_at DateTime? @db.Timestamptz(6)
3168
+ deleted_by Int?
3169
+
3170
+ @@unique([event_vendor_id, event_criteria_id], name: "unique_vendor_criteria")
3171
+ @@index([event_id])
3172
+ @@index([event_vendor_id])
3173
+ @@index([event_criteria_id])
3174
+ @@map("event_vendor_criteria")
3175
+ }
3176
+
3177
+ //---------------------------------- EVENT VENDOR CRITERIA MODEL END ------------------------------------------------
3178
+
3179
+ //---------------------------------- CHAT CONVERSATION MODEL START ------------------------------------------------
3180
+ //
3181
+ // CHAT SYSTEM DESIGN:
3182
+ // 1. ONE_ON_ONE: Direct chat between Admin and Vendor (one-to-one)
3183
+ // 2. EVENT_GROUP: Admin creates event conversation, can message all vendors or specific vendors
3184
+ // - Vendors cannot see each other's messages (privacy maintained via MessageRecipient)
3185
+ // - Admin can send broadcast (ALL_PARTICIPANTS) or targeted (SPECIFIC_RECIPIENTS) messages
3186
+ //
3187
+ // MESSAGE FLOW:
3188
+ // - Sender info stored in Message model (sender_user_id or sender_vendor_id)
3189
+ // - Receiver info stored in MessageRecipient model (recipient_user_id or recipient_vendor_id)
3190
+ // - Each vendor only sees messages where they are recipients
3191
+ // - For EVENT_GROUP broadcasts, create MessageRecipient entries for each vendor
3192
+ //
3193
+
3194
+ enum ConversationType {
3195
+ ONE_ON_ONE // User/Admin to Vendor direct chat (one-to-one)
3196
+ EVENT_GROUP // Event group chat - Admin can message all or specific vendors
3197
+ }
3198
+
3199
+ enum ConversationStatus {
3200
+ ACTIVE
3201
+ ARCHIVED
3202
+ DELETED
3203
+ }
3204
+
3205
+ model Conversation {
3206
+ id Int @id @default(autoincrement())
3207
+ uuid String? @unique @default(uuid())
3208
+ type ConversationType @default(ONE_ON_ONE)
3209
+ event_id Int? // For EVENT_GROUP type - links to Event
3210
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
3211
+ admin_user_id Int? // Admin/User who created/manages the conversation
3212
+ admin_user User? @relation("ConversationAdminUser", fields: [admin_user_id], references: [id], onDelete: Cascade)
3213
+ vendor_id Int? // For ONE_ON_ONE type - the vendor in conversation (not used for EVENT_GROUP)
3214
+ title String? // Optional title for group chats
3215
+ status ConversationStatus @default(ACTIVE)
3216
+ last_message_at DateTime? @db.Timestamptz(6)
3217
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3218
+ created_by Int?
3219
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3220
+ updated_by Int?
3221
+ is_deleted Boolean @default(false)
3222
+ deleted_at DateTime? @db.Timestamptz(6)
3223
+ deleted_by Int?
3224
+
3225
+ // Relations
3226
+ messages Message[]
3227
+ conversation_participants ConversationParticipant[]
3228
+
3229
+ // Unique constraint: For ONE_ON_ONE - one conversation per admin-vendor pair
3230
+ // For EVENT_GROUP - vendor_id is NULL, so multiple conversations per admin-event are allowed
3231
+ @@unique([admin_user_id, vendor_id, event_id], name: "unique_one_on_one_conversation")
3232
+ @@index([admin_user_id])
3233
+ @@index([vendor_id])
3234
+ @@index([event_id])
3235
+ @@index([type])
3236
+ @@index([status])
3237
+ @@map("conversations")
3238
+ }
3239
+
3240
+ //---------------------------------- CHAT CONVERSATION MODEL END ------------------------------------------------
3241
+
3242
+ //---------------------------------- CONVERSATION PARTICIPANT MODEL START ------------------------------------------------
3243
+
3244
+ model ConversationParticipant {
3245
+ id Int @id @default(autoincrement())
3246
+ uuid String? @unique @default(uuid())
3247
+ conversation_id Int
3248
+ conversation Conversation @relation(fields: [conversation_id], references: [id], onDelete: Cascade)
3249
+
3250
+ // Participant Information
3251
+ user_id Int? // Participant: Admin/User ID (for admin participants)
3252
+ user User? @relation("ConversationParticipantUser", fields: [user_id], references: [id], onDelete: Cascade)
3253
+ vendor_id Int? // Participant: Vendor ID (for vendor participants)
3254
+ is_admin Boolean @default(false) // True if user participant is admin
3255
+
3256
+ // Participation Tracking
3257
+ joined_at DateTime @default(now()) @db.Timestamptz(6)
3258
+ left_at DateTime? @db.Timestamptz(6)
3259
+ last_read_at DateTime? @db.Timestamptz(6)
3260
+ is_active Boolean @default(true)
3261
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3262
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3263
+
3264
+ @@unique([conversation_id, user_id, vendor_id], name: "unique_participant")
3265
+ @@index([conversation_id])
3266
+ @@index([user_id])
3267
+ @@index([vendor_id])
3268
+ @@map("conversation_participants")
3269
+ }
3270
+
3271
+ //---------------------------------- CONVERSATION PARTICIPANT MODEL END ------------------------------------------------
3272
+
3273
+ //---------------------------------- MESSAGE MODEL START ------------------------------------------------
3274
+
3275
+ enum MessageType {
3276
+ TEXT
3277
+ FILE
3278
+ SYSTEM
3279
+ }
3280
+
3281
+ enum MessageSenderType {
3282
+ USER // Admin/User sender
3283
+ VENDOR // Vendor sender
3284
+ }
3285
+
3286
+ enum MessageBroadcastType {
3287
+ ALL_PARTICIPANTS // Sent to all participants in EVENT_GROUP conversation
3288
+ SPECIFIC_RECIPIENTS // Sent to specific recipients (handled via MessageRecipient)
3289
+ }
3290
+
3291
+ model Message {
3292
+ id Int @id @default(autoincrement())
3293
+ uuid String? @unique @default(uuid())
3294
+ conversation_id Int
3295
+ conversation Conversation @relation(fields: [conversation_id], references: [id], onDelete: Cascade)
3296
+
3297
+ // Sender Information (clear naming)
3298
+ sender_type MessageSenderType // USER (Admin) or VENDOR
3299
+ sender_user_id Int? // Sender: Admin/User ID (if sender_type is USER)
3300
+ sender_user User? @relation("MessageSenderUser", fields: [sender_user_id], references: [id], onDelete: SetNull)
3301
+ sender_vendor_id Int? // Sender: Vendor ID (if sender_type is VENDOR)
3302
+
3303
+ // Broadcast Type (for EVENT_GROUP conversations)
3304
+ broadcast_type MessageBroadcastType @default(SPECIFIC_RECIPIENTS) // ALL_PARTICIPANTS or SPECIFIC_RECIPIENTS
3305
+
3306
+ // Message Content
3307
+ message_type MessageType @default(TEXT)
3308
+ content String? // Text content
3309
+ file Json? // For multiple files
3310
+ is_edited Boolean @default(false)
3311
+ edited_at DateTime? @db.Timestamptz(6)
3312
+ is_deleted Boolean @default(false)
3313
+ deleted_at DateTime? @db.Timestamptz(6)
3314
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3315
+ created_by Int?
3316
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3317
+ updated_by Int?
3318
+
3319
+ // Reply functionality - allows users to reply to their own or other messages
3320
+ reply_to_message_id Int? // ID of the message being replied to (self-referential)
3321
+ reply_to_message Message? @relation("MessageReplies", fields: [reply_to_message_id], references: [id], onDelete: SetNull)
3322
+ replies Message[] @relation("MessageReplies") // Messages that reply to this message
3323
+
3324
+ // Relations
3325
+ recipients MessageRecipient[] // Receivers are stored here (vendors cannot see each other's messages)
3326
+
3327
+ @@index([conversation_id])
3328
+ @@index([sender_user_id])
3329
+ @@index([sender_vendor_id])
3330
+ @@index([sender_type])
3331
+ @@index([broadcast_type])
3332
+ @@index([created_at])
3333
+ @@index([reply_to_message_id])
3334
+ @@map("messages")
3335
+ }
3336
+
3337
+ //---------------------------------- MESSAGE MODEL END ------------------------------------------------
3338
+
3339
+ //---------------------------------- MESSAGE RECIPIENT MODEL START ------------------------------------------------
3340
+
3341
+ enum MessageRecipientType {
3342
+ USER // Admin/User recipient
3343
+ VENDOR // Vendor recipient
3344
+ }
3345
+
3346
+ enum MessageReadStatus {
3347
+ SENT
3348
+ DELIVERED
3349
+ READ
3350
+ }
3351
+
3352
+ model MessageRecipient {
3353
+ id Int @id @default(autoincrement())
3354
+ uuid String? @unique @default(uuid())
3355
+ message_id Int
3356
+ message Message @relation(fields: [message_id], references: [id], onDelete: Cascade)
3357
+
3358
+ // Receiver Information (clear naming)
3359
+ recipient_type MessageRecipientType // USER (Admin) or VENDOR
3360
+ recipient_user_id Int? // Receiver: Admin/User ID (if recipient_type is USER)
3361
+ recipient_user User? @relation("MessageRecipientUser", fields: [recipient_user_id], references: [id], onDelete: Cascade)
3362
+ recipient_vendor_id Int? // Receiver: Vendor ID (if recipient_type is VENDOR)
3363
+
3364
+ // Read Status Tracking
3365
+ read_status MessageReadStatus @default(SENT)
3366
+ read_at DateTime? @db.Timestamptz(6)
3367
+ delivered_at DateTime? @db.Timestamptz(6)
3368
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3369
+
3370
+ @@unique([message_id, recipient_user_id, recipient_vendor_id], name: "unique_message_recipient")
3371
+ @@index([message_id])
3372
+ @@index([recipient_user_id])
3373
+ @@index([recipient_vendor_id])
3374
+ @@index([recipient_type])
3375
+ @@index([read_status])
3376
+ @@map("message_recipients")
3377
+ }
3378
+
3379
+ //---------------------------------- MESSAGE RECIPIENT MODEL END ------------------------------------------------
3380
+
3381
+ //------------------------------------ BLANKET PURCHASE ORDER MODEL START ------------------------------------
3382
+
3383
+ enum BlanketPurchaseOrderStatus {
3384
+ PENDING
3385
+ ACTIVE
3386
+ EXPIRED
3387
+ COMPLETED
3388
+ REJECTED
3389
+ }
3390
+
3391
+ enum ReleaseFrequency {
3392
+ DAILY
3393
+ WEEKLY
3394
+ MONTHLY
3395
+ QUARTERLY
3396
+ CUSTOM
3397
+ }
3398
+
3399
+ enum SplitMethod {
3400
+ EQUAL_SPLIT
3401
+ CUSTOM_SPLIT
3402
+ }
3403
+
3404
+ model BlanketPurchaseOrder {
3405
+ id Int @id @default(autoincrement())
3406
+ uuid String @unique @default(uuid())
3407
+ bpo_number String? @unique
3408
+ event_id Int?
3409
+ event Event? @relation(fields: [event_id], references: [id], onDelete: Cascade)
3410
+ event_vendor_id Int?
3411
+ event_vendor EventVendors? @relation(fields: [event_vendor_id], references: [id], onDelete: Cascade)
3412
+ vendor_id Int?
3413
+ bpo_date DateTime @default(now()) @db.Timestamptz(6)
3414
+ start_date DateTime? @db.Timestamptz(6)
3415
+ end_date DateTime? @db.Timestamptz(6)
3416
+ total_bpo_value Decimal @default(0.00) @db.Decimal(15, 2)
3417
+ fulfilled_quantity Int @default(0)
3418
+ total_quantity Int @default(0)
3419
+ status BlanketPurchaseOrderStatus @default(PENDING)
3420
+ attachments Json? @db.JsonB
3421
+ terms_conditions String?
3422
+ notes String?
3423
+ business_entity_id Int?
3424
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade)
3425
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3426
+ created_by Int?
3427
+ user User? @relation(fields: [created_by], references: [id], onDelete: Cascade)
3428
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3429
+ updated_by Int?
3430
+ is_deleted Boolean @default(false)
3431
+ deleted_at DateTime? @db.Timestamptz(6)
3432
+ deleted_by Int?
3433
+ blanket_po_items BlanketPurchaseOrderItem[]
3434
+ blanket_po_releases BlanketPurchaseOrderRelease[]
3435
+ generated_purchase_orders PurchaseOrder[]
3436
+
3437
+ @@index([vendor_id])
3438
+ @@index([event_id])
3439
+ @@index([event_vendor_id])
3440
+ @@index([status])
3441
+ @@index([bpo_date])
3442
+ @@index([start_date, end_date])
3443
+ @@map("blanket_purchase_orders")
3444
+ }
3445
+
3446
+ //------------------------------------ BLANKET PURCHASE ORDER MODEL END ------------------------------------
3447
+
3448
+ //------------------------------------ BLANKET PURCHASE ORDER ITEM MODEL START ------------------------------------
3449
+
3450
+ model BlanketPurchaseOrderItem {
3451
+ id Int @id @default(autoincrement())
3452
+ uuid String @unique @default(uuid())
3453
+ blanket_po_id Int
3454
+ blanket_po BlanketPurchaseOrder @relation(fields: [blanket_po_id], references: [id], onDelete: Cascade)
3455
+ item_id Int?
3456
+ item Item? @relation(fields: [item_id], references: [id], onDelete: Cascade)
3457
+ total_quantity Int
3458
+ fulfilled_quantity Int @default(0)
3459
+ unit_price Decimal? @db.Decimal(15, 2)
3460
+ total_amount Decimal? @db.Decimal(15, 2)
3461
+ release_frequency ReleaseFrequency?
3462
+ split_method SplitMethod?
3463
+ purchase_request_id Int?
3464
+ purchase_request PurchaseIntake? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)
3465
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3466
+ created_by Int?
3467
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3468
+ updated_by Int?
3469
+ is_deleted Boolean @default(false)
3470
+ deleted_at DateTime? @db.Timestamptz(6)
3471
+ deleted_by Int?
3472
+ blanket_po_releases BlanketPurchaseOrderRelease[]
3473
+
3474
+ @@index([blanket_po_id])
3475
+ @@index([item_id])
3476
+ @@map("blanket_purchase_order_items")
3477
+ }
3478
+
3479
+ //------------------------------------ BLANKET PURCHASE ORDER ITEM MODEL END ------------------------------------
3480
+
3481
+ //------------------------------------ BLANKET PURCHASE ORDER RELEASE MODEL START ------------------------------------
3482
+
3483
+ enum BlanketPurchaseOrderReleaseStatus {
3484
+ PLANNED
3485
+ COMPLETED
3486
+ REJECTED
3487
+ PARTIAL
3488
+ EXPIRED
3489
+ }
3490
+
3491
+ model BlanketPurchaseOrderRelease {
3492
+ id Int @id @default(autoincrement())
3493
+ uuid String @unique @default(uuid())
3494
+ blanket_po_id Int
3495
+ blanket_po BlanketPurchaseOrder? @relation(fields: [blanket_po_id], references: [id])
3496
+ blanket_po_item_id Int
3497
+ blanket_po_item BlanketPurchaseOrderItem @relation(fields: [blanket_po_item_id], references: [id], onDelete: Cascade)
3498
+ release_number Int
3499
+ release_date DateTime @db.Timestamptz(6)
3500
+ release_quantity Int
3501
+ fulfilled_quantity Int @default(0)
3502
+ release_value Decimal @db.Decimal(15, 2)
3503
+ delivery_location_id Int?
3504
+ delivery_location Location? @relation(fields: [delivery_location_id], references: [id])
3505
+ purchase_order_id Int?
3506
+ purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)
3507
+ delivery_date DateTime? @db.Timestamptz(6)
3508
+ status BlanketPurchaseOrderReleaseStatus @default(PLANNED)
3509
+ notes String?
3510
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3511
+ created_by Int?
3512
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3513
+ updated_by Int?
3514
+ is_deleted Boolean @default(false)
3515
+ deleted_at DateTime? @db.Timestamptz(6)
3516
+ deleted_by Int?
3517
+
3518
+ @@index([blanket_po_id])
3519
+ @@index([blanket_po_item_id])
3520
+ @@index([status])
3521
+ @@index([release_date])
3522
+ @@index([delivery_date])
3523
+ @@map("blanket_purchase_order_releases")
3524
+ }
3525
+
3526
+ //------------------------------------ BLANKET PURCHASE ORDER RELEASE MODEL END ------------------------------------
3527
+
3528
+ //------------------------------------ GRN MODEL START ------------------------------------
3529
+
3530
+ enum GRNStatus {
3531
+ PENDING
3532
+ PARTIAL
3533
+ COMPLETED
3534
+ REJECTED
3535
+ }
3536
+
3537
+ enum InspectionStatus {
3538
+ PENDING
3539
+ PARTIAL
3540
+ COMPLETED
3541
+ REJECTED
3542
+ }
3543
+
3544
+ model GRN {
3545
+ id Int @id @default(autoincrement())
3546
+ uuid String @unique @default(uuid())
3547
+
3548
+ // GRN details
3549
+ grn_number String? @unique
3550
+ purchase_order_id Int?
3551
+ purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)
3552
+ dispatch_date_time DateTime? @db.Timestamptz(6)
3553
+ expected_arrival_date DateTime? @db.Timestamptz(6)
3554
+ received_date_time DateTime? @db.Timestamptz(6)
3555
+ received_by String?
3556
+ remarks String?
3557
+ start_point String?
3558
+ end_point String?
3559
+ transporter_name String?
3560
+ transport_vehicle_registration_number String?
3561
+ transport_vehicle_type String?
3562
+ challan_number String?
3563
+ driver_name String?
3564
+ country_code String?
3565
+ driver_contact_number String?
3566
+ e_way_bill_number String?
3567
+ tracking_link String?
3568
+ delivery_challan_documents Json? @db.JsonB
3569
+ grn_status GRNStatus @default(PENDING)
3570
+ delivery_challan_number String?
3571
+
3572
+ // inspection details
3573
+ inspection_date_time DateTime? @db.Timestamptz(6)
3574
+ inspection_code String? @unique
3575
+ warehouse String?
3576
+ inspector_name String?
3577
+ inspection_status InspectionStatus @default(PENDING)
3578
+ business_entity_id Int?
3579
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3580
+
3581
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3582
+ created_by Int?
3583
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3584
+ updated_by Int?
3585
+ is_deleted Boolean @default(false)
3586
+ deleted_at DateTime? @db.Timestamptz(6)
3587
+ deleted_by Int?
3588
+ grn_items GRNItem[]
3589
+ invoices Invoice[]
3590
+ }
3591
+
3592
+ //------------------------------------ GRN MODEL END ------------------------------------
3593
+
3594
+ //------------------------------------ GRN ITEM MODEL START ------------------------------------
3595
+
3596
+ enum GRNItemStatus {
3597
+ PENDING
3598
+ PARTIAL
3599
+ REJECTED
3600
+ COMPLETED
3601
+ }
3602
+
3603
+ model GRNItem {
3604
+ id Int @id @default(autoincrement())
3605
+ uuid String @unique @default(uuid())
3606
+ grn_id Int?
3607
+ grn GRN? @relation(fields: [grn_id], references: [id], onDelete: Cascade)
3608
+ purchase_order_item_id Int?
3609
+ purchase_order_item PurchaseOrderItem? @relation(fields: [purchase_order_item_id], references: [id], onDelete: Cascade)
3610
+ dispatch_quantity Int @default(0)
3611
+ received_quantity Int @default(0)
3612
+ accepted_quantity Int @default(0)
3613
+ remarks String?
3614
+ inspection_remarks String?
3615
+ inspection_attachments Json? @db.JsonB
3616
+ status GRNItemStatus @default(PENDING)
3617
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3618
+ created_by Int?
3619
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3620
+ updated_by Int?
3621
+ is_deleted Boolean @default(false)
3622
+ deleted_at DateTime? @db.Timestamptz(6)
3623
+ deleted_by Int?
3624
+ }
3625
+
3626
+ //------------------------------------ GRN ITEM MODEL END ------------------------------------
3627
+
3628
+ // ------------------------------------ Business Entity MODEL START ------------------------------------
3629
+
3630
+ enum BusinessEntityType {
3631
+ INDIVIDUAL
3632
+ COMPANY
3633
+ PARENT_COMPANY
3634
+ SUBSIDIARY_COMPANY
3635
+ BRANCH_COMPANY
3636
+ }
3637
+
3638
+ model BusinessEntity {
3639
+ id Int @id @default(autoincrement())
3640
+ uuid String? @unique @default(uuid())
3641
+ business_code String? @unique
3642
+ business_name String?
3643
+ business_email String?
3644
+ business_country_code String?
3645
+ business_phone String?
3646
+ business_website String?
3647
+ business_logo String?
3648
+ business_description String?
3649
+ business_type BusinessEntityType? @default(INDIVIDUAL)
3650
+ is_active Boolean? @default(true)
3651
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
3652
+ created_by Int?
3653
+ updated_at DateTime? @updatedAt @db.Timestamptz(6)
3654
+ updated_by Int?
3655
+ is_deleted Boolean? @default(false)
3656
+ deleted_at DateTime? @db.Timestamptz(6)
3657
+ deleted_by Int?
3658
+ business_entity_departments BusinessEntityDepartment[]
3659
+ business_entity_locations BusinessEntityLocation[]
3660
+ user_department_entities UserDepartmentEntity[]
3661
+ purchase_intakes PurchaseIntake[]
3662
+ events Event[]
3663
+ purchase_orders PurchaseOrder[]
3664
+ event_rfi_forms EventRfiForm[]
3665
+ grns GRN[]
3666
+ invoices Invoice[]
3667
+ blanket_purchase_orders BlanketPurchaseOrder[]
3668
+ approval_hierarchies ApprovalHierarchy[]
3669
+
3670
+ @@map("business_entities")
3671
+ }
3672
+
3673
+ // Many-to-many join table: one BusinessEntity can have multiple Locations,
3674
+ // one Location can belong to multiple BusinessEntities.
3675
+ model BusinessEntityLocation {
3676
+ id Int @id @default(autoincrement())
3677
+ business_entity_id Int
3678
+ location_id Int
3679
+ is_primary Boolean? @default(false)
3680
+ created_at DateTime? @default(now()) @db.Timestamptz(6)
3681
+ created_by Int?
3682
+ business_entity BusinessEntity @relation(fields: [business_entity_id], references: [id])
3683
+ location Location @relation(fields: [location_id], references: [id])
3684
+
3685
+ @@unique([business_entity_id, location_id])
3686
+ @@map("business_entity_locations")
3687
+ }
3688
+
3689
+ // ------------------------------------ Business Entity MODEL END ------------------------------------
3690
+
3691
+ // ------------------------------------ INVOICE (BILLS) MODEL START ------------------------------------
3692
+
3693
+ enum InvoiceStatus {
3694
+ PENDING
3695
+ SEND_BACK
3696
+ RESUBMITTED
3697
+ APPROVED
3698
+ PAID
3699
+ CANCELLED
3700
+ }
3701
+
3702
+ enum InvoiceMatchingStatus {
3703
+ MATCHED
3704
+ MISMATCHED
3705
+ }
3706
+
3707
+ model Invoice {
3708
+ id Int @id @default(autoincrement())
3709
+ uuid String @unique @default(uuid())
3710
+ invoice_number String? @unique
3711
+ purchase_order_id Int?
3712
+ purchase_order PurchaseOrder? @relation(fields: [purchase_order_id], references: [id], onDelete: Cascade)
3713
+ grn_id Int?
3714
+ grn GRN? @relation(fields: [grn_id], references: [id])
3715
+ vendor_id Int?
3716
+ invoice_date DateTime? @db.Timestamptz(6)
3717
+ invoice_due_date DateTime? @db.Timestamptz(6)
3718
+ delivery_note_number String?
3719
+ quantity_fulfilled Int? @default(0)
3720
+ total_po_releases Int? @default(0)
3721
+ billing_address String?
3722
+ status InvoiceStatus @default(PENDING)
3723
+ matching_status InvoiceMatchingStatus @default(MISMATCHED)
3724
+ invoice_documents Json? @db.JsonB
3725
+ notes String?
3726
+ business_entity_id Int?
3727
+ terms_and_conditions String?
3728
+ e_way_bill_number String?
3729
+ business_entity BusinessEntity? @relation(fields: [business_entity_id], references: [id], onDelete: Cascade, onUpdate: Cascade)
3730
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3731
+ created_by Int?
3732
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3733
+ updated_by Int?
3734
+ is_deleted Boolean @default(false)
3735
+ deleted_at DateTime? @db.Timestamptz(6)
3736
+ deleted_by Int?
3737
+ invoice_items InvoiceItem[]
3738
+
3739
+ @@index([purchase_order_id])
3740
+ @@index([grn_id])
3741
+ @@index([vendor_id])
3742
+ @@index([status])
3743
+ @@index([matching_status])
3744
+ @@map("invoices")
3745
+ }
3746
+
3747
+ // ------------------------------------ INVOICE (BILLS) MODEL END ------------------------------------
3748
+
3749
+ // ------------------------------------ INVOICE ITEM MODEL START ------------------------------------
3750
+
3751
+ model InvoiceItem {
3752
+ id Int @id @default(autoincrement())
3753
+ uuid String @unique @default(uuid())
3754
+ invoice_id Int?
3755
+ invoice Invoice? @relation(fields: [invoice_id], references: [id], onDelete: Cascade)
3756
+ purchase_order_item_id Int?
3757
+ purchase_order_item PurchaseOrderItem? @relation(fields: [purchase_order_item_id], references: [id])
3758
+ ordered_quantity Int? @default(0)
3759
+ invoice_quantity Int? @default(0)
3760
+ uom String?
3761
+ unit_amount Decimal @default(0) @db.Decimal(15, 2)
3762
+ total_amount Decimal @default(0) @db.Decimal(15, 2)
3763
+ po_quantity Int? @default(0)
3764
+ grn_quantity Int? @default(0)
3765
+ quality_quantity Int? @default(0)
3766
+ matching_status InvoiceMatchingStatus @default(MISMATCHED)
3767
+ resolution_action String?
3768
+ resolution_remarks String?
3769
+ resolved_at DateTime? @db.Timestamptz(6)
3770
+ resolved_by Int?
3771
+
3772
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3773
+ created_by Int?
3774
+ updated_at DateTime @updatedAt @db.Timestamptz(6)
3775
+ updated_by Int?
3776
+ is_deleted Boolean @default(false)
3777
+ deleted_at DateTime? @db.Timestamptz(6)
3778
+ deleted_by Int?
3779
+
3780
+ @@index([invoice_id])
3781
+ @@index([purchase_order_item_id])
3782
+ @@index([matching_status])
3783
+ @@map("invoice_items")
3784
+ }
3785
+
3786
+ // ------------------------------------ INVOICE ITEM MODEL END ------------------------------------
3787
+
3788
+ // ------------------------------------ APPROVAL MANAGEMENT MODEL START --------------------------------
3789
+
3790
+ enum ApprovalManagementStatusEnum {
3791
+ PENDING
3792
+ APPROVED
3793
+ REJECTED
3794
+ }
3795
+
3796
+ model ApprovalManagement {
3797
+ id Int @id @default(autoincrement())
3798
+ uuid String @unique @default(uuid())
3799
+ journy_type String? // module e.g. user-management, event-management
3800
+ journey_task String? // task e.g. user-updation-approval, event-bid-award-approval
3801
+ parent_id String? // parent entity uuid (user, event, PI, etc.)
3802
+ user_id Int? // optional when subject is a user
3803
+ user User? @relation(fields: [user_id], references: [id], onDelete: Cascade)
3804
+ proposed_payload Json?
3805
+ previous_snapshot Json?
3806
+ estimated_budget Decimal? @db.Decimal(18, 2)
3807
+ batch_id String?
3808
+ request_status ApprovalManagementStatusEnum @default(PENDING)
3809
+ reject_reason String?
3810
+ created_at DateTime @default(now()) @db.Timestamptz(6)
3811
+ created_by Int?
3812
+
3813
+ @@index([parent_id])
3814
+ @@index([journy_type, journey_task])
3815
+ @@index([batch_id])
3816
+ @@index([request_status])
3817
+ @@map("approval_management")
3818
+ }
3819
+
3820
+ // ------------------------------------ APPROVAL MANAGEMENT MODEL END ----------------------------------