@unifiedcommerce/plugin-marketplace 0.0.1

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 (122) hide show
  1. package/README.md +479 -0
  2. package/dist/analytics-models.d.ts +13 -0
  3. package/dist/analytics-models.d.ts.map +1 -0
  4. package/dist/analytics-models.js +69 -0
  5. package/dist/hooks.d.ts +4 -0
  6. package/dist/hooks.d.ts.map +1 -0
  7. package/dist/hooks.js +187 -0
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +105 -0
  11. package/dist/mcp-tools.d.ts +21 -0
  12. package/dist/mcp-tools.d.ts.map +1 -0
  13. package/dist/mcp-tools.js +183 -0
  14. package/dist/routes/b2b.d.ts +9 -0
  15. package/dist/routes/b2b.d.ts.map +1 -0
  16. package/dist/routes/b2b.js +156 -0
  17. package/dist/routes/commission.d.ts +6 -0
  18. package/dist/routes/commission.d.ts.map +1 -0
  19. package/dist/routes/commission.js +85 -0
  20. package/dist/routes/disputes-returns-reviews.d.ts +10 -0
  21. package/dist/routes/disputes-returns-reviews.d.ts.map +1 -0
  22. package/dist/routes/disputes-returns-reviews.js +179 -0
  23. package/dist/routes/payouts.d.ts +6 -0
  24. package/dist/routes/payouts.d.ts.map +1 -0
  25. package/dist/routes/payouts.js +40 -0
  26. package/dist/routes/sub-orders.d.ts +6 -0
  27. package/dist/routes/sub-orders.d.ts.map +1 -0
  28. package/dist/routes/sub-orders.js +44 -0
  29. package/dist/routes/util.d.ts +23 -0
  30. package/dist/routes/util.d.ts.map +1 -0
  31. package/dist/routes/util.js +41 -0
  32. package/dist/routes/vendor-portal.d.ts +14 -0
  33. package/dist/routes/vendor-portal.d.ts.map +1 -0
  34. package/dist/routes/vendor-portal.js +255 -0
  35. package/dist/routes/vendors.d.ts +11 -0
  36. package/dist/routes/vendors.d.ts.map +1 -0
  37. package/dist/routes/vendors.js +185 -0
  38. package/dist/schema.d.ts +3255 -0
  39. package/dist/schema.d.ts.map +1 -0
  40. package/dist/schema.js +225 -0
  41. package/dist/schemas/b2b.d.ts +1009 -0
  42. package/dist/schemas/b2b.d.ts.map +1 -0
  43. package/dist/schemas/b2b.js +208 -0
  44. package/dist/schemas/commission.d.ts +532 -0
  45. package/dist/schemas/commission.d.ts.map +1 -0
  46. package/dist/schemas/commission.js +113 -0
  47. package/dist/schemas/disputes-returns-reviews.d.ts +1405 -0
  48. package/dist/schemas/disputes-returns-reviews.d.ts.map +1 -0
  49. package/dist/schemas/disputes-returns-reviews.js +270 -0
  50. package/dist/schemas/payouts.d.ts +375 -0
  51. package/dist/schemas/payouts.d.ts.map +1 -0
  52. package/dist/schemas/payouts.js +78 -0
  53. package/dist/schemas/sub-orders.d.ts +303 -0
  54. package/dist/schemas/sub-orders.d.ts.map +1 -0
  55. package/dist/schemas/sub-orders.js +67 -0
  56. package/dist/schemas/vendor-portal.d.ts +1785 -0
  57. package/dist/schemas/vendor-portal.d.ts.map +1 -0
  58. package/dist/schemas/vendor-portal.js +294 -0
  59. package/dist/schemas/vendors.d.ts +1348 -0
  60. package/dist/schemas/vendors.d.ts.map +1 -0
  61. package/dist/schemas/vendors.js +245 -0
  62. package/dist/services/commission.d.ts +81 -0
  63. package/dist/services/commission.d.ts.map +1 -0
  64. package/dist/services/commission.js +98 -0
  65. package/dist/services/contract-price.d.ts +64 -0
  66. package/dist/services/contract-price.d.ts.map +1 -0
  67. package/dist/services/contract-price.js +57 -0
  68. package/dist/services/dispute.d.ts +156 -0
  69. package/dist/services/dispute.d.ts.map +1 -0
  70. package/dist/services/dispute.js +77 -0
  71. package/dist/services/payout.d.ts +126 -0
  72. package/dist/services/payout.d.ts.map +1 -0
  73. package/dist/services/payout.js +130 -0
  74. package/dist/services/return.d.ts +181 -0
  75. package/dist/services/return.d.ts.map +1 -0
  76. package/dist/services/return.js +80 -0
  77. package/dist/services/review.d.ts +70 -0
  78. package/dist/services/review.d.ts.map +1 -0
  79. package/dist/services/review.js +60 -0
  80. package/dist/services/rfq.d.ts +122 -0
  81. package/dist/services/rfq.d.ts.map +1 -0
  82. package/dist/services/rfq.js +60 -0
  83. package/dist/services/sub-order.d.ts +336 -0
  84. package/dist/services/sub-order.d.ts.map +1 -0
  85. package/dist/services/sub-order.js +121 -0
  86. package/dist/services/vendor.d.ts +528 -0
  87. package/dist/services/vendor.d.ts.map +1 -0
  88. package/dist/services/vendor.js +119 -0
  89. package/dist/types.d.ts +67 -0
  90. package/dist/types.d.ts.map +1 -0
  91. package/dist/types.js +13 -0
  92. package/package.json +43 -0
  93. package/src/analytics-models.ts +75 -0
  94. package/src/hooks.ts +215 -0
  95. package/src/index.ts +124 -0
  96. package/src/mcp-tools.ts +210 -0
  97. package/src/routes/b2b.ts +179 -0
  98. package/src/routes/commission.ts +95 -0
  99. package/src/routes/disputes-returns-reviews.ts +209 -0
  100. package/src/routes/payouts.ts +49 -0
  101. package/src/routes/sub-orders.ts +54 -0
  102. package/src/routes/util.ts +42 -0
  103. package/src/routes/vendor-portal.ts +277 -0
  104. package/src/routes/vendors.ts +201 -0
  105. package/src/schema.ts +260 -0
  106. package/src/schemas/b2b.ts +238 -0
  107. package/src/schemas/commission.ts +129 -0
  108. package/src/schemas/disputes-returns-reviews.ts +311 -0
  109. package/src/schemas/payouts.ts +90 -0
  110. package/src/schemas/sub-orders.ts +77 -0
  111. package/src/schemas/vendor-portal.ts +344 -0
  112. package/src/schemas/vendors.ts +281 -0
  113. package/src/services/commission.ts +120 -0
  114. package/src/services/contract-price.ts +80 -0
  115. package/src/services/dispute.ts +92 -0
  116. package/src/services/payout.ts +154 -0
  117. package/src/services/return.ts +92 -0
  118. package/src/services/review.ts +76 -0
  119. package/src/services/rfq.ts +82 -0
  120. package/src/services/sub-order.ts +136 -0
  121. package/src/services/vendor.ts +151 -0
  122. package/src/types.ts +164 -0
