@axova/shared 1.0.2 → 1.1.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 (68) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +2 -0
  3. package/dist/lib/db.d.ts +34406 -1
  4. package/dist/lib/db.js +21 -1
  5. package/dist/middleware/storeOwnership.js +22 -3
  6. package/dist/middleware/storeValidationMiddleware.js +16 -39
  7. package/dist/schemas/admin/admin-schema.d.ts +2 -2
  8. package/dist/schemas/ai-moderation/ai-moderation-schema.d.ts +6 -6
  9. package/dist/schemas/common/common-schemas.d.ts +71 -71
  10. package/dist/schemas/compliance/compliance-schema.d.ts +20 -20
  11. package/dist/schemas/compliance/kyc-schema.d.ts +8 -8
  12. package/dist/schemas/customer/customer-schema.d.ts +18 -18
  13. package/dist/schemas/index.d.ts +28 -0
  14. package/dist/schemas/index.js +134 -3
  15. package/dist/schemas/inventory/inventory-tables.d.ts +188 -188
  16. package/dist/schemas/inventory/lot-tables.d.ts +102 -102
  17. package/dist/schemas/order/cart-schema.d.ts +2865 -0
  18. package/dist/schemas/order/cart-schema.js +396 -0
  19. package/dist/schemas/order/order-schema.d.ts +19 -19
  20. package/dist/schemas/order/order-schema.js +8 -2
  21. package/dist/schemas/product/discount-schema.d.ts +3 -3
  22. package/dist/schemas/product/product-schema.d.ts +3 -3
  23. package/dist/schemas/store/store-audit-schema.d.ts +20 -20
  24. package/dist/schemas/store/store-schema.d.ts +182 -2
  25. package/dist/schemas/store/store-schema.js +19 -0
  26. package/dist/schemas/store/storefront-config-schema.d.ts +434 -823
  27. package/dist/schemas/store/storefront-config-schema.js +35 -62
  28. package/dist/utils/subdomain.d.ts +1 -1
  29. package/dist/utils/subdomain.js +10 -15
  30. package/package.json +1 -1
  31. package/src/configs/index.ts +654 -654
  32. package/src/index.ts +26 -23
  33. package/src/interfaces/customer-events.ts +106 -106
  34. package/src/interfaces/inventory-events.ts +545 -545
  35. package/src/interfaces/inventory-types.ts +1004 -1004
  36. package/src/interfaces/order-events.ts +381 -381
  37. package/src/lib/auditLogger.ts +1117 -1117
  38. package/src/lib/authOrganization.ts +153 -153
  39. package/src/lib/db.ts +84 -64
  40. package/src/middleware/serviceAuth.ts +328 -328
  41. package/src/middleware/storeOwnership.ts +199 -181
  42. package/src/middleware/storeValidationMiddleware.ts +17 -50
  43. package/src/middleware/userAuth.ts +248 -248
  44. package/src/schemas/admin/admin-schema.ts +208 -208
  45. package/src/schemas/ai-moderation/ai-moderation-schema.ts +180 -180
  46. package/src/schemas/common/common-schemas.ts +108 -108
  47. package/src/schemas/compliance/compliance-schema.ts +927 -0
  48. package/src/schemas/compliance/kyc-schema.ts +649 -0
  49. package/src/schemas/customer/customer-schema.ts +576 -0
  50. package/src/schemas/index.ts +202 -3
  51. package/src/schemas/inventory/inventory-tables.ts +1927 -0
  52. package/src/schemas/inventory/lot-tables.ts +799 -0
  53. package/src/schemas/order/cart-schema.ts +652 -0
  54. package/src/schemas/order/order-schema.ts +1406 -0
  55. package/src/schemas/product/discount-relations.ts +44 -0
  56. package/src/schemas/product/discount-schema.ts +464 -0
  57. package/src/schemas/product/product-relations.ts +187 -0
  58. package/src/schemas/product/product-schema.ts +955 -0
  59. package/src/schemas/store/ethiopian_business_api.md.resolved +212 -0
  60. package/src/schemas/store/store-audit-schema.ts +1257 -0
  61. package/src/schemas/store/store-schema.ts +682 -0
  62. package/src/schemas/store/store-settings-schema.ts +231 -0
  63. package/src/schemas/store/storefront-config-schema.ts +382 -0
  64. package/src/schemas/types.ts +67 -67
  65. package/src/types/events.ts +646 -646
  66. package/src/utils/errorHandler.ts +44 -44
  67. package/src/utils/subdomain.ts +19 -23
  68. package/tsconfig.json +21 -21
