@valentine-efagene/qshelter-common 2.0.0 → 2.0.2

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 (240) hide show
  1. package/dist/OpenApiHelper.d.ts +9 -0
  2. package/dist/OpenApiHelper.js +118 -0
  3. package/dist/OpenApiHelper.js.map +1 -0
  4. package/dist/decorator/index.d.ts +2 -0
  5. package/dist/decorator/index.js +19 -0
  6. package/dist/decorator/index.js.map +1 -0
  7. package/dist/decorator/permission.decorator.d.ts +2 -0
  8. package/dist/decorator/permission.decorator.js +6 -0
  9. package/dist/decorator/permission.decorator.js.map +1 -0
  10. package/dist/decorator/tenant.decorator.d.ts +2 -0
  11. package/dist/decorator/tenant.decorator.js +13 -0
  12. package/dist/decorator/tenant.decorator.js.map +1 -0
  13. package/dist/encryption/encryption.module.d.ts +2 -0
  14. package/dist/encryption/encryption.module.js +24 -0
  15. package/dist/encryption/encryption.module.js.map +1 -0
  16. package/dist/encryption/encryption.service.d.ts +17 -0
  17. package/dist/encryption/encryption.service.js +85 -0
  18. package/dist/encryption/encryption.service.js.map +1 -0
  19. package/dist/entities/TenantAwareEntity.d.ts +9 -0
  20. package/dist/entities/TenantAwareEntity.js +48 -0
  21. package/dist/entities/TenantAwareEntity.js.map +1 -0
  22. package/dist/entities/TenantAwareRepository.d.ts +13 -0
  23. package/dist/entities/TenantAwareRepository.js +65 -0
  24. package/dist/entities/TenantAwareRepository.js.map +1 -0
  25. package/dist/entities/amenity.entity.d.ts +4 -0
  26. package/dist/entities/amenity.entity.js +28 -0
  27. package/dist/entities/amenity.entity.js.map +1 -0
  28. package/dist/entities/common.entity.d.ts +16 -0
  29. package/dist/entities/common.entity.js +63 -0
  30. package/dist/entities/common.entity.js.map +1 -0
  31. package/dist/entities/common.pure.entity.d.ts +11 -0
  32. package/dist/entities/common.pure.entity.js +52 -0
  33. package/dist/entities/common.pure.entity.js.map +1 -0
  34. package/dist/entities/contract-document.entity.d.ts +39 -0
  35. package/dist/entities/contract-document.entity.js +115 -0
  36. package/dist/entities/contract-document.entity.js.map +1 -0
  37. package/dist/entities/contract.entity.d.ts +62 -0
  38. package/dist/entities/contract.entity.js +191 -0
  39. package/dist/entities/contract.entity.js.map +1 -0
  40. package/dist/entities/device_endpoint.entity.d.ts +10 -0
  41. package/dist/entities/device_endpoint.entity.js +50 -0
  42. package/dist/entities/device_endpoint.entity.js.map +1 -0
  43. package/dist/entities/email_preference.entity.d.ts +6 -0
  44. package/dist/entities/email_preference.entity.js +45 -0
  45. package/dist/entities/email_preference.entity.js.map +1 -0
  46. package/dist/entities/index.d.ts +36 -0
  47. package/dist/entities/index.js +53 -0
  48. package/dist/entities/index.js.map +1 -0
  49. package/dist/entities/mortgage-document.entity.d.ts +14 -0
  50. package/dist/entities/mortgage-document.entity.js +58 -0
  51. package/dist/entities/mortgage-document.entity.js.map +1 -0
  52. package/dist/entities/mortgage-downpayment-installment.entity.d.ts +19 -0
  53. package/dist/entities/mortgage-downpayment-installment.entity.js +63 -0
  54. package/dist/entities/mortgage-downpayment-installment.entity.js.map +1 -0
  55. package/dist/entities/mortgage-downpayment-payment.entity.d.ts +28 -0
  56. package/dist/entities/mortgage-downpayment-payment.entity.js +84 -0
  57. package/dist/entities/mortgage-downpayment-payment.entity.js.map +1 -0
  58. package/dist/entities/mortgage-downpayment.entity.d.ts +22 -0
  59. package/dist/entities/mortgage-downpayment.entity.js +66 -0
  60. package/dist/entities/mortgage-downpayment.entity.js.map +1 -0
  61. package/dist/entities/mortgage-step.entity.d.ts +12 -0
  62. package/dist/entities/mortgage-step.entity.js +52 -0
  63. package/dist/entities/mortgage-step.entity.js.map +1 -0
  64. package/dist/entities/mortgage-transition-event.entity.d.ts +26 -0
  65. package/dist/entities/mortgage-transition-event.entity.js +111 -0
  66. package/dist/entities/mortgage-transition-event.entity.js.map +1 -0
  67. package/dist/entities/mortgage-transition.entity.d.ts +25 -0
  68. package/dist/entities/mortgage-transition.entity.js +91 -0
  69. package/dist/entities/mortgage-transition.entity.js.map +1 -0
  70. package/dist/entities/mortgage-type.entity.d.ts +10 -0
  71. package/dist/entities/mortgage-type.entity.js +46 -0
  72. package/dist/entities/mortgage-type.entity.js.map +1 -0
  73. package/dist/entities/mortgage.entity.d.ts +37 -0
  74. package/dist/entities/mortgage.entity.js +124 -0
  75. package/dist/entities/mortgage.entity.js.map +1 -0
  76. package/dist/entities/password_reset_tokens.entity.d.ts +7 -0
  77. package/dist/entities/password_reset_tokens.entity.js +45 -0
  78. package/dist/entities/password_reset_tokens.entity.js.map +1 -0
  79. package/dist/entities/payment-installment.entity.d.ts +39 -0
  80. package/dist/entities/payment-installment.entity.js +134 -0
  81. package/dist/entities/payment-installment.entity.js.map +1 -0
  82. package/dist/entities/payment-plan.entity.d.ts +62 -0
  83. package/dist/entities/payment-plan.entity.js +174 -0
  84. package/dist/entities/payment-plan.entity.js.map +1 -0
  85. package/dist/entities/payment-schedule.entity.d.ts +44 -0
  86. package/dist/entities/payment-schedule.entity.js +134 -0
  87. package/dist/entities/payment-schedule.entity.js.map +1 -0
  88. package/dist/entities/payment.entity.d.ts +55 -0
  89. package/dist/entities/payment.entity.js +157 -0
  90. package/dist/entities/payment.entity.js.map +1 -0
  91. package/dist/entities/permission.entity.d.ts +6 -0
  92. package/dist/entities/permission.entity.js +30 -0
  93. package/dist/entities/permission.entity.js.map +1 -0
  94. package/dist/entities/property-document.entity.d.ts +6 -0
  95. package/dist/entities/property-document.entity.js +34 -0
  96. package/dist/entities/property-document.entity.js.map +1 -0
  97. package/dist/entities/property-media.entity.d.ts +6 -0
  98. package/dist/entities/property-media.entity.js +37 -0
  99. package/dist/entities/property-media.entity.js.map +1 -0
  100. package/dist/entities/property.entity.d.ts +40 -0
  101. package/dist/entities/property.entity.js +202 -0
  102. package/dist/entities/property.entity.js.map +1 -0
  103. package/dist/entities/refresh_token.entity.d.ts +7 -0
  104. package/dist/entities/refresh_token.entity.js +35 -0
  105. package/dist/entities/refresh_token.entity.js.map +1 -0
  106. package/dist/entities/role.entity.d.ts +8 -0
  107. package/dist/entities/role.entity.js +39 -0
  108. package/dist/entities/role.entity.js.map +1 -0
  109. package/dist/entities/settings.entity.d.ts +17 -0
  110. package/dist/entities/settings.entity.js +81 -0
  111. package/dist/entities/settings.entity.js.map +1 -0
  112. package/dist/entities/social.entity.d.ts +8 -0
  113. package/dist/entities/social.entity.js +48 -0
  114. package/dist/entities/social.entity.js.map +1 -0
  115. package/dist/entities/tenant.entity.d.ts +32 -0
  116. package/dist/entities/tenant.entity.js +101 -0
  117. package/dist/entities/tenant.entity.js.map +1 -0
  118. package/dist/entities/transaction.entity.d.ts +17 -0
  119. package/dist/entities/transaction.entity.js +87 -0
  120. package/dist/entities/transaction.entity.js.map +1 -0
  121. package/dist/entities/user.entity.d.ts +28 -0
  122. package/dist/entities/user.entity.js +109 -0
  123. package/dist/entities/user.entity.js.map +1 -0
  124. package/dist/entities/user_suspensions.entity.d.ts +7 -0
  125. package/dist/entities/user_suspensions.entity.js +44 -0
  126. package/dist/entities/user_suspensions.entity.js.map +1 -0
  127. package/dist/entities/wallet.entity.d.ts +17 -0
  128. package/dist/entities/wallet.entity.js +79 -0
  129. package/dist/entities/wallet.entity.js.map +1 -0
  130. package/dist/guard/index.d.ts +2 -0
  131. package/dist/guard/index.js +19 -0
  132. package/dist/guard/index.js.map +1 -0
  133. package/dist/guard/permission.guard.d.ts +10 -0
  134. package/dist/guard/permission.guard.js +47 -0
  135. package/dist/guard/permission.guard.js.map +1 -0
  136. package/dist/guard/swagger-auth.guard.d.ts +1 -0
  137. package/dist/guard/swagger-auth.guard.js +9 -0
  138. package/dist/guard/swagger-auth.guard.js.map +1 -0
  139. package/dist/helpers/ArrayHelper.d.ts +2 -0
  140. package/dist/helpers/ArrayHelper.js +6 -0
  141. package/dist/helpers/ArrayHelper.js.map +1 -0
  142. package/dist/helpers/ConstantHelper.d.ts +36 -0
  143. package/dist/helpers/ConstantHelper.js +90 -0
  144. package/dist/helpers/ConstantHelper.js.map +1 -0
  145. package/dist/helpers/CustomNamingStrategy.d.ts +7 -0
  146. package/dist/helpers/CustomNamingStrategy.js +22 -0
  147. package/dist/helpers/CustomNamingStrategy.js.map +1 -0
  148. package/dist/helpers/DateHelper.d.ts +3 -0
  149. package/dist/helpers/DateHelper.js +20 -0
  150. package/dist/helpers/DateHelper.js.map +1 -0
  151. package/dist/helpers/EmailHelper.d.ts +4 -0
  152. package/dist/helpers/EmailHelper.js +55 -0
  153. package/dist/helpers/EmailHelper.js.map +1 -0
  154. package/dist/helpers/FileSystemHelper.d.ts +15 -0
  155. package/dist/helpers/FileSystemHelper.js +102 -0
  156. package/dist/helpers/FileSystemHelper.js.map +1 -0
  157. package/dist/helpers/index.d.ts +5 -0
  158. package/dist/helpers/index.js +22 -0
  159. package/dist/helpers/index.js.map +1 -0
  160. package/dist/index.d.ts +16 -2
  161. package/dist/index.js +33 -2
  162. package/dist/index.js.map +1 -0
  163. package/dist/middleware/AccessLoggerMiddleware.d.ts +6 -0
  164. package/dist/middleware/AccessLoggerMiddleware.js +64 -0
  165. package/dist/middleware/AccessLoggerMiddleware.js.map +1 -0
  166. package/dist/middleware/AuthenticationMiddleware.d.ts +5 -0
  167. package/dist/middleware/AuthenticationMiddleware.js +19 -0
  168. package/dist/middleware/AuthenticationMiddleware.js.map +1 -0
  169. package/dist/middleware/TenantMiddleware.d.ts +14 -0
  170. package/dist/middleware/TenantMiddleware.js +49 -0
  171. package/dist/middleware/TenantMiddleware.js.map +1 -0
  172. package/dist/middleware/index.d.ts +3 -0
  173. package/dist/middleware/index.js +20 -0
  174. package/dist/middleware/index.js.map +1 -0
  175. package/dist/pagination/index.d.ts +2 -0
  176. package/dist/pagination/index.js +19 -0
  177. package/dist/pagination/index.js.map +1 -0
  178. package/dist/pagination/pagination.helper.d.ts +7 -0
  179. package/dist/pagination/pagination.helper.js +40 -0
  180. package/dist/pagination/pagination.helper.js.map +1 -0
  181. package/dist/pagination/pagination.types.d.ts +19 -0
  182. package/dist/pagination/pagination.types.js +3 -0
  183. package/dist/pagination/pagination.types.js.map +1 -0
  184. package/dist/qr-code/qr-code.dto.d.ts +3 -0
  185. package/dist/qr-code/qr-code.dto.js +21 -0
  186. package/dist/qr-code/qr-code.dto.js.map +1 -0
  187. package/dist/qr-code/qr-code.module.d.ts +2 -0
  188. package/dist/qr-code/qr-code.module.js +24 -0
  189. package/dist/qr-code/qr-code.module.js.map +1 -0
  190. package/dist/qr-code/qr-code.service.d.ts +11 -0
  191. package/dist/qr-code/qr-code.service.js +89 -0
  192. package/dist/qr-code/qr-code.service.js.map +1 -0
  193. package/dist/qr-code/qr-code.type.d.ts +5 -0
  194. package/dist/qr-code/qr-code.type.js +3 -0
  195. package/dist/qr-code/qr-code.type.js.map +1 -0
  196. package/dist/src/config/config.service.d.ts +61 -0
  197. package/dist/src/config/config.service.js +144 -0
  198. package/dist/src/config/config.service.js.map +1 -0
  199. package/dist/src/config/index.d.ts +1 -0
  200. package/dist/src/config/index.js +18 -0
  201. package/dist/src/config/index.js.map +1 -0
  202. package/dist/standard-response.d.ts +7 -0
  203. package/dist/standard-response.js +27 -0
  204. package/dist/standard-response.js.map +1 -0
  205. package/dist/tsconfig.tsbuildinfo +1 -0
  206. package/dist/types/common.type.d.ts +54 -0
  207. package/dist/types/common.type.js +55 -0
  208. package/dist/types/common.type.js.map +1 -0
  209. package/dist/types/index.d.ts +8 -0
  210. package/dist/types/index.js +25 -0
  211. package/dist/types/index.js.map +1 -0
  212. package/dist/types/mortgage-fsm.type.d.ts +180 -0
  213. package/dist/types/mortgage-fsm.type.js +130 -0
  214. package/dist/types/mortgage-fsm.type.js.map +1 -0
  215. package/dist/types/permission.type.d.ts +42 -0
  216. package/dist/types/permission.type.js +47 -0
  217. package/dist/types/permission.type.js.map +1 -0
  218. package/dist/types/policy.type.d.ts +18 -0
  219. package/dist/types/policy.type.js +3 -0
  220. package/dist/types/policy.type.js.map +1 -0
  221. package/dist/types/property.type.d.ts +13 -0
  222. package/dist/types/property.type.js +20 -0
  223. package/dist/types/property.type.js.map +1 -0
  224. package/dist/types/tenant.type.d.ts +13 -0
  225. package/dist/types/tenant.type.js +19 -0
  226. package/dist/types/tenant.type.js.map +1 -0
  227. package/dist/types/transaction.type.d.ts +8 -0
  228. package/dist/types/transaction.type.js +14 -0
  229. package/dist/types/transaction.type.js.map +1 -0
  230. package/dist/types/user.type.d.ts +10 -0
  231. package/dist/types/user.type.js +16 -0
  232. package/dist/types/user.type.js.map +1 -0
  233. package/package.json +100 -32
  234. package/dist/types/prisma.d.ts +0 -2
  235. package/dist/types/prisma.js +0 -2
  236. package/dist/types/response.d.ts +0 -15
  237. package/dist/types/response.js +0 -6
  238. package/dist/utils/errors.d.ts +0 -21
  239. package/dist/utils/errors.js +0 -28
  240. package/prisma/schema.prisma +0 -636