@@ -0,0 +1,528 @@
1
+ import type { Db } from "../types";
2
+ export declare class VendorService {
3
+ private db;
4
+ constructor(db: Db);
5
+ create(orgId: string, data: {
6
+ name: string;
7
+ slug?: string;
8
+ email?: string;
9
+ description?: string;
10
+ commissionRateBps?: number;
11
+ metadata?: Record<string, unknown>;
12
+ }): Promise<{
13
+ id: string;
14
+ status: string;
15
+ createdAt: Date;
16
+ name: string;
17
+ organizationId: string;
18
+ slug: string | null;
19
+ email: string | null;
20
+ description: string | null;
21
+ logoUrl: string | null;
22
+ bannerUrl: string | null;
23
+ contactPhone: string | null;
24
+ businessAddress: {
25
+ line1?: string;
26
+ line2?: string;
27
+ city?: string;
28
+ state?: string;
29
+ postalCode?: string;
30
+ country?: string;
31
+ } | null;
32
+ bankAccount: {
33
+ accountHolder?: string;
34
+ bankName?: string;
35
+ routingNumber?: string;
36
+ accountNumber?: string;
37
+ iban?: string;
38
+ swift?: string;
39
+ } | null;
40
+ taxId: string | null;
41
+ verificationStatus: string;
42
+ rejectionReason: string | null;
43
+ approvedCategories: string[] | null;
44
+ tier: string;
45
+ performanceScore: number;
46
+ suspensionReason: string | null;
47
+ suspendedAt: Date | null;
48
+ commissionRateBps: number;
49
+ payoutSchedule: string;
50
+ payoutMinimumCents: number;
51
+ holdbackDays: number;
52
+ metadata: Record<string, unknown> | null;
53
+ storeConnectionProvider: string | null;
54
+ storeConnectionUrl: string | null;
55
+ storeAccessToken: string | null;
56
+ storeConsumerSecret: string | null;
57
+ storeWebhookSecret: string | null;
58
+ lastSyncAt: Date | null;
59
+ syncStatus: string | null;
60
+ updatedAt: Date;
61
+ } | undefined>;
62
+ getById(id: string): Promise<{
63
+ id: string;
64
+ organizationId: string;
65
+ name: string;
66
+ slug: string | null;
67
+ email: string | null;
68
+ description: string | null;
69
+ logoUrl: string | null;
70
+ bannerUrl: string | null;
71
+ contactPhone: string | null;
72
+ businessAddress: {
73
+ line1?: string;
74
+ line2?: string;
75
+ city?: string;
76
+ state?: string;
77
+ postalCode?: string;
78
+ country?: string;
79
+ } | null;
80
+ bankAccount: {
81
+ accountHolder?: string;
82
+ bankName?: string;
83
+ routingNumber?: string;
84
+ accountNumber?: string;
85
+ iban?: string;
86
+ swift?: string;
87
+ } | null;
88
+ taxId: string | null;
89
+ status: string;
90
+ verificationStatus: string;
91
+ rejectionReason: string | null;
92
+ approvedCategories: string[] | null;
93
+ tier: string;
94
+ performanceScore: number;
95
+ suspensionReason: string | null;
96
+ suspendedAt: Date | null;
97
+ commissionRateBps: number;
98
+ payoutSchedule: string;
99
+ payoutMinimumCents: number;
100
+ holdbackDays: number;
101
+ metadata: Record<string, unknown> | null;
102
+ storeConnectionProvider: string | null;
103
+ storeConnectionUrl: string | null;
104
+ storeAccessToken: string | null;
105
+ storeConsumerSecret: string | null;
106
+ storeWebhookSecret: string | null;
107
+ lastSyncAt: Date | null;
108
+ syncStatus: string | null;
109
+ createdAt: Date;
110
+ updatedAt: Date;
111
+ } | null>;
112
+ getBySlug(slug: string): Promise<{
113
+ id: string;
114
+ organizationId: string;
115
+ name: string;
116
+ slug: string | null;
117
+ email: string | null;
118
+ description: string | null;
119
+ logoUrl: string | null;
120
+ bannerUrl: string | null;
121
+ contactPhone: string | null;
122
+ businessAddress: {
123
+ line1?: string;
124
+ line2?: string;
125
+ city?: string;
126
+ state?: string;
127
+ postalCode?: string;
128
+ country?: string;
129
+ } | null;
130
+ bankAccount: {
131
+ accountHolder?: string;
132
+ bankName?: string;
133
+ routingNumber?: string;
134
+ accountNumber?: string;
135
+ iban?: string;
136
+ swift?: string;
137
+ } | null;
138
+ taxId: string | null;
139
+ status: string;
140
+ verificationStatus: string;
141
+ rejectionReason: string | null;
142
+ approvedCategories: string[] | null;
143
+ tier: string;
144
+ performanceScore: number;
145
+ suspensionReason: string | null;
146
+ suspendedAt: Date | null;
147
+ commissionRateBps: number;
148
+ payoutSchedule: string;
149
+ payoutMinimumCents: number;
150
+ holdbackDays: number;
151
+ metadata: Record<string, unknown> | null;
152
+ storeConnectionProvider: string | null;
153
+ storeConnectionUrl: string | null;
154
+ storeAccessToken: string | null;
155
+ storeConsumerSecret: string | null;
156
+ storeWebhookSecret: string | null;
157
+ lastSyncAt: Date | null;
158
+ syncStatus: string | null;
159
+ createdAt: Date;
160
+ updatedAt: Date;
161
+ } | null>;
162
+ list(filters?: {
163
+ status?: string;
164
+ tier?: string;
165
+ search?: string;
166
+ }): Promise<{
167
+ id: string;
168
+ organizationId: string;
169
+ name: string;
170
+ slug: string | null;
171
+ email: string | null;
172
+ description: string | null;
173
+ logoUrl: string | null;
174
+ bannerUrl: string | null;
175
+ contactPhone: string | null;
176
+ businessAddress: {
177
+ line1?: string;
178
+ line2?: string;
179
+ city?: string;
180
+ state?: string;
181
+ postalCode?: string;
182
+ country?: string;
183
+ } | null;
184
+ bankAccount: {
185
+ accountHolder?: string;
186
+ bankName?: string;
187
+ routingNumber?: string;
188
+ accountNumber?: string;
189
+ iban?: string;
190
+ swift?: string;
191
+ } | null;
192
+ taxId: string | null;
193
+ status: string;
194
+ verificationStatus: string;
195
+ rejectionReason: string | null;
196
+ approvedCategories: string[] | null;
197
+ tier: string;
198
+ performanceScore: number;
199
+ suspensionReason: string | null;
200
+ suspendedAt: Date | null;
201
+ commissionRateBps: number;
202
+ payoutSchedule: string;
203
+ payoutMinimumCents: number;
204
+ holdbackDays: number;
205
+ metadata: Record<string, unknown> | null;
206
+ storeConnectionProvider: string | null;
207
+ storeConnectionUrl: string | null;
208
+ storeAccessToken: string | null;
209
+ storeConsumerSecret: string | null;
210
+ storeWebhookSecret: string | null;
211
+ lastSyncAt: Date | null;
212
+ syncStatus: string | null;
213
+ createdAt: Date;
214
+ updatedAt: Date;
215
+ }[]>;
216
+ update(id: string, data: Partial<{
217
+ name: string;
218
+ slug: string;
219
+ email: string;
220
+ description: string;
221
+ logoUrl: string;
222
+ bannerUrl: string;
223
+ contactPhone: string;
224
+ businessAddress: Record<string, unknown>;
225
+ bankAccount: Record<string, unknown>;
226
+ taxId: string;
227
+ commissionRateBps: number;
228
+ payoutSchedule: string;
229
+ payoutMinimumCents: number;
230
+ holdbackDays: number;
231
+ metadata: Record<string, unknown>;
232
+ approvedCategories: string[] | null;
233
+ tier: string;
234
+ }>): Promise<{
235
+ id: string;
236
+ organizationId: string;
237
+ name: string;
238
+ slug: string | null;
239
+ email: string | null;
240
+ description: string | null;
241
+ logoUrl: string | null;
242
+ bannerUrl: string | null;
243
+ contactPhone: string | null;
244
+ businessAddress: {
245
+ line1?: string;
246
+ line2?: string;
247
+ city?: string;
248
+ state?: string;
249
+ postalCode?: string;
250
+ country?: string;
251
+ } | null;
252
+ bankAccount: {
253
+ accountHolder?: string;
254
+ bankName?: string;
255
+ routingNumber?: string;
256
+ accountNumber?: string;
257
+ iban?: string;
258
+ swift?: string;
259
+ } | null;
260
+ taxId: string | null;
261
+ status: string;
262
+ verificationStatus: string;
263
+ rejectionReason: string | null;
264
+ approvedCategories: string[] | null;
265
+ tier: string;
266
+ performanceScore: number;
267
+ suspensionReason: string | null;
268
+ suspendedAt: Date | null;
269
+ commissionRateBps: number;
270
+ payoutSchedule: string;
271
+ payoutMinimumCents: number;
272
+ holdbackDays: number;
273
+ metadata: Record<string, unknown> | null;
274
+ storeConnectionProvider: string | null;
275
+ storeConnectionUrl: string | null;
276
+ storeAccessToken: string | null;
277
+ storeConsumerSecret: string | null;
278
+ storeWebhookSecret: string | null;
279
+ lastSyncAt: Date | null;
280
+ syncStatus: string | null;
281
+ createdAt: Date;
282
+ updatedAt: Date;
283
+ } | null>;
284
+ approve(id: string): Promise<{
285
+ id: string;
286
+ organizationId: string;
287
+ name: string;
288
+ slug: string | null;
289
+ email: string | null;
290
+ description: string | null;
291
+ logoUrl: string | null;
292
+ bannerUrl: string | null;
293
+ contactPhone: string | null;
294
+ businessAddress: {
295
+ line1?: string;
296
+ line2?: string;
297
+ city?: string;
298
+ state?: string;
299
+ postalCode?: string;
300
+ country?: string;
301
+ } | null;
302
+ bankAccount: {
303
+ accountHolder?: string;
304
+ bankName?: string;
305
+ routingNumber?: string;
306
+ accountNumber?: string;
307
+ iban?: string;
308
+ swift?: string;
309
+ } | null;
310
+ taxId: string | null;
311
+ status: string;
312
+ verificationStatus: string;
313
+ rejectionReason: string | null;
314
+ approvedCategories: string[] | null;
315
+ tier: string;
316
+ performanceScore: number;
317
+ suspensionReason: string | null;
318
+ suspendedAt: Date | null;
319
+ commissionRateBps: number;
320
+ payoutSchedule: string;
321
+ payoutMinimumCents: number;
322
+ holdbackDays: number;
323
+ metadata: Record<string, unknown> | null;
324
+ storeConnectionProvider: string | null;
325
+ storeConnectionUrl: string | null;
326
+ storeAccessToken: string | null;
327
+ storeConsumerSecret: string | null;
328
+ storeWebhookSecret: string | null;
329
+ lastSyncAt: Date | null;
330
+ syncStatus: string | null;
331
+ createdAt: Date;
332
+ updatedAt: Date;
333
+ } | null>;
334
+ reject(id: string, reason: string): Promise<{
335
+ id: string;
336
+ organizationId: string;
337
+ name: string;
338
+ slug: string | null;
339
+ email: string | null;
340
+ description: string | null;
341
+ logoUrl: string | null;
342
+ bannerUrl: string | null;
343
+ contactPhone: string | null;
344
+ businessAddress: {
345
+ line1?: string;
346
+ line2?: string;
347
+ city?: string;
348
+ state?: string;
349
+ postalCode?: string;
350
+ country?: string;
351
+ } | null;
352
+ bankAccount: {
353
+ accountHolder?: string;
354
+ bankName?: string;
355
+ routingNumber?: string;
356
+ accountNumber?: string;
357
+ iban?: string;
358
+ swift?: string;
359
+ } | null;
360
+ taxId: string | null;
361
+ status: string;
362
+ verificationStatus: string;
363
+ rejectionReason: string | null;
364
+ approvedCategories: string[] | null;
365
+ tier: string;
366
+ performanceScore: number;
367
+ suspensionReason: string | null;
368
+ suspendedAt: Date | null;
369
+ commissionRateBps: number;
370
+ payoutSchedule: string;
371
+ payoutMinimumCents: number;
372
+ holdbackDays: number;
373
+ metadata: Record<string, unknown> | null;
374
+ storeConnectionProvider: string | null;
375
+ storeConnectionUrl: string | null;
376
+ storeAccessToken: string | null;
377
+ storeConsumerSecret: string | null;
378
+ storeWebhookSecret: string | null;
379
+ lastSyncAt: Date | null;
380
+ syncStatus: string | null;
381
+ createdAt: Date;
382
+ updatedAt: Date;
383
+ } | null>;
384
+ suspend(id: string, reason: string): Promise<{
385
+ id: string;
386
+ organizationId: string;
387
+ name: string;
388
+ slug: string | null;
389
+ email: string | null;
390
+ description: string | null;
391
+ logoUrl: string | null;
392
+ bannerUrl: string | null;
393
+ contactPhone: string | null;
394
+ businessAddress: {
395
+ line1?: string;
396
+ line2?: string;
397
+ city?: string;
398
+ state?: string;
399
+ postalCode?: string;
400
+ country?: string;
401
+ } | null;
402
+ bankAccount: {
403
+ accountHolder?: string;
404
+ bankName?: string;
405
+ routingNumber?: string;
406
+ accountNumber?: string;
407
+ iban?: string;
408
+ swift?: string;
409
+ } | null;
410
+ taxId: string | null;
411
+ status: string;
412
+ verificationStatus: string;
413
+ rejectionReason: string | null;
414
+ approvedCategories: string[] | null;
415
+ tier: string;
416
+ performanceScore: number;
417
+ suspensionReason: string | null;
418
+ suspendedAt: Date | null;
419
+ commissionRateBps: number;
420
+ payoutSchedule: string;
421
+ payoutMinimumCents: number;
422
+ holdbackDays: number;
423
+ metadata: Record<string, unknown> | null;
424
+ storeConnectionProvider: string | null;
425
+ storeConnectionUrl: string | null;
426
+ storeAccessToken: string | null;
427
+ storeConsumerSecret: string | null;
428
+ storeWebhookSecret: string | null;
429
+ lastSyncAt: Date | null;
430
+ syncStatus: string | null;
431
+ createdAt: Date;
432
+ updatedAt: Date;
433
+ } | null>;
434
+ reinstate(id: string): Promise<{
435
+ id: string;
436
+ organizationId: string;
437
+ name: string;
438
+ slug: string | null;
439
+ email: string | null;
440
+ description: string | null;
441
+ logoUrl: string | null;
442
+ bannerUrl: string | null;
443
+ contactPhone: string | null;
444
+ businessAddress: {
445
+ line1?: string;
446
+ line2?: string;
447
+ city?: string;
448
+ state?: string;
449
+ postalCode?: string;
450
+ country?: string;
451
+ } | null;
452
+ bankAccount: {
453
+ accountHolder?: string;
454
+ bankName?: string;
455
+ routingNumber?: string;
456
+ accountNumber?: string;
457
+ iban?: string;
458
+ swift?: string;
459
+ } | null;
460
+ taxId: string | null;
461
+ status: string;
462
+ verificationStatus: string;
463
+ rejectionReason: string | null;
464
+ approvedCategories: string[] | null;
465
+ tier: string;
466
+ performanceScore: number;
467
+ suspensionReason: string | null;
468
+ suspendedAt: Date | null;
469
+ commissionRateBps: number;
470
+ payoutSchedule: string;
471
+ payoutMinimumCents: number;
472
+ holdbackDays: number;
473
+ metadata: Record<string, unknown> | null;
474
+ storeConnectionProvider: string | null;
475
+ storeConnectionUrl: string | null;
476
+ storeAccessToken: string | null;
477
+ storeConsumerSecret: string | null;
478
+ storeWebhookSecret: string | null;
479
+ lastSyncAt: Date | null;
480
+ syncStatus: string | null;
481
+ createdAt: Date;
482
+ updatedAt: Date;
483
+ } | null>;
484
+ uploadDocument(vendorId: string, data: {
485
+ type: string;
486
+ fileUrl: string;
487
+ }): Promise<{
488
+ id: string;
489
+ vendorId: string;
490
+ status: string;
491
+ type: string;
492
+ fileUrl: string;
493
+ reviewerNotes: string | null;
494
+ uploadedAt: Date;
495
+ reviewedAt: Date | null;
496
+ } | undefined>;
497
+ listDocuments(vendorId: string): Promise<{
498
+ id: string;
499
+ vendorId: string;
500
+ type: string;
501
+ fileUrl: string;
502
+ status: string;
503
+ reviewerNotes: string | null;
504
+ uploadedAt: Date;
505
+ reviewedAt: Date | null;
506
+ }[]>;
507
+ approveDocument(docId: string, notes?: string): Promise<{
508
+ id: string;
509
+ vendorId: string;
510
+ type: string;
511
+ fileUrl: string;
512
+ status: string;
513
+ reviewerNotes: string | null;
514
+ uploadedAt: Date;
515
+ reviewedAt: Date | null;
516
+ } | null>;
517
+ rejectDocument(docId: string, notes?: string): Promise<{
518
+ id: string;
519
+ vendorId: string;
520
+ type: string;
521
+ fileUrl: string;
522
+ status: string;
523
+ reviewerNotes: string | null;
524
+ uploadedAt: Date;
525
+ reviewedAt: Date | null;
526
+ } | null>;
527
+ }
528
+ //# sourceMappingURL=vendor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vendor.d.ts","sourceRoot":"","sources":["../../src/services/vendor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ import { eq, and, or, ilike, desc } from "drizzle-orm";
2
+ import { vendors, vendorDocuments } from "../schema";
3
+ export class VendorService {
4
+ db;
5
+ constructor(db) {
6
+ this.db = db;
7
+ }
8
+ async create(orgId, data) {
9
+ const [vendor] = await this.db.insert(vendors).values({
10
+ organizationId: orgId,
11
+ name: data.name,
12
+ slug: data.slug ?? data.name.toLowerCase().replace(/[^a-z0-9]+/g, "-"),
13
+ email: data.email,
14
+ description: data.description,
15
+ commissionRateBps: data.commissionRateBps,
16
+ metadata: data.metadata ?? {},
17
+ }).returning();
18
+ return vendor;
19
+ }
20
+ async getById(id) {
21
+ const [vendor] = await this.db.select().from(vendors).where(eq(vendors.id, id));
22
+ return vendor ?? null;
23
+ }
24
+ async getBySlug(slug) {
25
+ const [vendor] = await this.db.select().from(vendors).where(eq(vendors.slug, slug));
26
+ return vendor ?? null;
27
+ }
28
+ async list(filters) {
29
+ let query = this.db.select().from(vendors).$dynamic();
30
+ const conditions = [];
31
+ if (filters?.status)
32
+ conditions.push(eq(vendors.status, filters.status));
33
+ if (filters?.tier)
34
+ conditions.push(eq(vendors.tier, filters.tier));
35
+ if (filters?.search) {
36
+ conditions.push(or(ilike(vendors.name, `%${filters.search}%`), ilike(vendors.email, `%${filters.search}%`)));
37
+ }
38
+ if (conditions.length > 0) {
39
+ query = query.where(conditions.length === 1 ? conditions[0] : and(...conditions));
40
+ }
41
+ return query.orderBy(desc(vendors.createdAt));
42
+ }
43
+ async update(id, data) {
44
+ const [updated] = await this.db.update(vendors).set({
45
+ ...data,
46
+ updatedAt: new Date(),
47
+ }).where(eq(vendors.id, id)).returning();
48
+ return updated ?? null;
49
+ }
50
+ async approve(id) {
51
+ const [updated] = await this.db.update(vendors).set({
52
+ status: "approved",
53
+ updatedAt: new Date(),
54
+ }).where(eq(vendors.id, id)).returning();
55
+ return updated ?? null;
56
+ }
57
+ async reject(id, reason) {
58
+ const [updated] = await this.db.update(vendors).set({
59
+ status: "pending",
60
+ verificationStatus: "rejected",
61
+ rejectionReason: reason,
62
+ updatedAt: new Date(),
63
+ }).where(eq(vendors.id, id)).returning();
64
+ return updated ?? null;
65
+ }
66
+ async suspend(id, reason) {
67
+ const [updated] = await this.db.update(vendors).set({
68
+ status: "suspended",
69
+ suspensionReason: reason,
70
+ suspendedAt: new Date(),
71
+ updatedAt: new Date(),
72
+ }).where(eq(vendors.id, id)).returning();
73
+ return updated ?? null;
74
+ }
75
+ async reinstate(id) {
76
+ const [updated] = await this.db.update(vendors).set({
77
+ status: "approved",
78
+ suspensionReason: null,
79
+ suspendedAt: null,
80
+ updatedAt: new Date(),
81
+ }).where(eq(vendors.id, id)).returning();
82
+ return updated ?? null;
83
+ }
84
+ // ─── Documents ───────────────────────────────────────────────────────────
85
+ async uploadDocument(vendorId, data) {
86
+ const [doc] = await this.db.insert(vendorDocuments).values({
87
+ vendorId,
88
+ type: data.type,
89
+ fileUrl: data.fileUrl,
90
+ }).returning();
91
+ // Update vendor verification status
92
+ await this.db.update(vendors).set({
93
+ verificationStatus: "documents_submitted",
94
+ updatedAt: new Date(),
95
+ }).where(eq(vendors.id, vendorId));
96
+ return doc;
97
+ }
98
+ async listDocuments(vendorId) {
99
+ return this.db.select().from(vendorDocuments)
100
+ .where(eq(vendorDocuments.vendorId, vendorId))
101
+ .orderBy(desc(vendorDocuments.uploadedAt));
102
+ }
103
+ async approveDocument(docId, notes) {
104
+ const [updated] = await this.db.update(vendorDocuments).set({
105
+ status: "approved",
106
+ reviewerNotes: notes,
107
+ reviewedAt: new Date(),
108
+ }).where(eq(vendorDocuments.id, docId)).returning();
109
+ return updated ?? null;
110
+ }
111
+ async rejectDocument(docId, notes) {
112
+ const [updated] = await this.db.update(vendorDocuments).set({
113
+ status: "rejected",
114
+ reviewerNotes: notes,
115
+ reviewedAt: new Date(),
116
+ }).where(eq(vendorDocuments.id, docId)).returning();
117
+ return updated ?? null;
118
+ }
119
+ }