uaxi-shared-entities 1.0.0

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 (218) hide show
  1. package/README.md +136 -0
  2. package/dist/config/database.config.d.ts +3 -0
  3. package/dist/config/database.config.d.ts.map +1 -0
  4. package/dist/config/database.config.js +21 -0
  5. package/dist/config/database.config.js.map +1 -0
  6. package/dist/config/index.d.ts +2 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +18 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/entities/address.entity.d.ts +64 -0
  11. package/dist/entities/address.entity.d.ts.map +1 -0
  12. package/dist/entities/address.entity.js +254 -0
  13. package/dist/entities/address.entity.js.map +1 -0
  14. package/dist/entities/brand.entity.d.ts +16 -0
  15. package/dist/entities/brand.entity.d.ts.map +1 -0
  16. package/dist/entities/brand.entity.js +95 -0
  17. package/dist/entities/brand.entity.js.map +1 -0
  18. package/dist/entities/camping_coupons.entity.d.ts +13 -0
  19. package/dist/entities/camping_coupons.entity.d.ts.map +1 -0
  20. package/dist/entities/camping_coupons.entity.js +74 -0
  21. package/dist/entities/camping_coupons.entity.js.map +1 -0
  22. package/dist/entities/coupon.entity.d.ts +50 -0
  23. package/dist/entities/coupon.entity.d.ts.map +1 -0
  24. package/dist/entities/coupon.entity.js +227 -0
  25. package/dist/entities/coupon.entity.js.map +1 -0
  26. package/dist/entities/coupon_usages.entity.d.ts +28 -0
  27. package/dist/entities/coupon_usages.entity.d.ts.map +1 -0
  28. package/dist/entities/coupon_usages.entity.js +136 -0
  29. package/dist/entities/coupon_usages.entity.js.map +1 -0
  30. package/dist/entities/coupon_user_mappings.entity.d.ts +18 -0
  31. package/dist/entities/coupon_user_mappings.entity.d.ts.map +1 -0
  32. package/dist/entities/coupon_user_mappings.entity.js +108 -0
  33. package/dist/entities/coupon_user_mappings.entity.js.map +1 -0
  34. package/dist/entities/driver.entity.d.ts +46 -0
  35. package/dist/entities/driver.entity.d.ts.map +1 -0
  36. package/dist/entities/driver.entity.js +157 -0
  37. package/dist/entities/driver.entity.js.map +1 -0
  38. package/dist/entities/farerates.entity.d.ts +14 -0
  39. package/dist/entities/farerates.entity.d.ts.map +1 -0
  40. package/dist/entities/farerates.entity.js +97 -0
  41. package/dist/entities/farerates.entity.js.map +1 -0
  42. package/dist/entities/geofence.entity.d.ts +23 -0
  43. package/dist/entities/geofence.entity.d.ts.map +1 -0
  44. package/dist/entities/geofence.entity.js +120 -0
  45. package/dist/entities/geofence.entity.js.map +1 -0
  46. package/dist/entities/index.d.ts +24 -0
  47. package/dist/entities/index.d.ts.map +1 -0
  48. package/dist/entities/index.js +40 -0
  49. package/dist/entities/index.js.map +1 -0
  50. package/dist/entities/notifications.entity.d.ts +25 -0
  51. package/dist/entities/notifications.entity.d.ts.map +1 -0
  52. package/dist/entities/notifications.entity.js +101 -0
  53. package/dist/entities/notifications.entity.js.map +1 -0
  54. package/dist/entities/payments.entity.d.ts +30 -0
  55. package/dist/entities/payments.entity.d.ts.map +1 -0
  56. package/dist/entities/payments.entity.js +123 -0
  57. package/dist/entities/payments.entity.js.map +1 -0
  58. package/dist/entities/promotion_camping.d.ts +26 -0
  59. package/dist/entities/promotion_camping.d.ts.map +1 -0
  60. package/dist/entities/promotion_camping.js +131 -0
  61. package/dist/entities/promotion_camping.js.map +1 -0
  62. package/dist/entities/raitings.entity.d.ts +15 -0
  63. package/dist/entities/raitings.entity.d.ts.map +1 -0
  64. package/dist/entities/raitings.entity.js +90 -0
  65. package/dist/entities/raitings.entity.js.map +1 -0
  66. package/dist/entities/recent_serch.entity.d.ts +16 -0
  67. package/dist/entities/recent_serch.entity.d.ts.map +1 -0
  68. package/dist/entities/recent_serch.entity.js +107 -0
  69. package/dist/entities/recent_serch.entity.js.map +1 -0
  70. package/dist/entities/roles.entity.d.ts +11 -0
  71. package/dist/entities/roles.entity.d.ts.map +1 -0
  72. package/dist/entities/roles.entity.js +66 -0
  73. package/dist/entities/roles.entity.js.map +1 -0
  74. package/dist/entities/supportticket.entity.d.ts +30 -0
  75. package/dist/entities/supportticket.entity.d.ts.map +1 -0
  76. package/dist/entities/supportticket.entity.js +123 -0
  77. package/dist/entities/supportticket.entity.js.map +1 -0
  78. package/dist/entities/trip-route-change.entity.d.ts +49 -0
  79. package/dist/entities/trip-route-change.entity.d.ts.map +1 -0
  80. package/dist/entities/trip-route-change.entity.js +228 -0
  81. package/dist/entities/trip-route-change.entity.js.map +1 -0
  82. package/dist/entities/trip-stop.entity.d.ts +44 -0
  83. package/dist/entities/trip-stop.entity.d.ts.map +1 -0
  84. package/dist/entities/trip-stop.entity.js +232 -0
  85. package/dist/entities/trip-stop.entity.js.map +1 -0
  86. package/dist/entities/triplocation.entity.d.ts +15 -0
  87. package/dist/entities/triplocation.entity.d.ts.map +1 -0
  88. package/dist/entities/triplocation.entity.js +110 -0
  89. package/dist/entities/triplocation.entity.js.map +1 -0
  90. package/dist/entities/trips.entity.d.ts +64 -0
  91. package/dist/entities/trips.entity.d.ts.map +1 -0
  92. package/dist/entities/trips.entity.js +331 -0
  93. package/dist/entities/trips.entity.js.map +1 -0
  94. package/dist/entities/user.entity.d.ts +54 -0
  95. package/dist/entities/user.entity.d.ts.map +1 -0
  96. package/dist/entities/user.entity.js +199 -0
  97. package/dist/entities/user.entity.js.map +1 -0
  98. package/dist/entities/userCard.entity.d.ts +45 -0
  99. package/dist/entities/userCard.entity.d.ts.map +1 -0
  100. package/dist/entities/userCard.entity.js +143 -0
  101. package/dist/entities/userCard.entity.js.map +1 -0
  102. package/dist/entities/vehicle-model.entity.d.ts +22 -0
  103. package/dist/entities/vehicle-model.entity.d.ts.map +1 -0
  104. package/dist/entities/vehicle-model.entity.js +128 -0
  105. package/dist/entities/vehicle-model.entity.js.map +1 -0
  106. package/dist/entities/vehicle.entity.d.ts +34 -0
  107. package/dist/entities/vehicle.entity.d.ts.map +1 -0
  108. package/dist/entities/vehicle.entity.js +168 -0
  109. package/dist/entities/vehicle.entity.js.map +1 -0
  110. package/dist/entities/wallet.entity.d.ts +23 -0
  111. package/dist/entities/wallet.entity.d.ts.map +1 -0
  112. package/dist/entities/wallet.entity.js +116 -0
  113. package/dist/entities/wallet.entity.js.map +1 -0
  114. package/dist/entities/walletTransaction.entity.d.ts +52 -0
  115. package/dist/entities/walletTransaction.entity.d.ts.map +1 -0
  116. package/dist/entities/walletTransaction.entity.js +183 -0
  117. package/dist/entities/walletTransaction.entity.js.map +1 -0
  118. package/dist/enums/address.enum.d.ts +7 -0
  119. package/dist/enums/address.enum.d.ts.map +1 -0
  120. package/dist/enums/address.enum.js +11 -0
  121. package/dist/enums/address.enum.js.map +1 -0
  122. package/dist/enums/coupon.enum.d.ts +32 -0
  123. package/dist/enums/coupon.enum.d.ts.map +1 -0
  124. package/dist/enums/coupon.enum.js +43 -0
  125. package/dist/enums/coupon.enum.js.map +1 -0
  126. package/dist/enums/driver.enum.d.ts +7 -0
  127. package/dist/enums/driver.enum.d.ts.map +1 -0
  128. package/dist/enums/driver.enum.js +14 -0
  129. package/dist/enums/driver.enum.js.map +1 -0
  130. package/dist/enums/geofence.enum.d.ts +9 -0
  131. package/dist/enums/geofence.enum.d.ts.map +1 -0
  132. package/dist/enums/geofence.enum.js +16 -0
  133. package/dist/enums/geofence.enum.js.map +1 -0
  134. package/dist/enums/index.d.ts +10 -0
  135. package/dist/enums/index.d.ts.map +1 -0
  136. package/dist/enums/index.js +29 -0
  137. package/dist/enums/index.js.map +1 -0
  138. package/dist/enums/notification.enum.d.ts +12 -0
  139. package/dist/enums/notification.enum.d.ts.map +1 -0
  140. package/dist/enums/notification.enum.js +19 -0
  141. package/dist/enums/notification.enum.js.map +1 -0
  142. package/dist/enums/payment.enum.d.ts +14 -0
  143. package/dist/enums/payment.enum.d.ts.map +1 -0
  144. package/dist/enums/payment.enum.js +22 -0
  145. package/dist/enums/payment.enum.js.map +1 -0
  146. package/dist/enums/trip.enum.d.ts +9 -0
  147. package/dist/enums/trip.enum.d.ts.map +1 -0
  148. package/dist/enums/trip.enum.js +16 -0
  149. package/dist/enums/trip.enum.js.map +1 -0
  150. package/dist/enums/user.enum.d.ts +7 -0
  151. package/dist/enums/user.enum.d.ts.map +1 -0
  152. package/dist/enums/user.enum.js +14 -0
  153. package/dist/enums/user.enum.js.map +1 -0
  154. package/dist/enums/vehicle.enum.d.ts +6 -0
  155. package/dist/enums/vehicle.enum.d.ts.map +1 -0
  156. package/dist/enums/vehicle.enum.js +13 -0
  157. package/dist/enums/vehicle.enum.js.map +1 -0
  158. package/dist/enums/wallet.enum.d.ts +33 -0
  159. package/dist/enums/wallet.enum.d.ts.map +1 -0
  160. package/dist/enums/wallet.enum.js +43 -0
  161. package/dist/enums/wallet.enum.js.map +1 -0
  162. package/dist/index.d.ts +5 -0
  163. package/dist/index.d.ts.map +1 -0
  164. package/dist/index.js +28 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/types/common.types.d.ts +34 -0
  167. package/dist/types/common.types.d.ts.map +1 -0
  168. package/dist/types/common.types.js +6 -0
  169. package/dist/types/common.types.js.map +1 -0
  170. package/dist/types/index.d.ts +2 -0
  171. package/dist/types/index.d.ts.map +1 -0
  172. package/dist/types/index.js +21 -0
  173. package/dist/types/index.js.map +1 -0
  174. package/package.json +37 -0
  175. package/src/config/database.config.ts +39 -0
  176. package/src/config/index.ts +1 -0
  177. package/src/entities/address.entity.ts +239 -0
  178. package/src/entities/brand.entity.ts +87 -0
  179. package/src/entities/camping_coupons.entity.ts +60 -0
  180. package/src/entities/coupon.entity.ts +167 -0
  181. package/src/entities/coupon_usages.entity.ts +108 -0
  182. package/src/entities/coupon_user_mappings.entity.ts +89 -0
  183. package/src/entities/driver.entity.ts +151 -0
  184. package/src/entities/farerates.entity.ts +72 -0
  185. package/src/entities/geofence.entity.ts +88 -0
  186. package/src/entities/index.ts +27 -0
  187. package/src/entities/notifications.entity.ts +74 -0
  188. package/src/entities/payments.entity.ts +146 -0
  189. package/src/entities/promotion_camping.ts +96 -0
  190. package/src/entities/raitings.entity.ts +74 -0
  191. package/src/entities/recent_serch.entity.ts +86 -0
  192. package/src/entities/roles.entity.ts +44 -0
  193. package/src/entities/supportticket.entity.ts +104 -0
  194. package/src/entities/trip-route-change.entity.ts +196 -0
  195. package/src/entities/trip-stop.entity.ts +199 -0
  196. package/src/entities/triplocation.entity.ts +96 -0
  197. package/src/entities/trips.entity.ts +290 -0
  198. package/src/entities/user.entity.ts +170 -0
  199. package/src/entities/userCard.entity.ts +139 -0
  200. package/src/entities/vehicle-model.entity.ts +120 -0
  201. package/src/entities/vehicle.entity.ts +154 -0
  202. package/src/entities/wallet.entity.ts +104 -0
  203. package/src/entities/walletTransaction.entity.ts +103 -0
  204. package/src/enums/address.enum.ts +6 -0
  205. package/src/enums/coupon.enum.ts +39 -0
  206. package/src/enums/driver.enum.ts +10 -0
  207. package/src/enums/geofence.enum.ts +12 -0
  208. package/src/enums/index.ts +14 -0
  209. package/src/enums/notification.enum.ts +15 -0
  210. package/src/enums/payment.enum.ts +18 -0
  211. package/src/enums/trip.enum.ts +12 -0
  212. package/src/enums/user.enum.ts +10 -0
  213. package/src/enums/vehicle.enum.ts +9 -0
  214. package/src/enums/wallet.enum.ts +29 -0
  215. package/src/index.ts +15 -0
  216. package/src/types/common.types.ts +43 -0
  217. package/src/types/index.ts +5 -0
  218. package/tsconfig.json +24 -0