@@ -1,545 +1,545 @@
1
- // Inventory service events and configuration interfaces
2
-
3
- // =====================================================
4
- // EVENT SYSTEM INTERFACES
5
- // =====================================================
6
-
7
- export interface ServiceEvents {
8
- // Inventory events
9
- "inventory.item.created": {
10
- inventoryItemId: string;
11
- sku: string;
12
- locationId: string;
13
- initialQuantity: number;
14
- };
15
-
16
- "inventory.item.updated": {
17
- inventoryItemId: string;
18
- sku: string;
19
- changes: Record<string, unknown>;
20
- };
21
-
22
- "inventory.quantity.changed": {
23
- inventoryItemId: string;
24
- sku: string;
25
- locationId: string;
26
- previousQuantity: number;
27
- newQuantity: number;
28
- changeType: string;
29
- reason: string;
30
- };
31
-
32
- "inventory.low_stock.detected": {
33
- inventoryItemId: string;
34
- sku: string;
35
- locationId: string;
36
- currentQuantity: number;
37
- reorderPoint: number;
38
- severity: "low" | "medium" | "high" | "critical";
39
- };
40
-
41
- "inventory.out_of_stock.detected": {
42
- inventoryItemId: string;
43
- sku: string;
44
- locationId: string;
45
- lastAvailableDate: Date;
46
- };
47
-
48
- // Transfer events
49
- "transfer.created": {
50
- transferId: string;
51
- transferNumber: string;
52
- sourceLocationId: string;
53
- destinationLocationId: string;
54
- totalItems: number;
55
- priority: string;
56
- };
57
-
58
- "transfer.status.changed": {
59
- transferId: string;
60
- transferNumber: string;
61
- fromStatus: string;
62
- toStatus: string;
63
- changedBy: string;
64
- };
65
-
66
- "transfer.completed": {
67
- transferId: string;
68
- transferNumber: string;
69
- sourceLocationId: string;
70
- destinationLocationId: string;
71
- totalItems: number;
72
- totalValue: number;
73
- hasDiscrepancies: boolean;
74
- };
75
-
76
- // Cycle count events
77
- "cycle_count.created": {
78
- cycleCountId: string;
79
- countNumber: string;
80
- countType: string;
81
- scheduledDate: Date;
82
- totalItems: number;
83
- };
84
-
85
- "cycle_count.completed": {
86
- cycleCountId: string;
87
- countNumber: string;
88
- totalItemsCounted: number;
89
- accuracyPercentage: number;
90
- discrepanciesFound: number;
91
- };
92
-
93
- "cycle_count.discrepancy.detected": {
94
- cycleCountId: string;
95
- cycleCountItemId: string;
96
- sku: string;
97
- systemQuantity: number;
98
- countedQuantity: number;
99
- variance: number;
100
- severity: string;
101
- };
102
-
103
- // Batch tracking events
104
- "batch.created": {
105
- batchId: string;
106
- batchNumber: string;
107
- sku: string;
108
- initialQuantity: number;
109
- expiryDate?: Date;
110
- };
111
-
112
- "batch.expiry.warning": {
113
- batchId: string;
114
- batchNumber: string;
115
- sku: string;
116
- expiryDate: Date;
117
- daysUntilExpiry: number;
118
- currentQuantity: number;
119
- };
120
-
121
- "batch.expired": {
122
- batchId: string;
123
- batchNumber: string;
124
- sku: string;
125
- expiryDate: Date;
126
- currentQuantity: number;
127
- estimatedLoss: number;
128
- };
129
-
130
- // Automation events
131
- "automation.rule.triggered": {
132
- ruleId: string;
133
- ruleName: string;
134
- triggerCondition: string;
135
- affectedItems: string[];
136
- };
137
-
138
- "automation.rule.executed": {
139
- ruleId: string;
140
- ruleName: string;
141
- executionId: string;
142
- status: "success" | "failure" | "partial";
143
- itemsProcessed: number;
144
- duration: number;
145
- };
146
-
147
- "automation.recommendation.generated": {
148
- recommendationType: string;
149
- confidence: number;
150
- affectedItems: string[];
151
- estimatedImpact: number;
152
- };
153
-
154
- // Warehouse events
155
- "warehouse.capacity.warning": {
156
- warehouseId: string;
157
- warehouseName: string;
158
- currentCapacity: number;
159
- maxCapacity: number;
160
- utilizationPercentage: number;
161
- };
162
-
163
- "warehouse.zone.full": {
164
- warehouseId: string;
165
- zoneId: string;
166
- zoneName: string;
167
- utilizationPercentage: number;
168
- };
169
-
170
- // Alert events
171
- "alert.created": {
172
- alertId: string;
173
- alertType: string;
174
- severity: string;
175
- message: string;
176
- affectedItems: string[];
177
- };
178
-
179
- "alert.resolved": {
180
- alertId: string;
181
- alertType: string;
182
- resolvedBy: string;
183
- resolutionNotes?: string;
184
- };
185
-
186
- // Audit events
187
- "audit.log.created": {
188
- auditLogId: string;
189
- eventType: string;
190
- inventoryItemId: string;
191
- quantityChange: number;
192
- userId: string;
193
- };
194
-
195
- "audit.export.requested": {
196
- exportId: string;
197
- exportType: string;
198
- requestedBy: string;
199
- dateRange: {
200
- startDate: Date;
201
- endDate: Date;
202
- };
203
- };
204
-
205
- "audit.export.completed": {
206
- exportId: string;
207
- exportType: string;
208
- recordCount: number;
209
- fileSize: number;
210
- downloadUrl: string;
211
- };
212
- }
213
-
214
- // =====================================================
215
- // SERVICE CONFIGURATION
216
- // =====================================================
217
-
218
- export interface ServiceConfig {
219
- // Database configuration
220
- database: {
221
- host: string;
222
- port: number;
223
- name: string;
224
- user: string;
225
- password: string;
226
- ssl: boolean;
227
- poolSize: number;
228
- connectionTimeout: number;
229
- idleTimeout: number;
230
- };
231
-
232
- // Redis configuration
233
- redis: {
234
- host: string;
235
- port: number;
236
- password?: string;
237
- db: number;
238
- keyPrefix: string;
239
- ttl: {
240
- default: number;
241
- short: number;
242
- long: number;
243
- };
244
- };
245
-
246
- // Kafka configuration
247
- kafka: {
248
- brokers: string[];
249
- clientId: string;
250
- groupId: string;
251
- topics: {
252
- inventory: string;
253
- transfers: string;
254
- cycleCounts: string;
255
- batches: string;
256
- automation: string;
257
- alerts: string;
258
- audit: string;
259
- };
260
- retryConfig: {
261
- retries: number;
262
- retryDelay: number;
263
- maxRetryDelay: number;
264
- };
265
- };
266
-
267
- // Service configuration
268
- service: {
269
- port: number;
270
- host: string;
271
- name: string;
272
- version: string;
273
- environment: "development" | "staging" | "production";
274
- logLevel: "debug" | "info" | "warn" | "error";
275
- corsOrigins: string[];
276
- rateLimiting: {
277
- windowMs: number;
278
- maxRequests: number;
279
- skipSuccessfulRequests: boolean;
280
- };
281
- };
282
-
283
- // Feature flags
284
- features: {
285
- batchTracking: boolean;
286
- serialNumberTracking: boolean;
287
- aiRecommendations: boolean;
288
- automation: boolean;
289
- advancedAnalytics: boolean;
290
- realTimeSync: boolean;
291
- mobileApp: boolean;
292
- apiDocumentation: boolean;
293
- };
294
-
295
- // Business rules
296
- businessRules: {
297
- inventory: {
298
- allowNegativeStock: boolean;
299
- autoCreateItems: boolean;
300
- defaultReorderPoint: number;
301
- defaultSafetyStock: number;
302
- lowStockThreshold: number;
303
- criticalStockThreshold: number;
304
- };
305
-
306
- transfers: {
307
- requireApprovalAboveValue: number;
308
- requireApprovalForUrgent: boolean;
309
- autoApproveInternal: boolean;
310
- maxPartialTransfers: number;
311
- defaultLeadTime: number;
312
- };
313
-
314
- cycleCounts: {
315
- defaultTolerancePercentage: number;
316
- requireApprovalForAdjustments: boolean;
317
- autoReconcileWithinTolerance: boolean;
318
- maxCountsPerDay: number;
319
- requiredPhotosForDiscrepancies: boolean;
320
- };
321
-
322
- batches: {
323
- expiryWarningDays: number;
324
- criticalExpiryDays: number;
325
- autoQuarantineExpired: boolean;
326
- requireQualityApproval: boolean;
327
- fifoEnforcement: boolean;
328
- };
329
-
330
- automation: {
331
- maxRulesPerTenant: number;
332
- maxExecutionsPerDay: number;
333
- requireApprovalForHighValue: boolean;
334
- enableMachineLearning: boolean;
335
- confidenceThreshold: number;
336
- };
337
- };
338
-
339
- // Integration settings
340
- integrations: {
341
- erp: {
342
- enabled: boolean;
343
- endpoint: string;
344
- apiKey: string;
345
- syncInterval: number;
346
- timeout: number;
347
- };
348
-
349
- pos: {
350
- enabled: boolean;
351
- syncInterval: number;
352
- offlineThreshold: number;
353
- conflictResolution: "server_wins" | "client_wins" | "manual";
354
- };
355
-
356
- ecommerce: {
357
- enabled: boolean;
358
- realTimeInventory: boolean;
359
- reservationTimeout: number;
360
- stockBuffer: number;
361
- };
362
-
363
- wms: {
364
- enabled: boolean;
365
- endpoint: string;
366
- autoReceiveTransfers: boolean;
367
- binLocationSync: boolean;
368
- };
369
-
370
- notifications: {
371
- email: {
372
- enabled: boolean;
373
- smtpHost: string;
374
- smtpPort: number;
375
- username: string;
376
- password: string;
377
- fromAddress: string;
378
- };
379
-
380
- sms: {
381
- enabled: boolean;
382
- provider: string;
383
- apiKey: string;
384
- fromNumber: string;
385
- };
386
-
387
- webhook: {
388
- enabled: boolean;
389
- endpoints: Array<{
390
- url: string;
391
- events: string[];
392
- authentication: {
393
- type: "none" | "api_key" | "bearer_token";
394
- credentials: Record<string, string>;
395
- };
396
- }>;
397
- };
398
- };
399
- };
400
-
401
- // Security settings
402
- security: {
403
- jwt: {
404
- secret: string;
405
- expiresIn: string;
406
- issuer: string;
407
- audience: string;
408
- };
409
-
410
- encryption: {
411
- algorithm: string;
412
- keySize: number;
413
- saltRounds: number;
414
- };
415
-
416
- rateLimiting: {
417
- enabled: boolean;
418
- windowMs: number;
419
- maxRequests: number;
420
- skipSuccessfulRequests: boolean;
421
- };
422
-
423
- auditLogging: {
424
- enabled: boolean;
425
- logAllRequests: boolean;
426
- retentionDays: number;
427
- complianceMode: boolean;
428
- };
429
- };
430
-
431
- // Performance settings
432
- performance: {
433
- caching: {
434
- enabled: boolean;
435
- defaultTtl: number;
436
- inventoryTtl: number;
437
- analyticsTtl: number;
438
- };
439
-
440
- pagination: {
441
- defaultLimit: number;
442
- maxLimit: number;
443
- };
444
-
445
- backgroundJobs: {
446
- enabled: boolean;
447
- concurrency: number;
448
- retryAttempts: number;
449
- retryDelay: number;
450
- };
451
- };
452
-
453
- // Monitoring and observability
454
- monitoring: {
455
- healthChecks: {
456
- enabled: boolean;
457
- interval: number;
458
- timeout: number;
459
- };
460
-
461
- metrics: {
462
- enabled: boolean;
463
- endpoint: string;
464
- interval: number;
465
- };
466
-
467
- tracing: {
468
- enabled: boolean;
469
- serviceName: string;
470
- endpoint: string;
471
- sampleRate: number;
472
- };
473
-
474
- logging: {
475
- level: string;
476
- format: "json" | "text";
477
- destination: "console" | "file" | "both";
478
- maxFileSize: string;
479
- maxFiles: number;
480
- };
481
- };
482
- }
483
-
484
- // Event payload types
485
- export type EventPayload<T extends keyof ServiceEvents> = ServiceEvents[T];
486
-
487
- // Event handler type
488
- export type EventHandler<T extends keyof ServiceEvents> = (
489
- payload: EventPayload<T>,
490
- ) => Promise<void> | void;
491
-
492
- // Event emitter interface
493
- export interface EventEmitter {
494
- emit<T extends keyof ServiceEvents>(
495
- event: T,
496
- payload: EventPayload<T>,
497
- ): Promise<void>;
498
- on<T extends keyof ServiceEvents>(event: T, handler: EventHandler<T>): void;
499
- off<T extends keyof ServiceEvents>(event: T, handler: EventHandler<T>): void;
500
- }
501
-
502
- // Health check interface
503
- export interface HealthCheckResult {
504
- status: "healthy" | "unhealthy" | "degraded";
505
- timestamp: Date;
506
- duration: number;
507
- checks: {
508
- database: {
509
- status: "healthy" | "unhealthy";
510
- latency: number;
511
- error?: string;
512
- };
513
- redis: {
514
- status: "healthy" | "unhealthy";
515
- latency: number;
516
- error?: string;
517
- };
518
- kafka: {
519
- status: "healthy" | "unhealthy";
520
- latency: number;
521
- error?: string;
522
- };
523
- externalServices: {
524
- status: "healthy" | "unhealthy" | "degraded";
525
- services: Array<{
526
- name: string;
527
- status: "healthy" | "unhealthy";
528
- latency: number;
529
- error?: string;
530
- }>;
531
- };
532
- };
533
- metadata: {
534
- version: string;
535
- uptime: number;
536
- memory: {
537
- used: number;
538
- total: number;
539
- percentage: number;
540
- };
541
- cpu: {
542
- usage: number;
543
- };
544
- };
545
- }
1
+ // Inventory service events and configuration interfaces
2
+
3
+ // =====================================================
4
+ // EVENT SYSTEM INTERFACES
5
+ // =====================================================
6
+
7
+ export interface ServiceEvents {
8
+ // Inventory events
9
+ "inventory.item.created": {
10
+ inventoryItemId: string;
11
+ sku: string;
12
+ locationId: string;
13
+ initialQuantity: number;
14
+ };
15
+
16
+ "inventory.item.updated": {
17
+ inventoryItemId: string;
18
+ sku: string;
19
+ changes: Record<string, unknown>;
20
+ };
21
+
22
+ "inventory.quantity.changed": {
23
+ inventoryItemId: string;
24
+ sku: string;
25
+ locationId: string;
26
+ previousQuantity: number;
27
+ newQuantity: number;
28
+ changeType: string;
29
+ reason: string;
30
+ };
31
+
32
+ "inventory.low_stock.detected": {
33
+ inventoryItemId: string;
34
+ sku: string;
35
+ locationId: string;
36
+ currentQuantity: number;
37
+ reorderPoint: number;
38
+ severity: "low" | "medium" | "high" | "critical";
39
+ };
40
+
41
+ "inventory.out_of_stock.detected": {
42
+ inventoryItemId: string;
43
+ sku: string;
44
+ locationId: string;
45
+ lastAvailableDate: Date;
46
+ };
47
+
48
+ // Transfer events
49
+ "transfer.created": {
50
+ transferId: string;
51
+ transferNumber: string;
52
+ sourceLocationId: string;
53
+ destinationLocationId: string;
54
+ totalItems: number;
55
+ priority: string;
56
+ };
57
+
58
+ "transfer.status.changed": {
59
+ transferId: string;
60
+ transferNumber: string;
61
+ fromStatus: string;
62
+ toStatus: string;
63
+ changedBy: string;
64
+ };
65
+
66
+ "transfer.completed": {
67
+ transferId: string;
68
+ transferNumber: string;
69
+ sourceLocationId: string;
70
+ destinationLocationId: string;
71
+ totalItems: number;
72
+ totalValue: number;
73
+ hasDiscrepancies: boolean;
74
+ };
75
+
76
+ // Cycle count events
77
+ "cycle_count.created": {
78
+ cycleCountId: string;
79
+ countNumber: string;
80
+ countType: string;
81
+ scheduledDate: Date;
82
+ totalItems: number;
83
+ };
84
+
85
+ "cycle_count.completed": {
86
+ cycleCountId: string;
87
+ countNumber: string;
88
+ totalItemsCounted: number;
89
+ accuracyPercentage: number;
90
+ discrepanciesFound: number;
91
+ };
92
+
93
+ "cycle_count.discrepancy.detected": {
94
+ cycleCountId: string;
95
+ cycleCountItemId: string;
96
+ sku: string;
97
+ systemQuantity: number;
98
+ countedQuantity: number;
99
+ variance: number;
100
+ severity: string;
101
+ };
102
+
103
+ // Batch tracking events
104
+ "batch.created": {
105
+ batchId: string;
106
+ batchNumber: string;
107
+ sku: string;
108
+ initialQuantity: number;
109
+ expiryDate?: Date;
110
+ };
111
+
112
+ "batch.expiry.warning": {
113
+ batchId: string;
114
+ batchNumber: string;
115
+ sku: string;
116
+ expiryDate: Date;
117
+ daysUntilExpiry: number;
118
+ currentQuantity: number;
119
+ };
120
+
121
+ "batch.expired": {
122
+ batchId: string;
123
+ batchNumber: string;
124
+ sku: string;
125
+ expiryDate: Date;
126
+ currentQuantity: number;
127
+ estimatedLoss: number;
128
+ };
129
+
130
+ // Automation events
131
+ "automation.rule.triggered": {
132
+ ruleId: string;
133
+ ruleName: string;
134
+ triggerCondition: string;
135
+ affectedItems: string[];
136
+ };
137
+
138
+ "automation.rule.executed": {
139
+ ruleId: string;
140
+ ruleName: string;
141
+ executionId: string;
142
+ status: "success" | "failure" | "partial";
143
+ itemsProcessed: number;
144
+ duration: number;
145
+ };
146
+
147
+ "automation.recommendation.generated": {
148
+ recommendationType: string;
149
+ confidence: number;
150
+ affectedItems: string[];
151
+ estimatedImpact: number;
152
+ };
153
+
154
+ // Warehouse events
155
+ "warehouse.capacity.warning": {
156
+ warehouseId: string;
157
+ warehouseName: string;
158
+ currentCapacity: number;
159
+ maxCapacity: number;
160
+ utilizationPercentage: number;
161
+ };
162
+
163
+ "warehouse.zone.full": {
164
+ warehouseId: string;
165
+ zoneId: string;
166
+ zoneName: string;
167
+ utilizationPercentage: number;
168
+ };
169
+
170
+ // Alert events
171
+ "alert.created": {
172
+ alertId: string;
173
+ alertType: string;
174
+ severity: string;
175
+ message: string;
176
+ affectedItems: string[];
177
+ };
178
+
179
+ "alert.resolved": {
180
+ alertId: string;
181
+ alertType: string;
182
+ resolvedBy: string;
183
+ resolutionNotes?: string;
184
+ };
185
+
186
+ // Audit events
187
+ "audit.log.created": {
188
+ auditLogId: string;
189
+ eventType: string;
190
+ inventoryItemId: string;
191
+ quantityChange: number;
192
+ userId: string;
193
+ };
194
+
195
+ "audit.export.requested": {
196
+ exportId: string;
197
+ exportType: string;
198
+ requestedBy: string;
199
+ dateRange: {
200
+ startDate: Date;
201
+ endDate: Date;
202
+ };
203
+ };
204
+
205
+ "audit.export.completed": {
206
+ exportId: string;
207
+ exportType: string;
208
+ recordCount: number;
209
+ fileSize: number;
210
+ downloadUrl: string;
211
+ };
212
+ }
213
+
214
+ // =====================================================
215
+ // SERVICE CONFIGURATION
216
+ // =====================================================
217
+
218
+ export interface ServiceConfig {
219
+ // Database configuration
220
+ database: {
221
+ host: string;
222
+ port: number;
223
+ name: string;
224
+ user: string;
225
+ password: string;
226
+ ssl: boolean;
227
+ poolSize: number;
228
+ connectionTimeout: number;
229
+ idleTimeout: number;
230
+ };
231
+
232
+ // Redis configuration
233
+ redis: {
234
+ host: string;
235
+ port: number;
236
+ password?: string;
237
+ db: number;
238
+ keyPrefix: string;
239
+ ttl: {
240
+ default: number;
241
+ short: number;
242
+ long: number;
243
+ };
244
+ };
245
+
246
+ // Kafka configuration
247
+ kafka: {
248
+ brokers: string[];
249
+ clientId: string;
250
+ groupId: string;
251
+ topics: {
252
+ inventory: string;
253
+ transfers: string;
254
+ cycleCounts: string;
255
+ batches: string;
256
+ automation: string;
257
+ alerts: string;
258
+ audit: string;
259
+ };
260
+ retryConfig: {
261
+ retries: number;
262
+ retryDelay: number;
263
+ maxRetryDelay: number;
264
+ };
265
+ };
266
+
267
+ // Service configuration
268
+ service: {
269
+ port: number;
270
+ host: string;
271
+ name: string;
272
+ version: string;
273
+ environment: "development" | "staging" | "production";
274
+ logLevel: "debug" | "info" | "warn" | "error";
275
+ corsOrigins: string[];
276
+ rateLimiting: {
277
+ windowMs: number;
278
+ maxRequests: number;
279
+ skipSuccessfulRequests: boolean;
280
+ };
281
+ };
282
+
283
+ // Feature flags
284
+ features: {
285
+ batchTracking: boolean;
286
+ serialNumberTracking: boolean;
287
+ aiRecommendations: boolean;
288
+ automation: boolean;
289
+ advancedAnalytics: boolean;
290
+ realTimeSync: boolean;
291
+ mobileApp: boolean;
292
+ apiDocumentation: boolean;
293
+ };
294
+
295
+ // Business rules
296
+ businessRules: {
297
+ inventory: {
298
+ allowNegativeStock: boolean;
299
+ autoCreateItems: boolean;
300
+ defaultReorderPoint: number;
301
+ defaultSafetyStock: number;
302
+ lowStockThreshold: number;
303
+ criticalStockThreshold: number;
304
+ };
305
+
306
+ transfers: {
307
+ requireApprovalAboveValue: number;
308
+ requireApprovalForUrgent: boolean;
309
+ autoApproveInternal: boolean;
310
+ maxPartialTransfers: number;
311
+ defaultLeadTime: number;
312
+ };
313
+
314
+ cycleCounts: {
315
+ defaultTolerancePercentage: number;
316
+ requireApprovalForAdjustments: boolean;
317
+ autoReconcileWithinTolerance: boolean;
318
+ maxCountsPerDay: number;
319
+ requiredPhotosForDiscrepancies: boolean;
320
+ };
321
+
322
+ batches: {
323
+ expiryWarningDays: number;
324
+ criticalExpiryDays: number;
325
+ autoQuarantineExpired: boolean;
326
+ requireQualityApproval: boolean;
327
+ fifoEnforcement: boolean;
328
+ };
329
+
330
+ automation: {
331
+ maxRulesPerTenant: number;
332
+ maxExecutionsPerDay: number;
333
+ requireApprovalForHighValue: boolean;
334
+ enableMachineLearning: boolean;
335
+ confidenceThreshold: number;
336
+ };
337
+ };
338
+
339
+ // Integration settings
340
+ integrations: {
341
+ erp: {
342
+ enabled: boolean;
343
+ endpoint: string;
344
+ apiKey: string;
345
+ syncInterval: number;
346
+ timeout: number;
347
+ };
348
+
349
+ pos: {
350
+ enabled: boolean;
351
+ syncInterval: number;
352
+ offlineThreshold: number;
353
+ conflictResolution: "server_wins" | "client_wins" | "manual";
354
+ };
355
+
356
+ ecommerce: {
357
+ enabled: boolean;
358
+ realTimeInventory: boolean;
359
+ reservationTimeout: number;
360
+ stockBuffer: number;
361
+ };
362
+
363
+ wms: {
364
+ enabled: boolean;
365
+ endpoint: string;
366
+ autoReceiveTransfers: boolean;
367
+ binLocationSync: boolean;
368
+ };
369
+
370
+ notifications: {
371
+ email: {
372
+ enabled: boolean;
373
+ smtpHost: string;
374
+ smtpPort: number;
375
+ username: string;
376
+ password: string;
377
+ fromAddress: string;
378
+ };
379
+
380
+ sms: {
381
+ enabled: boolean;
382
+ provider: string;
383
+ apiKey: string;
384
+ fromNumber: string;
385
+ };
386
+
387
+ webhook: {
388
+ enabled: boolean;
389
+ endpoints: Array<{
390
+ url: string;
391
+ events: string[];
392
+ authentication: {
393
+ type: "none" | "api_key" | "bearer_token";
394
+ credentials: Record<string, string>;
395
+ };
396
+ }>;
397
+ };
398
+ };
399
+ };
400
+
401
+ // Security settings
402
+ security: {
403
+ jwt: {
404
+ secret: string;
405
+ expiresIn: string;
406
+ issuer: string;
407
+ audience: string;
408
+ };
409
+
410
+ encryption: {
411
+ algorithm: string;
412
+ keySize: number;
413
+ saltRounds: number;
414
+ };
415
+
416
+ rateLimiting: {
417
+ enabled: boolean;
418
+ windowMs: number;
419
+ maxRequests: number;
420
+ skipSuccessfulRequests: boolean;
421
+ };
422
+
423
+ auditLogging: {
424
+ enabled: boolean;
425
+ logAllRequests: boolean;
426
+ retentionDays: number;
427
+ complianceMode: boolean;
428
+ };
429
+ };
430
+
431
+ // Performance settings
432
+ performance: {
433
+ caching: {
434
+ enabled: boolean;
435
+ defaultTtl: number;
436
+ inventoryTtl: number;
437
+ analyticsTtl: number;
438
+ };
439
+
440
+ pagination: {
441
+ defaultLimit: number;
442
+ maxLimit: number;
443
+ };
444
+
445
+ backgroundJobs: {
446
+ enabled: boolean;
447
+ concurrency: number;
448
+ retryAttempts: number;
449
+ retryDelay: number;
450
+ };
451
+ };
452
+
453
+ // Monitoring and observability
454
+ monitoring: {
455
+ healthChecks: {
456
+ enabled: boolean;
457
+ interval: number;
458
+ timeout: number;
459
+ };
460
+
461
+ metrics: {
462
+ enabled: boolean;
463
+ endpoint: string;
464
+ interval: number;
465
+ };
466
+
467
+ tracing: {
468
+ enabled: boolean;
469
+ serviceName: string;
470
+ endpoint: string;
471
+ sampleRate: number;
472
+ };
473
+
474
+ logging: {
475
+ level: string;
476
+ format: "json" | "text";
477
+ destination: "console" | "file" | "both";
478
+ maxFileSize: string;
479
+ maxFiles: number;
480
+ };
481
+ };
482
+ }
483
+
484
+ // Event payload types
485
+ export type EventPayload<T extends keyof ServiceEvents> = ServiceEvents[T];
486
+
487
+ // Event handler type
488
+ export type EventHandler<T extends keyof ServiceEvents> = (
489
+ payload: EventPayload<T>,
490
+ ) => Promise<void> | void;
491
+
492
+ // Event emitter interface
493
+ export interface EventEmitter {
494
+ emit<T extends keyof ServiceEvents>(
495
+ event: T,
496
+ payload: EventPayload<T>,
497
+ ): Promise<void>;
498
+ on<T extends keyof ServiceEvents>(event: T, handler: EventHandler<T>): void;
499
+ off<T extends keyof ServiceEvents>(event: T, handler: EventHandler<T>): void;
500
+ }
501
+
502
+ // Health check interface
503
+ export interface HealthCheckResult {
504
+ status: "healthy" | "unhealthy" | "degraded";
505
+ timestamp: Date;
506
+ duration: number;
507
+ checks: {
508
+ database: {
509
+ status: "healthy" | "unhealthy";
510
+ latency: number;
511
+ error?: string;
512
+ };
513
+ redis: {
514
+ status: "healthy" | "unhealthy";
515
+ latency: number;
516
+ error?: string;
517
+ };
518
+ kafka: {
519
+ status: "healthy" | "unhealthy";
520
+ latency: number;
521
+ error?: string;
522
+ };
523
+ externalServices: {
524
+ status: "healthy" | "unhealthy" | "degraded";
525
+ services: Array<{
526
+ name: string;
527
+ status: "healthy" | "unhealthy";
528
+ latency: number;
529
+ error?: string;
530
+ }>;
531
+ };
532
+ };
533
+ metadata: {
534
+ version: string;
535
+ uptime: number;
536
+ memory: {
537
+ used: number;
538
+ total: number;
539
+ percentage: number;
540
+ };
541
+ cpu: {
542
+ usage: number;
543
+ };
544
+ };
545
+ }