@@ -1,636 +0,0 @@
1
- // =============================================================================
2
- // QSHELTER UNIFIED DATABASE SCHEMA
3
- // =============================================================================
4
- // This schema contains all database models for the QShelter platform
5
- // Organized by domain for better readability
6
- // =============================================================================
7
-
8
- generator client {
9
- provider = "prisma-client"
10
- output = "../generated/client"
11
- }
12
-
13
- datasource db {
14
- provider = "mysql"
15
- }
16
-
17
- // =============================================================================
18
- // USER & AUTH DOMAIN
19
- // =============================================================================
20
-
21
- model User {
22
- id String @id @default(cuid())
23
- email String @unique
24
- password String?
25
- firstName String?
26
- lastName String?
27
- isActive Boolean @default(true)
28
- isVerified Boolean @default(false)
29
- googleId String? @unique
30
- tenantId String?
31
- tenant Tenant? @relation(fields: [tenantId], references: [id], onDelete: SetNull)
32
- roleId String?
33
- role Role? @relation(fields: [roleId], references: [id], onDelete: SetNull)
34
- walletId String? @unique
35
- wallet Wallet? @relation(fields: [walletId], references: [id])
36
- createdAt DateTime @default(now())
37
- updatedAt DateTime @updatedAt
38
- emailVerifiedAt DateTime?
39
- lastLoginAt DateTime?
40
- refreshTokens RefreshToken[]
41
- passwordResets PasswordReset[]
42
- suspensions UserSuspension[]
43
- emailPreferences EmailPreference[]
44
- deviceEndpoints DeviceEndpoint[]
45
- socials Social[]
46
-
47
- // Relations to other domains
48
- properties Property[]
49
- mortgages Mortgage[] @relation("MortgageBorrower")
50
- paymentPlans PaymentPlan[]
51
- contracts Contract[] @relation("ContractBuyer")
52
- soldContracts Contract[] @relation("ContractSeller")
53
- payments Payment[]
54
-
55
- @@index([email])
56
- @@index([tenantId])
57
- @@index([roleId])
58
- @@map("users")
59
- }
60
-
61
- model Role {
62
- id String @id @default(cuid())
63
- name String @unique
64
- description String?
65
- users User[]
66
- permissions RolePermission[]
67
- createdAt DateTime @default(now())
68
- updatedAt DateTime @updatedAt
69
-
70
- @@map("roles")
71
- }
72
-
73
- model Permission {
74
- id String @id @default(cuid())
75
- name String @unique
76
- description String?
77
- resource String
78
- action String
79
- roles RolePermission[]
80
- createdAt DateTime @default(now())
81
- updatedAt DateTime @updatedAt
82
-
83
- @@unique([resource, action])
84
- @@index([resource])
85
- @@map("permissions")
86
- }
87
-
88
- model RolePermission {
89
- roleId String
90
- permissionId String
91
- role Role @relation(fields: [roleId], references: [id], onDelete: Cascade)
92
- permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade)
93
- createdAt DateTime @default(now())
94
-
95
- @@id([roleId, permissionId])
96
- @@map("role_permissions")
97
- }
98
-
99
- model Tenant {
100
- id String @id @default(cuid())
101
- name String
102
- subdomain String @unique
103
- isActive Boolean @default(true)
104
- users User[]
105
- createdAt DateTime @default(now())
106
- updatedAt DateTime @updatedAt
107
-
108
- @@index([subdomain])
109
- @@map("tenants")
110
- }
111
-
112
- model RefreshToken {
113
- id String @id @default(cuid())
114
- token String @unique
115
- userId String
116
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
117
- expiresAt DateTime
118
- createdAt DateTime @default(now())
119
-
120
- @@index([userId])
121
- @@index([expiresAt])
122
- @@map("refresh_tokens")
123
- }
124
-
125
- model PasswordReset {
126
- id String @id @default(cuid())
127
- token String @unique
128
- userId String
129
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
130
- expiresAt DateTime
131
- usedAt DateTime?
132
- createdAt DateTime @default(now())
133
-
134
- @@index([userId])
135
- @@index([expiresAt])
136
- @@map("password_resets")
137
- }
138
-
139
- model UserSuspension {
140
- id String @id @default(cuid())
141
- userId String
142
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
143
- reason String
144
- suspendedAt DateTime @default(now())
145
- expiresAt DateTime?
146
- liftedAt DateTime?
147
-
148
- @@index([userId])
149
- @@map("user_suspensions")
150
- }
151
-
152
- model EmailPreference {
153
- id String @id @default(cuid())
154
- userId String
155
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
156
- marketingEmails Boolean @default(true)
157
- transactionalEmails Boolean @default(true)
158
- propertyAlerts Boolean @default(true)
159
- paymentReminders Boolean @default(true)
160
- createdAt DateTime @default(now())
161
- updatedAt DateTime @updatedAt
162
-
163
- @@index([userId])
164
- @@map("email_preferences")
165
- }
166
-
167
- model DeviceEndpoint {
168
- id String @id @default(cuid())
169
- userId String
170
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
171
- endpoint String // Push notification endpoint
172
- platform String // ios, android, web
173
- isActive Boolean @default(true)
174
- createdAt DateTime @default(now())
175
- updatedAt DateTime @updatedAt
176
-
177
- @@index([userId])
178
- @@map("device_endpoints")
179
- }
180
-
181
- model Social {
182
- id String @id @default(cuid())
183
- userId String
184
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
185
- provider String // google, facebook, twitter, etc
186
- socialId String // ID from the social provider
187
- createdAt DateTime @default(now())
188
- updatedAt DateTime @updatedAt
189
-
190
- @@unique([provider, socialId])
191
- @@index([userId])
192
- @@map("socials")
193
- }
194
-
195
- model Wallet {
196
- id String @id @default(cuid())
197
- balance Float @default(0)
198
- currency String @default("USD")
199
- user User?
200
- transactions Transaction[]
201
- createdAt DateTime @default(now())
202
- updatedAt DateTime @updatedAt
203
-
204
- @@map("wallets")
205
- }
206
-
207
- model Transaction {
208
- id String @id @default(cuid())
209
- walletId String
210
- wallet Wallet @relation(fields: [walletId], references: [id], onDelete: Cascade)
211
- amount Float
212
- type String // CREDIT, DEBIT
213
- status String // PENDING, COMPLETED, FAILED
214
- reference String?
215
- description String?
216
- createdAt DateTime @default(now())
217
- updatedAt DateTime @updatedAt
218
-
219
- @@index([walletId])
220
- @@map("transactions")
221
- }
222
-
223
- model Settings {
224
- id String @id @default(cuid())
225
- key String @unique
226
- value String @db.Text
227
- category String?
228
- createdAt DateTime @default(now())
229
- updatedAt DateTime @updatedAt
230
-
231
- @@index([category])
232
- @@map("settings")
233
- }
234
-
235
- // =============================================================================
236
- // PROPERTY DOMAIN
237
- // =============================================================================
238
-
239
- model Property {
240
- id String @id @default(cuid())
241
- userId String
242
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
243
- title String
244
- category String // SALE, RENT, LEASE
245
- propertyType String // APARTMENT, HOUSE, LAND, COMMERCIAL
246
- country String
247
- currency String // USD, NGN, etc
248
- city String
249
- district String?
250
- zipCode String?
251
- streetAddress String?
252
- nBedrooms String
253
- nBathrooms String
254
- nParkingSpots String
255
- price Float
256
- longitude Float?
257
- latitude Float?
258
- area Float?
259
- status String @default("DRAFT") // DRAFT, PUBLISHED, SOLD, RENTED
260
- description String? @db.Text
261
- displayImageId String?
262
- displayImage PropertyMedia? @relation("DisplayImage", fields: [displayImageId], references: [id], onDelete: SetNull)
263
- isPublished Boolean @default(false)
264
- publishedAt DateTime?
265
- createdAt DateTime @default(now())
266
- updatedAt DateTime @updatedAt
267
-
268
- documents PropertyDocument[]
269
- media PropertyMedia[] @relation("PropertyMedia")
270
- amenities PropertyAmenity[]
271
- mortgages Mortgage[]
272
- paymentPlans PaymentPlan[]
273
- contracts Contract[]
274
-
275
- @@index([userId])
276
- @@index([category])
277
- @@index([propertyType])
278
- @@index([city])
279
- @@map("properties")
280
- }
281
-
282
- model PropertyMedia {
283
- id String @id @default(cuid())
284
- propertyId String
285
- property Property @relation("PropertyMedia", fields: [propertyId], references: [id], onDelete: Cascade)
286
- url String
287
- type String // IMAGE, VIDEO
288
- caption String?
289
- order Int @default(0)
290
- createdAt DateTime @default(now())
291
- updatedAt DateTime @updatedAt
292
-
293
- displayForProperties Property[] @relation("DisplayImage")
294
-
295
- @@index([propertyId])
296
- @@map("property_media")
297
- }
298
-
299
- model PropertyDocument {
300
- id String @id @default(cuid())
301
- propertyId String
302
- property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
303
- name String
304
- url String
305
- type String // TITLE_DEED, SURVEY_PLAN, etc
306
- createdAt DateTime @default(now())
307
- updatedAt DateTime @updatedAt
308
-
309
- @@index([propertyId])
310
- @@map("property_documents")
311
- }
312
-
313
- model Amenity {
314
- id String @id @default(cuid())
315
- name String @unique
316
- createdAt DateTime @default(now())
317
- updatedAt DateTime @updatedAt
318
- properties PropertyAmenity[]
319
-
320
- @@map("amenities")
321
- }
322
-
323
- model PropertyAmenity {
324
- propertyId String
325
- amenityId String
326
- property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
327
- amenity Amenity @relation(fields: [amenityId], references: [id], onDelete: Cascade)
328
- createdAt DateTime @default(now())
329
-
330
- @@id([propertyId, amenityId])
331
- @@map("property_amenities")
332
- }
333
-
334
- // =============================================================================
335
- // MORTGAGE DOMAIN
336
- // =============================================================================
337
-
338
- model Mortgage {
339
- id String @id @default(cuid())
340
- propertyId String
341
- property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
342
- borrowerId String
343
- borrower User @relation("MortgageBorrower", fields: [borrowerId], references: [id], onDelete: Cascade)
344
- mortgageTypeId String?
345
- mortgageType MortgageType? @relation(fields: [mortgageTypeId], references: [id])
346
- downpaymentPlanId String?
347
- downpaymentPlan MortgageDownpaymentPlan? @relation(fields: [downpaymentPlanId], references: [id])
348
- principal Float
349
- downPayment Float
350
- downPaymentPaid Float @default(0)
351
- termMonths Int
352
- interestRate Float
353
- monthlyPayment Float
354
- status String @default("DRAFT") // DRAFT, PENDING, ACTIVE, COMPLETED, CANCELLED
355
- state String @default("DRAFT") // FSM state
356
- stateMetadata String? @db.Text // JSON metadata
357
- lastReminderSentAt DateTime?
358
- createdAt DateTime @default(now())
359
- updatedAt DateTime @updatedAt
360
-
361
- documents MortgageDocument[]
362
- steps MortgageStep[]
363
- transitions MortgageTransition[]
364
- transitionEvents MortgageTransitionEvent[]
365
-
366
- @@index([propertyId])
367
- @@index([borrowerId])
368
- @@index([status])
369
- @@index([state])
370
- @@map("mortgages")
371
- }
372
-
373
- model MortgageType {
374
- id String @id @default(cuid())
375
- name String @unique
376
- description String? @db.Text
377
- createdAt DateTime @default(now())
378
- updatedAt DateTime @updatedAt
379
- mortgages Mortgage[]
380
-
381
- @@map("mortgage_types")
382
- }
383
-
384
- model MortgageDocument {
385
- id String @id @default(cuid())
386
- mortgageId String
387
- mortgage Mortgage @relation(fields: [mortgageId], references: [id], onDelete: Cascade)
388
- name String
389
- url String
390
- type String // INCOME_PROOF, ID, etc
391
- createdAt DateTime @default(now())
392
- updatedAt DateTime @updatedAt
393
-
394
- @@index([mortgageId])
395
- @@map("mortgage_documents")
396
- }
397
-
398
- model MortgageStep {
399
- id String @id @default(cuid())
400
- mortgageId String
401
- mortgage Mortgage @relation(fields: [mortgageId], references: [id], onDelete: Cascade)
402
- name String
403
- description String? @db.Text
404
- order Int
405
- isCompleted Boolean @default(false)
406
- completedAt DateTime?
407
- createdAt DateTime @default(now())
408
- updatedAt DateTime @updatedAt
409
-
410
- @@index([mortgageId])
411
- @@map("mortgage_steps")
412
- }
413
-
414
- model MortgageDownpaymentPlan {
415
- id String @id @default(cuid())
416
- totalAmount Float
417
- paidAmount Float @default(0)
418
- status String @default("PENDING") // PENDING, ACTIVE, COMPLETED
419
- startDate DateTime
420
- endDate DateTime
421
- createdAt DateTime @default(now())
422
- updatedAt DateTime @updatedAt
423
-
424
- mortgages Mortgage[]
425
- installments MortgageDownpaymentInstallment[]
426
- payments MortgageDownpaymentPayment[]
427
-
428
- @@map("mortgage_downpayment_plans")
429
- }
430
-
431
- model MortgageDownpaymentInstallment {
432
- id String @id @default(cuid())
433
- planId String
434
- plan MortgageDownpaymentPlan @relation(fields: [planId], references: [id], onDelete: Cascade)
435
- amount Float
436
- dueDate DateTime
437
- isPaid Boolean @default(false)
438
- paidDate DateTime?
439
- createdAt DateTime @default(now())
440
- updatedAt DateTime @updatedAt
441
-
442
- @@index([planId])
443
- @@map("mortgage_downpayment_installments")
444
- }
445
-
446
- model MortgageDownpaymentPayment {
447
- id String @id @default(cuid())
448
- planId String
449
- plan MortgageDownpaymentPlan @relation(fields: [planId], references: [id], onDelete: Cascade)
450
- amount Float
451
- paymentMethod String
452
- reference String?
453
- status String @default("PENDING")
454
- createdAt DateTime @default(now())
455
- updatedAt DateTime @updatedAt
456
-
457
- @@index([planId])
458
- @@map("mortgage_downpayment_payments")
459
- }
460
-
461
- model MortgageTransition {
462
- id String @id @default(cuid())
463
- mortgageId String
464
- mortgage Mortgage @relation(fields: [mortgageId], references: [id], onDelete: Cascade)
465
- fromState String
466
- toState String
467
- trigger String
468
- metadata String? @db.Text // JSON
469
- transitionedAt DateTime @default(now())
470
-
471
- @@index([mortgageId])
472
- @@map("mortgage_transitions")
473
- }
474
-
475
- model MortgageTransitionEvent {
476
- id String @id @default(cuid())
477
- mortgageId String
478
- mortgage Mortgage @relation(fields: [mortgageId], references: [id], onDelete: Cascade)
479
- event String
480
- data String? @db.Text // JSON
481
- createdAt DateTime @default(now())
482
-
483
- @@index([mortgageId])
484
- @@map("mortgage_transition_events")
485
- }
486
-
487
- // =============================================================================
488
- // PAYMENT & CONTRACT DOMAIN
489
- // =============================================================================
490
-
491
- model PaymentPlan {
492
- id String @id @default(cuid())
493
- propertyId String
494
- property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
495
- buyerId String?
496
- buyer User? @relation(fields: [buyerId], references: [id])
497
- planType String // MORTGAGE, INSTALLMENT, RENT_TO_OWN, LEASE, OUTRIGHT_PURCHASE, CUSTOM
498
- name String
499
- description String? @db.Text
500
- totalAmount Float
501
- downPaymentAmount Float @default(0)
502
- downPaymentPaid Float @default(0)
503
- principalAmount Float
504
- interestRate Float @default(0)
505
- totalInterest Float @default(0)
506
- state String @default("DRAFT") // FSM state
507
- stateMetadata String? @db.Text
508
- createdAt DateTime @default(now())
509
- updatedAt DateTime @updatedAt
510
-
511
- contract Contract?
512
- schedules PaymentSchedule[]
513
- payments Payment[]
514
-
515
- @@index([propertyId])
516
- @@index([buyerId])
517
- @@index([state])
518
- @@map("payment_plans")
519
- }
520
-
521
- model PaymentSchedule {
522
- id String @id @default(cuid())
523
- planId String
524
- plan PaymentPlan @relation(fields: [planId], references: [id], onDelete: Cascade)
525
- name String
526
- frequency String // MONTHLY, WEEKLY, QUARTERLY, CUSTOM
527
- startDate DateTime
528
- endDate DateTime?
529
- isActive Boolean @default(true)
530
- createdAt DateTime @default(now())
531
- updatedAt DateTime @updatedAt
532
-
533
- installments PaymentInstallment[]
534
- payments Payment[]
535
-
536
- @@index([planId])
537
- @@map("payment_schedules")
538
- }
539
-
540
- model PaymentInstallment {
541
- id String @id @default(cuid())
542
- scheduleId String
543
- schedule PaymentSchedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade)
544
- installmentNumber Int
545
- amount Float
546
- principalAmount Float
547
- interestAmount Float
548
- dueDate DateTime
549
- status String @default("PENDING") // PENDING, PAID, OVERDUE, WAIVED
550
- paidAmount Float @default(0)
551
- paidDate DateTime?
552
- lateFee Float @default(0)
553
- createdAt DateTime @default(now())
554
- updatedAt DateTime @updatedAt
555
-
556
- payments Payment[]
557
-
558
- @@index([scheduleId])
559
- @@index([dueDate])
560
- @@index([status])
561
- @@map("payment_installments")
562
- }
563
-
564
- model Payment {
565
- id String @id @default(cuid())
566
- planId String
567
- plan PaymentPlan @relation(fields: [planId], references: [id], onDelete: Cascade)
568
- scheduleId String?
569
- schedule PaymentSchedule? @relation(fields: [scheduleId], references: [id])
570
- installmentId String?
571
- installment PaymentInstallment? @relation(fields: [installmentId], references: [id])
572
- payerId String?
573
- payer User? @relation(fields: [payerId], references: [id])
574
- amount Float
575
- principalAmount Float @default(0)
576
- interestAmount Float @default(0)
577
- lateFeeAmount Float @default(0)
578
- paymentMethod String // BANK_TRANSFER, CREDIT_CARD, WALLET, etc
579
- status String @default("INITIATED") // INITIATED, PENDING, PROCESSING, COMPLETED, FAILED, CANCELLED, REFUNDED
580
- reference String? @unique
581
- gatewayResponse String? @db.Text // JSON
582
- processedAt DateTime?
583
- createdAt DateTime @default(now())
584
- updatedAt DateTime @updatedAt
585
-
586
- @@index([planId])
587
- @@index([payerId])
588
- @@index([status])
589
- @@index([reference])
590
- @@map("payments")
591
- }
592
-
593
- model Contract {
594
- id String @id @default(cuid())
595
- propertyId String
596
- property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
597
- paymentPlanId String? @unique
598
- paymentPlan PaymentPlan? @relation(fields: [paymentPlanId], references: [id])
599
- buyerId String?
600
- buyer User? @relation("ContractBuyer", fields: [buyerId], references: [id])
601
- sellerId String?
602
- seller User? @relation("ContractSeller", fields: [sellerId], references: [id])
603
- contractType String // MORTGAGE, SALE_AGREEMENT, LEASE_AGREEMENT, etc
604
- contractNumber String @unique
605
- title String
606
- description String? @db.Text
607
- status String @default("DRAFT") // DRAFT, PENDING_SIGNATURE, ACTIVE, COMPLETED, TERMINATED
608
- startDate DateTime?
609
- endDate DateTime?
610
- signedAt DateTime?
611
- terminatedAt DateTime?
612
- createdAt DateTime @default(now())
613
- updatedAt DateTime @updatedAt
614
-
615
- documents ContractDocument[]
616
-
617
- @@index([propertyId])
618
- @@index([buyerId])
619
- @@index([sellerId])
620
- @@index([status])
621
- @@map("contracts")
622
- }
623
-
624
- model ContractDocument {
625
- id String @id @default(cuid())
626
- contractId String
627
- contract Contract @relation(fields: [contractId], references: [id], onDelete: Cascade)
628
- name String
629
- url String
630
- type String
631
- createdAt DateTime @default(now())
632
- updatedAt DateTime @updatedAt
633
-
634
- @@index([contractId])
635
- @@map("contract_documents")
636
- }