@@ -0,0 +1,290 @@
1
+ // =============================================
2
+ // TRIP MODEL
3
+ // =============================================
4
+
5
+ import {
6
+ BelongsTo,
7
+ Column,
8
+ DataType,
9
+ ForeignKey,
10
+ HasMany,
11
+ Model,
12
+ Table,
13
+ } from 'sequelize-typescript';
14
+ import { User } from './user.entity';
15
+ import { Vehicle } from './vehicle.entity';
16
+ import { TripLocation } from './triplocation.entity';
17
+ import { Rating } from './raitings.entity';
18
+ import { Payment } from './payments.entity';
19
+ import { WalletTransaction } from './walletTransaction.entity';
20
+ import { UserAddress } from './address.entity';
21
+ import { Coupon } from './coupon.entity';
22
+ import { TripStatus } from '../enums';
23
+ import { TripStop } from './trip-stop.entity';
24
+ import { TripRouteChange } from './trip-route-change.entity';
25
+
26
+ // =============================================
27
+ // TRIP MODEL - ACTUALIZADO
28
+ // =============================================
29
+
30
+ @Table({
31
+ tableName: 'trips',
32
+ timestamps: true,
33
+ })
34
+ export class Trip extends Model<Trip> {
35
+ @Column({
36
+ type: DataType.UUID,
37
+ defaultValue: DataType.UUIDV4,
38
+ primaryKey: true,
39
+ })
40
+ declare id: string;
41
+
42
+ @ForeignKey(() => User)
43
+ @Column({
44
+ type: DataType.UUID,
45
+ allowNull: false,
46
+ })
47
+ passengerId: string;
48
+
49
+ @ForeignKey(() => User)
50
+ @Column({
51
+ type: DataType.UUID,
52
+ allowNull: true,
53
+ })
54
+ driverId: string;
55
+
56
+ @ForeignKey(() => Vehicle)
57
+ @Column({
58
+ type: DataType.UUID,
59
+ allowNull: true,
60
+ })
61
+ vehicleId: string;
62
+
63
+ @Column({
64
+ type: DataType.ENUM(...Object.values(TripStatus)),
65
+ defaultValue: TripStatus.REQUESTED,
66
+ })
67
+ status: TripStatus;
68
+
69
+ @Column({
70
+ type: DataType.STRING,
71
+ allowNull: false,
72
+ })
73
+ pickupAddress: string;
74
+
75
+ // ACTUALIZADO: Usar GEOMETRY POINT para pickup
76
+ @Column({
77
+ type: DataType.GEOMETRY('POINT', 4326),
78
+ allowNull: false,
79
+ })
80
+ pickupLocation: any; // POINT(longitude, latitude)
81
+
82
+ // OPCIONAL: Mantener campos individuales si necesitas consultas simples
83
+ @Column({
84
+ type: DataType.DOUBLE,
85
+ allowNull: false,
86
+ })
87
+ pickupLatitude: number;
88
+
89
+ @Column({
90
+ type: DataType.DOUBLE,
91
+ allowNull: false,
92
+ })
93
+ pickupLongitude: number;
94
+
95
+ @Column({
96
+ type: DataType.STRING,
97
+ allowNull: false,
98
+ })
99
+ destinationAddress: string;
100
+
101
+ // ACTUALIZADO: Usar GEOMETRY POINT para destino
102
+ @Column({
103
+ type: DataType.GEOMETRY('POINT', 4326),
104
+ allowNull: false,
105
+ })
106
+ destinationLocation: any; // POINT(longitude, latitude)
107
+
108
+ // OPCIONAL: Mantener campos individuales si necesitas consultas simples
109
+ @Column({
110
+ type: DataType.DOUBLE,
111
+ allowNull: false,
112
+ })
113
+ destinationLatitude: number;
114
+
115
+ @Column({
116
+ type: DataType.DOUBLE,
117
+ allowNull: false,
118
+ })
119
+ destinationLongitude: number;
120
+
121
+ // NUEVO: Ruta completa del viaje (para tracking detallado)
122
+ @Column({
123
+ type: DataType.GEOMETRY('LINESTRING', 4326),
124
+ allowNull: true,
125
+ })
126
+ routePath: any; // LINESTRING para la ruta completa
127
+
128
+ @Column({
129
+ type: DataType.DECIMAL(8, 2),
130
+ allowNull: true,
131
+ })
132
+ estimatedDistance: number; // in kilometers
133
+
134
+ @Column({
135
+ type: DataType.INTEGER,
136
+ allowNull: true,
137
+ })
138
+ estimatedDuration: number; // in minutes
139
+
140
+ @Column({
141
+ type: DataType.DECIMAL(8, 2),
142
+ allowNull: true,
143
+ })
144
+ actualDistance: number;
145
+
146
+ @Column({
147
+ type: DataType.INTEGER,
148
+ allowNull: true,
149
+ })
150
+ actualDuration: number;
151
+
152
+ @Column({
153
+ type: DataType.DECIMAL(10, 2),
154
+ allowNull: true,
155
+ })
156
+ fare: number;
157
+
158
+ @Column({
159
+ type: DataType.DECIMAL(10, 2),
160
+ allowNull: true,
161
+ })
162
+ tip: number;
163
+
164
+ @Column({
165
+ type: DataType.DECIMAL(10, 2),
166
+ allowNull: true,
167
+ })
168
+ totalAmount: number;
169
+
170
+ @Column({
171
+ type: DataType.DATE,
172
+ allowNull: true,
173
+ })
174
+ requestedAt: Date;
175
+
176
+ @Column({
177
+ type: DataType.DATE,
178
+ allowNull: true,
179
+ })
180
+ acceptedAt: Date;
181
+
182
+ @Column({
183
+ type: DataType.DATE,
184
+ allowNull: true,
185
+ })
186
+ arrivedAt: Date;
187
+
188
+ @Column({
189
+ type: DataType.DATE,
190
+ allowNull: true,
191
+ })
192
+ startedAt: Date;
193
+
194
+ @Column({
195
+ type: DataType.DATE,
196
+ allowNull: true,
197
+ })
198
+ completedAt: Date;
199
+
200
+ @Column({
201
+ type: DataType.DATE,
202
+ allowNull: true,
203
+ })
204
+ cancelledAt: Date;
205
+
206
+ @Column({
207
+ type: DataType.STRING,
208
+ allowNull: true,
209
+ })
210
+ cancellationReason: string;
211
+
212
+ @Column({
213
+ type: DataType.TEXT,
214
+ allowNull: true,
215
+ })
216
+ notes: string;
217
+
218
+ // Associations
219
+ @BelongsTo(() => User, 'passengerId')
220
+ passenger: User;
221
+
222
+ @BelongsTo(() => User, 'driverId')
223
+ driver: User;
224
+
225
+ @BelongsTo(() => Vehicle)
226
+ vehicle: Vehicle;
227
+
228
+ @HasMany(() => TripLocation, 'tripId')
229
+ locations: TripLocation[];
230
+
231
+ @HasMany(() => Rating, 'tripId')
232
+ ratings: Rating[];
233
+
234
+ @HasMany(() => Payment, 'tripId')
235
+ payments: Payment[];
236
+
237
+ @HasMany(() => WalletTransaction, 'tripId')
238
+ walletTransactions: WalletTransaction[];
239
+
240
+ // NUEVAS ASOCIACIONES PARA MÚLTIPLES PARADAS Y CAMBIOS DE RUTA
241
+ @HasMany(() => TripStop, 'tripId')
242
+ stops: TripStop[];
243
+
244
+ @HasMany(() => TripRouteChange, 'tripId')
245
+ routeChanges: TripRouteChange[];
246
+
247
+ @ForeignKey(() => UserAddress)
248
+ @Column({
249
+ type: DataType.UUID,
250
+ allowNull: true,
251
+ })
252
+ pickupAddressId: string; // Referencia a dirección guardada del usuario
253
+
254
+ @ForeignKey(() => UserAddress)
255
+ @Column({
256
+ type: DataType.UUID,
257
+ allowNull: true,
258
+ })
259
+ destinationAddressId: string; // Referencia a dirección guardada del usuario
260
+
261
+ // Associations
262
+ @BelongsTo(() => UserAddress, 'pickupAddressId')
263
+ pickupSavedAddress: UserAddress;
264
+
265
+ @BelongsTo(() => UserAddress, 'destinationAddressId')
266
+ destinationSavedAddress: UserAddress;
267
+
268
+ @ForeignKey(() => Coupon)
269
+ @Column({
270
+ type: DataType.UUID,
271
+ allowNull: true,
272
+ })
273
+ appliedCouponId: string;
274
+
275
+ @Column({
276
+ type: DataType.DECIMAL(10, 2),
277
+ defaultValue: 0.0,
278
+ })
279
+ discountAmount: number;
280
+
281
+ @Column({
282
+ type: DataType.DECIMAL(10, 2),
283
+ allowNull: true,
284
+ })
285
+ originalFare: number; // Tarifa original antes del descuento
286
+
287
+ // Association
288
+ @BelongsTo(() => Coupon, 'appliedCouponId')
289
+ appliedCoupon: Coupon;
290
+ }
@@ -0,0 +1,170 @@
1
+ import {
2
+ Table,
3
+ Column,
4
+ Model,
5
+ DataType,
6
+ CreatedAt,
7
+ UpdatedAt,
8
+ DeletedAt,
9
+ ForeignKey,
10
+ BelongsTo,
11
+ HasMany,
12
+ } from "sequelize-typescript";
13
+ import { Role } from "./roles.entity";
14
+ import { Trip } from "./trips.entity";
15
+ import { Rating } from "./raitings.entity";
16
+ import { Payment } from "./payments.entity";
17
+ import { Notification } from "./notifications.entity";
18
+ import { Wallet } from "./wallet.entity";
19
+ import { UserAddress } from "./address.entity";
20
+ import { UserStatus } from "../enums";
21
+
22
+ interface UserCreationAttrs {
23
+ firstName: string;
24
+ lastName: string;
25
+ motherLastName?: string;
26
+ email: string;
27
+ phoneNumber: string;
28
+ dateOfBirth?: Date;
29
+ }
30
+
31
+ @Table({
32
+ tableName: "users",
33
+ timestamps: true,
34
+ paranoid: true, // Soft deletes
35
+ })
36
+ export class User extends Model<User, UserCreationAttrs> {
37
+ @Column({
38
+ type: DataType.UUID,
39
+ defaultValue: DataType.UUIDV4,
40
+ primaryKey: true,
41
+ })
42
+ declare id: string;
43
+
44
+ @Column({
45
+ type: DataType.STRING,
46
+ allowNull: false,
47
+ })
48
+ firstName: string;
49
+
50
+ @Column({
51
+ type: DataType.STRING,
52
+ allowNull: false,
53
+ })
54
+ lastName: string;
55
+
56
+ @Column({
57
+ type: DataType.STRING,
58
+ allowNull: true,
59
+ })
60
+ motherLastName: string;
61
+
62
+ @Column({
63
+ type: DataType.STRING,
64
+ allowNull: false,
65
+ unique: true,
66
+ })
67
+ email: string;
68
+
69
+ @Column({
70
+ type: DataType.STRING,
71
+ allowNull: false,
72
+ unique: true,
73
+ })
74
+ phoneNumber: string;
75
+
76
+ @Column({
77
+ type: DataType.STRING,
78
+ allowNull: true,
79
+ })
80
+ password: string;
81
+
82
+ @ForeignKey(() => Role)
83
+ @Column({
84
+ type: DataType.UUID,
85
+ allowNull: true,
86
+ })
87
+ roleId: string;
88
+
89
+ @Column({
90
+ type: DataType.ENUM(...Object.values(UserStatus)),
91
+ defaultValue: UserStatus.PENDING_VERIFICATION,
92
+ })
93
+ status: UserStatus;
94
+
95
+ @Column({ type: DataType.STRING, allowNull: true })
96
+ verificationToken: string | null;
97
+
98
+ @Column({
99
+ type: DataType.BOOLEAN,
100
+ defaultValue: false,
101
+ })
102
+ isEmailVerified: boolean;
103
+
104
+ @Column({
105
+ type: DataType.BOOLEAN,
106
+ defaultValue: false,
107
+ })
108
+ isPhoneVerified: boolean;
109
+
110
+ @Column({
111
+ type: DataType.DATE,
112
+ allowNull: true,
113
+ })
114
+ lastLoginAt: Date;
115
+
116
+ @Column({
117
+ type: DataType.STRING,
118
+ allowNull: true,
119
+ })
120
+ profilePicture: string;
121
+
122
+ @Column({
123
+ type: DataType.DATE,
124
+ allowNull: true,
125
+ })
126
+ dateOfBirth: Date;
127
+
128
+ @Column({
129
+ type: DataType.STRING,
130
+ allowNull: true,
131
+ })
132
+ refreshToken: string;
133
+
134
+ @CreatedAt
135
+ declare createdAt: Date;
136
+
137
+ @UpdatedAt
138
+ declare updatedAt: Date;
139
+
140
+ @DeletedAt
141
+ declare deletedAt: Date;
142
+
143
+ // Associations
144
+ @BelongsTo(() => Role)
145
+ role: Role;
146
+
147
+ @HasMany(() => UserAddress, "userId")
148
+ addresses: UserAddress[];
149
+
150
+ @HasMany(() => Trip, "passengerId")
151
+ passengerTrips: Trip[];
152
+
153
+ @HasMany(() => Trip, "driverId")
154
+ driverTrips: Trip[];
155
+
156
+ @HasMany(() => Rating, "raterId")
157
+ givenRatings: Rating[];
158
+
159
+ @HasMany(() => Rating, "ratedUserId")
160
+ receivedRatings: Rating[];
161
+
162
+ @HasMany(() => Payment, "userId")
163
+ payments: Payment[];
164
+
165
+ @HasMany(() => Notification, "userId")
166
+ notifications: Notification[];
167
+
168
+ @HasMany(() => Wallet, "userId")
169
+ wallet: Wallet;
170
+ }
@@ -0,0 +1,139 @@
1
+ // =============================================
2
+ // 1. NUEVA ENTIDAD: USER CARDS (Tarjetas del Usuario)
3
+ // =============================================
4
+
5
+ import {
6
+ BelongsTo,
7
+ Column,
8
+ DataType,
9
+ ForeignKey,
10
+ HasMany,
11
+ Model,
12
+ Table,
13
+ } from 'sequelize-typescript';
14
+ import { User } from './user.entity';
15
+ import { Payment } from './payments.entity';
16
+
17
+ export enum CardType {
18
+ CREDIT = 'CREDIT',
19
+ DEBIT = 'DEBIT',
20
+ }
21
+
22
+ export enum CardStatus {
23
+ ACTIVE = 'ACTIVE',
24
+ INACTIVE = 'INACTIVE',
25
+ EXPIRED = 'EXPIRED',
26
+ BLOCKED = 'BLOCKED',
27
+ }
28
+
29
+ export interface CreateUserCardData {
30
+ userId: string;
31
+ cardType: CardType;
32
+ lastFourDigits: string;
33
+ brand: string;
34
+ expiryMonth: number;
35
+ expiryYear: number;
36
+ holderName: string;
37
+ gatewayToken: string;
38
+ isDefault?: boolean;
39
+ status?: CardStatus;
40
+ nickname?: string;
41
+ }
42
+
43
+ @Table({
44
+ tableName: 'user_cards',
45
+ timestamps: true,
46
+ })
47
+ export class UserCard extends Model<UserCard, CreateUserCardData> {
48
+ @Column({
49
+ type: DataType.UUID,
50
+ defaultValue: DataType.UUIDV4,
51
+ primaryKey: true,
52
+ })
53
+ declare id: string;
54
+
55
+ @ForeignKey(() => User)
56
+ @Column({
57
+ type: DataType.UUID,
58
+ allowNull: false,
59
+ })
60
+ userId: string;
61
+
62
+ @Column({
63
+ type: DataType.ENUM(...Object.values(CardType)),
64
+ allowNull: false,
65
+ })
66
+ cardType: CardType;
67
+
68
+ @Column({
69
+ type: DataType.STRING(4),
70
+ allowNull: false,
71
+ })
72
+ lastFourDigits: string;
73
+
74
+ @Column({
75
+ type: DataType.STRING,
76
+ allowNull: false,
77
+ })
78
+ brand: string; // Visa, Mastercard, etc.
79
+
80
+ @Column({
81
+ type: DataType.INTEGER,
82
+ allowNull: false,
83
+ })
84
+ expiryMonth: number;
85
+
86
+ @Column({
87
+ type: DataType.INTEGER,
88
+ allowNull: false,
89
+ })
90
+ expiryYear: number;
91
+
92
+ @Column({
93
+ type: DataType.STRING,
94
+ allowNull: false,
95
+ })
96
+ holderName: string;
97
+
98
+ @Column({
99
+ type: DataType.STRING,
100
+ allowNull: false,
101
+ })
102
+ gatewayToken: string; // Token del gateway de pagos (Stripe, PayPal)
103
+
104
+ @Column({
105
+ type: DataType.BOOLEAN,
106
+ defaultValue: false,
107
+ })
108
+ isDefault: boolean;
109
+
110
+ @Column({
111
+ type: DataType.ENUM(...Object.values(CardStatus)),
112
+ defaultValue: CardStatus.ACTIVE,
113
+ })
114
+ status: CardStatus;
115
+
116
+ @Column({
117
+ type: DataType.STRING,
118
+ allowNull: true,
119
+ })
120
+ nickname: string; // "Tarjeta personal", "Tarjeta trabajo"
121
+
122
+ // Associations
123
+ @BelongsTo(() => User)
124
+ user: User;
125
+
126
+ @HasMany(() => Payment, 'cardId')
127
+ payments: Payment[];
128
+
129
+ // Métodos de conveniencia
130
+ get isExpired(): boolean {
131
+ const now = new Date();
132
+ const expiry = new Date(this.expiryYear, this.expiryMonth - 1);
133
+ return now > expiry;
134
+ }
135
+
136
+ get maskedNumber(): string {
137
+ return `**** **** **** ${this.lastFourDigits}`;
138
+ }
139
+ }
@@ -0,0 +1,120 @@
1
+ // =============================================
2
+ // VEHICLE MODEL ENTITY
3
+ // =============================================
4
+
5
+ import {
6
+ BelongsTo,
7
+ Column,
8
+ CreatedAt,
9
+ DataType,
10
+ DeletedAt,
11
+ ForeignKey,
12
+ HasMany,
13
+ Model,
14
+ Table,
15
+ UpdatedAt,
16
+ } from 'sequelize-typescript';
17
+ import { Brand } from './brand.entity';
18
+ import { Vehicle } from './vehicle.entity';
19
+ export interface ICreateVehicleModelDto {
20
+ brandId: string;
21
+ name: string;
22
+ displayName?: string;
23
+ description?: string;
24
+ startYear?: number;
25
+ endYear?: number;
26
+ vehicleType?: string;
27
+ defaultSeatingCapacity?: number;
28
+ isActive?: boolean;
29
+ popularity?: number;
30
+ }
31
+ @Table({
32
+ tableName: 'vehicle_models',
33
+ timestamps: true,
34
+ paranoid: true,
35
+ })
36
+ export class VehicleModel extends Model<VehicleModel, ICreateVehicleModelDto> {
37
+ @Column({
38
+ type: DataType.UUID,
39
+ defaultValue: DataType.UUIDV4,
40
+ primaryKey: true,
41
+ })
42
+ declare id: string;
43
+
44
+ @ForeignKey(() => Brand)
45
+ @Column({
46
+ type: DataType.UUID,
47
+ allowNull: false,
48
+ })
49
+ brandId: string;
50
+
51
+ @Column({
52
+ type: DataType.STRING,
53
+ allowNull: false,
54
+ })
55
+ name: string;
56
+
57
+ @Column({
58
+ type: DataType.STRING,
59
+ allowNull: true,
60
+ })
61
+ displayName: string; // Nombre para mostrar (ej: "Civic Type R")
62
+
63
+ @Column({
64
+ type: DataType.TEXT,
65
+ allowNull: true,
66
+ })
67
+ description: string;
68
+
69
+ @Column({
70
+ type: DataType.INTEGER,
71
+ allowNull: true,
72
+ })
73
+ startYear: number; // Año de inicio de producción
74
+
75
+ @Column({
76
+ type: DataType.INTEGER,
77
+ allowNull: true,
78
+ })
79
+ endYear: number; // Año de fin de producción (null si sigue en producción)
80
+
81
+ @Column({
82
+ type: DataType.STRING,
83
+ allowNull: true,
84
+ })
85
+ vehicleType: string; // sedan, suv, compact, etc.
86
+
87
+ @Column({
88
+ type: DataType.INTEGER,
89
+ allowNull: true,
90
+ })
91
+ defaultSeatingCapacity: number;
92
+
93
+ @Column({
94
+ type: DataType.BOOLEAN,
95
+ defaultValue: true,
96
+ })
97
+ isActive: boolean;
98
+
99
+ @Column({
100
+ type: DataType.INTEGER,
101
+ defaultValue: 0,
102
+ })
103
+ popularity: number;
104
+
105
+ @CreatedAt
106
+ declare createdAt: Date;
107
+
108
+ @UpdatedAt
109
+ declare updatedAt: Date;
110
+
111
+ @DeletedAt
112
+ declare deletedAt: Date;
113
+
114
+ // Associations
115
+ @BelongsTo(() => Brand)
116
+ brand: Brand;
117
+
118
+ @HasMany(() => Vehicle, 'modelId')
119
+ vehicles: Vehicle[];
120
+ }