@axova/shared 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 (112) hide show
  1. package/CONFIGURATION_GUIDE.md +1 -0
  2. package/README.md +384 -0
  3. package/SCHEMA_ORGANIZATION.md +209 -0
  4. package/dist/configs/index.d.ts +85 -0
  5. package/dist/configs/index.js +555 -0
  6. package/dist/events/kafka.d.ts +40 -0
  7. package/dist/events/kafka.js +311 -0
  8. package/dist/index.d.ts +13 -0
  9. package/dist/index.js +41 -0
  10. package/dist/interfaces/customer-events.d.ts +85 -0
  11. package/dist/interfaces/customer-events.js +2 -0
  12. package/dist/interfaces/inventory-events.d.ts +453 -0
  13. package/dist/interfaces/inventory-events.js +3 -0
  14. package/dist/interfaces/inventory-types.d.ts +894 -0
  15. package/dist/interfaces/inventory-types.js +3 -0
  16. package/dist/interfaces/order-events.d.ts +320 -0
  17. package/dist/interfaces/order-events.js +3 -0
  18. package/dist/lib/auditLogger.d.ts +162 -0
  19. package/dist/lib/auditLogger.js +626 -0
  20. package/dist/lib/authOrganization.d.ts +24 -0
  21. package/dist/lib/authOrganization.js +110 -0
  22. package/dist/lib/db.d.ts +6 -0
  23. package/dist/lib/db.js +88 -0
  24. package/dist/middleware/serviceAuth.d.ts +60 -0
  25. package/dist/middleware/serviceAuth.js +272 -0
  26. package/dist/middleware/storeOwnership.d.ts +15 -0
  27. package/dist/middleware/storeOwnership.js +156 -0
  28. package/dist/middleware/storeValidationMiddleware.d.ts +44 -0
  29. package/dist/middleware/storeValidationMiddleware.js +180 -0
  30. package/dist/middleware/userAuth.d.ts +27 -0
  31. package/dist/middleware/userAuth.js +218 -0
  32. package/dist/schemas/admin/admin-schema.d.ts +741 -0
  33. package/dist/schemas/admin/admin-schema.js +111 -0
  34. package/dist/schemas/ai-moderation/ai-moderation-schema.d.ts +648 -0
  35. package/dist/schemas/ai-moderation/ai-moderation-schema.js +88 -0
  36. package/dist/schemas/common/common-schemas.d.ts +436 -0
  37. package/dist/schemas/common/common-schemas.js +94 -0
  38. package/dist/schemas/compliance/compliance-schema.d.ts +3388 -0
  39. package/dist/schemas/compliance/compliance-schema.js +472 -0
  40. package/dist/schemas/compliance/kyc-schema.d.ts +2642 -0
  41. package/dist/schemas/compliance/kyc-schema.js +361 -0
  42. package/dist/schemas/customer/customer-schema.d.ts +2727 -0
  43. package/dist/schemas/customer/customer-schema.js +399 -0
  44. package/dist/schemas/index.d.ts +27 -0
  45. package/dist/schemas/index.js +138 -0
  46. package/dist/schemas/inventory/inventory-tables.d.ts +9476 -0
  47. package/dist/schemas/inventory/inventory-tables.js +1470 -0
  48. package/dist/schemas/inventory/lot-tables.d.ts +3281 -0
  49. package/dist/schemas/inventory/lot-tables.js +608 -0
  50. package/dist/schemas/order/order-schema.d.ts +5825 -0
  51. package/dist/schemas/order/order-schema.js +954 -0
  52. package/dist/schemas/product/discount-relations.d.ts +15 -0
  53. package/dist/schemas/product/discount-relations.js +34 -0
  54. package/dist/schemas/product/discount-schema.d.ts +1975 -0
  55. package/dist/schemas/product/discount-schema.js +297 -0
  56. package/dist/schemas/product/product-relations.d.ts +41 -0
  57. package/dist/schemas/product/product-relations.js +133 -0
  58. package/dist/schemas/product/product-schema.d.ts +4544 -0
  59. package/dist/schemas/product/product-schema.js +671 -0
  60. package/dist/schemas/store/store-audit-schema.d.ts +4135 -0
  61. package/dist/schemas/store/store-audit-schema.js +556 -0
  62. package/dist/schemas/store/store-schema.d.ts +3100 -0
  63. package/dist/schemas/store/store-schema.js +381 -0
  64. package/dist/schemas/store/store-settings-schema.d.ts +665 -0
  65. package/dist/schemas/store/store-settings-schema.js +141 -0
  66. package/dist/schemas/types.d.ts +50 -0
  67. package/dist/schemas/types.js +3 -0
  68. package/dist/types/events.d.ts +2396 -0
  69. package/dist/types/events.js +505 -0
  70. package/dist/utils/errorHandler.d.ts +12 -0
  71. package/dist/utils/errorHandler.js +36 -0
  72. package/dist/utils/subdomain.d.ts +6 -0
  73. package/dist/utils/subdomain.js +20 -0
  74. package/nul +8 -0
  75. package/package.json +43 -0
  76. package/src/configs/index.ts +654 -0
  77. package/src/events/kafka.ts +429 -0
  78. package/src/index.ts +26 -0
  79. package/src/interfaces/customer-events.ts +106 -0
  80. package/src/interfaces/inventory-events.ts +545 -0
  81. package/src/interfaces/inventory-types.ts +1004 -0
  82. package/src/interfaces/order-events.ts +381 -0
  83. package/src/lib/auditLogger.ts +1117 -0
  84. package/src/lib/authOrganization.ts +153 -0
  85. package/src/lib/db.ts +64 -0
  86. package/src/middleware/serviceAuth.ts +328 -0
  87. package/src/middleware/storeOwnership.ts +199 -0
  88. package/src/middleware/storeValidationMiddleware.ts +247 -0
  89. package/src/middleware/userAuth.ts +248 -0
  90. package/src/schemas/admin/admin-schema.ts +208 -0
  91. package/src/schemas/ai-moderation/ai-moderation-schema.ts +180 -0
  92. package/src/schemas/common/common-schemas.ts +108 -0
  93. package/src/schemas/compliance/compliance-schema.ts +927 -0
  94. package/src/schemas/compliance/kyc-schema.ts +649 -0
  95. package/src/schemas/customer/customer-schema.ts +576 -0
  96. package/src/schemas/index.ts +189 -0
  97. package/src/schemas/inventory/inventory-tables.ts +1927 -0
  98. package/src/schemas/inventory/lot-tables.ts +799 -0
  99. package/src/schemas/order/order-schema.ts +1400 -0
  100. package/src/schemas/product/discount-relations.ts +44 -0
  101. package/src/schemas/product/discount-schema.ts +464 -0
  102. package/src/schemas/product/product-relations.ts +187 -0
  103. package/src/schemas/product/product-schema.ts +955 -0
  104. package/src/schemas/store/ethiopian_business_api.md.resolved +212 -0
  105. package/src/schemas/store/store-audit-schema.ts +1257 -0
  106. package/src/schemas/store/store-schema.ts +661 -0
  107. package/src/schemas/store/store-settings-schema.ts +231 -0
  108. package/src/schemas/types.ts +67 -0
  109. package/src/types/events.ts +646 -0
  110. package/src/utils/errorHandler.ts +44 -0
  111. package/src/utils/subdomain.ts +19 -0
  112. package/tsconfig.json +21 -0
@@ -0,0 +1,894 @@
1
+ import type { BaseFilter, DateRangeFilter, LocationFilter, StatusFilter } from "../schemas/types";
2
+ export interface InventoryItem {
3
+ id: string;
4
+ tenantId: string;
5
+ storeId: string;
6
+ productId: string;
7
+ variantId: string;
8
+ sku: string;
9
+ locationId: string;
10
+ locationType: "warehouse" | "pos";
11
+ zoneId?: string;
12
+ binLocation?: string;
13
+ quantityAvailable: number;
14
+ quantityCommitted: number;
15
+ quantityReserved: number;
16
+ quantityIncoming: number;
17
+ quantityInTransit: number;
18
+ safetyStock: number;
19
+ cycleStock: number;
20
+ reorderPoint: number;
21
+ maxStock: number;
22
+ unitCost?: number;
23
+ averageCost?: number;
24
+ lastCost?: number;
25
+ trackingType: "simple" | "batch" | "serial";
26
+ expiryTracking: boolean;
27
+ serialNumberTracking: boolean;
28
+ createdAt: Date;
29
+ updatedAt: Date;
30
+ lastCountDate?: Date;
31
+ lastMovementDate?: Date;
32
+ notes?: string;
33
+ customAttributes?: Record<string, unknown>;
34
+ }
35
+ export interface CreateInventoryItemRequest {
36
+ productId: string;
37
+ variantId: string;
38
+ sku: string;
39
+ locationId: string;
40
+ locationType: "warehouse" | "pos";
41
+ zoneId?: string;
42
+ binLocation?: string;
43
+ initialQuantity: number;
44
+ safetyStock?: number;
45
+ reorderPoint?: number;
46
+ maxStock?: number;
47
+ unitCost?: number;
48
+ trackingType?: "simple" | "batch" | "serial";
49
+ expiryTracking?: boolean;
50
+ serialNumberTracking?: boolean;
51
+ notes?: string;
52
+ customAttributes?: Record<string, unknown>;
53
+ }
54
+ export interface UpdateInventoryItemRequest {
55
+ quantityAvailable?: number;
56
+ safetyStock?: number;
57
+ reorderPoint?: number;
58
+ maxStock?: number;
59
+ unitCost?: number;
60
+ notes?: string;
61
+ customAttributes?: Record<string, unknown>;
62
+ }
63
+ export interface InventoryFilter extends BaseFilter, DateRangeFilter, StatusFilter, LocationFilter {
64
+ productId?: string;
65
+ variantId?: string;
66
+ sku?: string;
67
+ skus?: string[];
68
+ trackingType?: "simple" | "batch" | "serial";
69
+ lowStock?: boolean;
70
+ outOfStock?: boolean;
71
+ hasAlerts?: boolean;
72
+ categoryId?: string;
73
+ }
74
+ export interface QuantityUpdate {
75
+ inventoryItemId: string;
76
+ quantityChange: number;
77
+ changeType: "adjustment" | "sale" | "return" | "transfer" | "cycle_count";
78
+ reason: string;
79
+ sourceTransactionId?: string;
80
+ batchNumber?: string;
81
+ serialNumbers?: string[];
82
+ }
83
+ export interface Warehouse {
84
+ id: string;
85
+ tenantId: string;
86
+ storeId: string;
87
+ name: string;
88
+ code: string;
89
+ description?: string;
90
+ address?: {
91
+ street: string;
92
+ city: string;
93
+ state: string;
94
+ country: string;
95
+ postalCode: string;
96
+ latitude?: number;
97
+ longitude?: number;
98
+ };
99
+ latitude?: number;
100
+ longitude?: number;
101
+ timeZone?: string;
102
+ totalCapacity?: number;
103
+ usedCapacity: number;
104
+ capacityUnit: "units" | "cubic_meters" | "pallets";
105
+ temperatureControlled: boolean;
106
+ minTemperature?: number;
107
+ maxTemperature?: number;
108
+ humidityControlled: boolean;
109
+ status: "active" | "inactive" | "maintenance" | "closed";
110
+ operationalHours?: Record<string, {
111
+ open: string;
112
+ close: string;
113
+ }>;
114
+ priority: number;
115
+ warehouseGroupId?: string;
116
+ managerId?: string;
117
+ contactEmail?: string;
118
+ contactPhone?: string;
119
+ allowNegativeStock: boolean;
120
+ autoReceiveTransfers: boolean;
121
+ requirePickConfirmation: boolean;
122
+ createdAt: Date;
123
+ updatedAt: Date;
124
+ customAttributes?: Record<string, unknown>;
125
+ }
126
+ export interface CreateWarehouseRequest {
127
+ name: string;
128
+ code: string;
129
+ description?: string;
130
+ address?: Warehouse["address"];
131
+ latitude?: number;
132
+ longitude?: number;
133
+ timeZone?: string;
134
+ totalCapacity?: number;
135
+ capacityUnit?: "units" | "cubic_meters" | "pallets";
136
+ temperatureControlled?: boolean;
137
+ minTemperature?: number;
138
+ maxTemperature?: number;
139
+ humidityControlled?: boolean;
140
+ operationalHours?: Record<string, {
141
+ open: string;
142
+ close: string;
143
+ }>;
144
+ priority?: number;
145
+ warehouseGroupId?: string;
146
+ managerId?: string;
147
+ contactEmail?: string;
148
+ contactPhone?: string;
149
+ allowNegativeStock?: boolean;
150
+ autoReceiveTransfers?: boolean;
151
+ requirePickConfirmation?: boolean;
152
+ customAttributes?: Record<string, unknown>;
153
+ }
154
+ export interface POSLocation {
155
+ id: string;
156
+ tenantId: string;
157
+ storeId: string;
158
+ name: string;
159
+ code: string;
160
+ description?: string;
161
+ address?: Warehouse["address"];
162
+ latitude?: number;
163
+ longitude?: number;
164
+ timeZone?: string;
165
+ status: "active" | "inactive" | "maintenance";
166
+ locationType: "retail_store" | "kiosk" | "popup" | "mobile";
167
+ businessHours?: Record<string, {
168
+ open: string;
169
+ close: string;
170
+ }>;
171
+ managerId?: string;
172
+ contactEmail?: string;
173
+ contactPhone?: string;
174
+ allowNegativeStock: boolean;
175
+ autoSyncInventory: boolean;
176
+ syncInterval: number;
177
+ offlineThreshold: number;
178
+ allowLocalPricing: boolean;
179
+ localPricingMarkup?: number;
180
+ lastSyncAt?: Date;
181
+ syncStatus: "synced" | "pending" | "error" | "offline";
182
+ pendingChanges: number;
183
+ createdAt: Date;
184
+ updatedAt: Date;
185
+ customAttributes?: Record<string, unknown>;
186
+ }
187
+ export interface CreatePOSLocationRequest {
188
+ name: string;
189
+ code: string;
190
+ description?: string;
191
+ address?: POSLocation["address"];
192
+ latitude?: number;
193
+ longitude?: number;
194
+ timeZone?: string;
195
+ locationType: "retail_store" | "kiosk" | "popup" | "mobile";
196
+ businessHours?: Record<string, {
197
+ open: string;
198
+ close: string;
199
+ }>;
200
+ managerId?: string;
201
+ contactEmail?: string;
202
+ contactPhone?: string;
203
+ allowNegativeStock?: boolean;
204
+ autoSyncInventory?: boolean;
205
+ syncInterval?: number;
206
+ offlineThreshold?: number;
207
+ allowLocalPricing?: boolean;
208
+ localPricingMarkup?: number;
209
+ customAttributes?: Record<string, unknown>;
210
+ }
211
+ export interface BatchInfo {
212
+ id: string;
213
+ tenantId: string;
214
+ storeId: string;
215
+ batchNumber: string;
216
+ lotNumber?: string;
217
+ internalBatchId?: string;
218
+ productId: string;
219
+ variantId: string;
220
+ sku: string;
221
+ status: "active" | "quarantine" | "expired" | "recalled" | "depleted";
222
+ batchType: "production" | "purchase" | "transfer" | "adjustment";
223
+ manufactureDate?: Date;
224
+ receivedDate: Date;
225
+ expiryDate?: Date;
226
+ bestByDate?: Date;
227
+ sellByDate?: Date;
228
+ useByDate?: Date;
229
+ initialQuantity: number;
230
+ currentQuantity: number;
231
+ reservedQuantity: number;
232
+ committedQuantity: number;
233
+ unitCost?: number;
234
+ totalCost?: number;
235
+ averageCost?: number;
236
+ vendorId?: string;
237
+ vendorName?: string;
238
+ vendorBatchNumber?: string;
239
+ purchaseOrderNumber?: string;
240
+ qualityGrade?: string;
241
+ qualityNotes?: string;
242
+ certifications?: Array<{
243
+ type: string;
244
+ number: string;
245
+ issuedBy: string;
246
+ issuedDate: string;
247
+ expiryDate?: string;
248
+ }>;
249
+ originalLocationId: string;
250
+ currentLocationIds?: string[];
251
+ hasAlerts: boolean;
252
+ alertReasons?: string[];
253
+ quarantineReason?: string;
254
+ createdBy: string;
255
+ lastModifiedBy?: string;
256
+ createdAt: Date;
257
+ updatedAt: Date;
258
+ lastMovementAt?: Date;
259
+ notes?: string;
260
+ customAttributes?: Record<string, unknown>;
261
+ }
262
+ export interface CreateBatchRequest {
263
+ batchNumber: string;
264
+ lotNumber?: string;
265
+ productId: string;
266
+ variantId: string;
267
+ sku: string;
268
+ batchType: "production" | "purchase" | "transfer" | "adjustment";
269
+ manufactureDate?: Date;
270
+ receivedDate: Date;
271
+ expiryDate?: Date;
272
+ bestByDate?: Date;
273
+ sellByDate?: Date;
274
+ useByDate?: Date;
275
+ initialQuantity: number;
276
+ unitCost?: number;
277
+ vendorId?: string;
278
+ vendorName?: string;
279
+ vendorBatchNumber?: string;
280
+ purchaseOrderNumber?: string;
281
+ qualityGrade?: string;
282
+ qualityNotes?: string;
283
+ originalLocationId: string;
284
+ notes?: string;
285
+ customAttributes?: Record<string, unknown>;
286
+ }
287
+ export interface BatchFilter extends BaseFilter, DateRangeFilter, StatusFilter {
288
+ batchNumber?: string;
289
+ productId?: string;
290
+ sku?: string;
291
+ vendorId?: string;
292
+ expiringBefore?: Date;
293
+ hasAlerts?: boolean;
294
+ qualityGrade?: string;
295
+ }
296
+ export interface CycleCount {
297
+ id: string;
298
+ tenantId: string;
299
+ storeId: string;
300
+ countNumber: string;
301
+ countName: string;
302
+ description?: string;
303
+ countType: "full_physical" | "spot_check" | "abc_analysis" | "high_velocity" | "low_velocity" | "location_specific" | "category_specific";
304
+ countMethod: "manual" | "barcode_assisted" | "rfid" | "automated";
305
+ locationId?: string;
306
+ locationType?: "warehouse" | "pos";
307
+ zoneIds?: string[];
308
+ binIds?: string[];
309
+ itemSelectionType: "all_items" | "specific_skus" | "category" | "velocity_based" | "value_based" | "accuracy_based";
310
+ selectionCriteria?: {
311
+ categories?: string[];
312
+ skus?: string[];
313
+ productIds?: string[];
314
+ minValue?: number;
315
+ maxValue?: number;
316
+ velocityThreshold?: number;
317
+ accuracyThreshold?: number;
318
+ lastCountedBefore?: string;
319
+ };
320
+ scheduledDate: Date;
321
+ scheduledBy: string;
322
+ frequency?: "weekly" | "monthly" | "quarterly" | "annual" | "ad_hoc";
323
+ isRecurring: boolean;
324
+ status: "scheduled" | "in_progress" | "completed" | "reconciled" | "cancelled" | "on_hold";
325
+ startedAt?: Date;
326
+ completedAt?: Date;
327
+ reconciledAt?: Date;
328
+ assignedTo?: string[];
329
+ supervisorId?: string;
330
+ totalItemsToCount?: number;
331
+ totalItemsCounted: number;
332
+ itemsWithDiscrepancies: number;
333
+ accuracyPercentage?: number;
334
+ totalVarianceValue?: number;
335
+ tolerancePercentage: number;
336
+ requiresApproval: boolean;
337
+ approvedBy?: string;
338
+ approvedAt?: Date;
339
+ reviewedBy?: string;
340
+ reviewedAt?: Date;
341
+ reviewNotes?: string;
342
+ allowBlindCounts: boolean;
343
+ requirePhotos: boolean;
344
+ allowPartialCounts: boolean;
345
+ autoReconcileWithinTolerance: boolean;
346
+ createdAt: Date;
347
+ updatedAt: Date;
348
+ notes?: string;
349
+ customAttributes?: Record<string, unknown>;
350
+ }
351
+ export interface CycleCountItem {
352
+ id: string;
353
+ tenantId: string;
354
+ storeId: string;
355
+ cycleCountId: string;
356
+ countNumber: string;
357
+ inventoryItemId: string;
358
+ productId: string;
359
+ variantId: string;
360
+ sku: string;
361
+ productName?: string;
362
+ locationId: string;
363
+ locationType: "warehouse" | "pos";
364
+ zoneId?: string;
365
+ binLocation?: string;
366
+ systemQuantity: number;
367
+ systemValue?: number;
368
+ unitCost?: number;
369
+ countedQuantity?: number;
370
+ countedValue?: number;
371
+ quantityVariance?: number;
372
+ valueVariance?: number;
373
+ variancePercentage?: number;
374
+ batchNumber?: string;
375
+ serialNumbers?: string[];
376
+ expiryDate?: Date;
377
+ countStatus: "pending" | "counted" | "recount_required" | "discrepancy" | "reconciled" | "skipped";
378
+ countedBy?: string;
379
+ countedAt?: Date;
380
+ recountedBy?: string;
381
+ recountedAt?: Date;
382
+ recountQuantity?: number;
383
+ countMethod?: "manual" | "barcode" | "scale" | "estimated";
384
+ confidenceLevel?: "high" | "medium" | "low";
385
+ requiresRecount: boolean;
386
+ recountReason?: string;
387
+ conditionNotes?: string;
388
+ qualityIssues?: string[];
389
+ damageObserved: boolean;
390
+ isReconciled: boolean;
391
+ reconciledBy?: string;
392
+ reconciledAt?: Date;
393
+ reconciliationMethod?: "adjust_system" | "accept_variance" | "investigate" | "recount";
394
+ createdAt: Date;
395
+ updatedAt: Date;
396
+ notes?: string;
397
+ }
398
+ export interface CreateCycleCountRequest {
399
+ countName: string;
400
+ description?: string;
401
+ countType: CycleCount["countType"];
402
+ countMethod: CycleCount["countMethod"];
403
+ locationId?: string;
404
+ locationType?: "warehouse" | "pos";
405
+ zoneIds?: string[];
406
+ binIds?: string[];
407
+ itemSelectionType: CycleCount["itemSelectionType"];
408
+ selectionCriteria?: CycleCount["selectionCriteria"];
409
+ scheduledDate: Date;
410
+ frequency?: CycleCount["frequency"];
411
+ isRecurring?: boolean;
412
+ assignedTo?: string[];
413
+ supervisorId?: string;
414
+ tolerancePercentage?: number;
415
+ requiresApproval?: boolean;
416
+ allowBlindCounts?: boolean;
417
+ requirePhotos?: boolean;
418
+ allowPartialCounts?: boolean;
419
+ autoReconcileWithinTolerance?: boolean;
420
+ notes?: string;
421
+ customAttributes?: Record<string, unknown>;
422
+ }
423
+ export interface CountItemRequest {
424
+ cycleCountItemId: string;
425
+ countedQuantity: number;
426
+ countMethod?: "manual" | "barcode" | "scale" | "estimated";
427
+ confidenceLevel?: "high" | "medium" | "low";
428
+ conditionNotes?: string;
429
+ qualityIssues?: string[];
430
+ damageObserved?: boolean;
431
+ notes?: string;
432
+ }
433
+ export interface CycleCountFilter extends BaseFilter, DateRangeFilter, StatusFilter {
434
+ countType?: string;
435
+ locationId?: string;
436
+ scheduledBy?: string;
437
+ hasDiscrepancies?: boolean;
438
+ frequency?: string;
439
+ }
440
+ export interface TransferRequest {
441
+ sourceLocationId: string;
442
+ sourceLocationType: "warehouse" | "pos";
443
+ destinationLocationId: string;
444
+ destinationLocationType: "warehouse" | "pos";
445
+ transferType: "standard" | "urgent" | "emergency" | "rebalancing" | "return";
446
+ priority: "low" | "normal" | "high" | "urgent";
447
+ expectedShipDate?: Date;
448
+ expectedReceiveDate?: Date;
449
+ shippingMethod?: string;
450
+ notes?: string;
451
+ specialInstructions?: string;
452
+ requiresApproval?: boolean;
453
+ allowPartialTransfer?: boolean;
454
+ requiresInspection?: boolean;
455
+ items: Array<{
456
+ inventoryItemId: string;
457
+ requestedQuantity: number;
458
+ batchNumber?: string;
459
+ serialNumbers?: string[];
460
+ sourceZoneId?: string;
461
+ sourceBinLocation?: string;
462
+ destinationZoneId?: string;
463
+ destinationBinLocation?: string;
464
+ notes?: string;
465
+ }>;
466
+ customAttributes?: Record<string, unknown>;
467
+ }
468
+ export interface TransferItem {
469
+ id: string;
470
+ tenantId: string;
471
+ storeId: string;
472
+ transferId: string;
473
+ transferNumber: string;
474
+ inventoryItemId: string;
475
+ productId: string;
476
+ variantId: string;
477
+ sku: string;
478
+ productName?: string;
479
+ requestedQuantity: number;
480
+ approvedQuantity?: number;
481
+ pickedQuantity?: number;
482
+ shippedQuantity?: number;
483
+ receivedQuantity?: number;
484
+ acceptedQuantity?: number;
485
+ rejectedQuantity: number;
486
+ unitCost?: number;
487
+ totalCost?: number;
488
+ batchNumber?: string;
489
+ serialNumbers?: string[];
490
+ expiryDate?: Date;
491
+ sourceZoneId?: string;
492
+ sourceBinLocation?: string;
493
+ destinationZoneId?: string;
494
+ destinationBinLocation?: string;
495
+ conditionAtPick?: string;
496
+ conditionAtReceive?: string;
497
+ qualityNotes?: string;
498
+ hasDiscrepancy: boolean;
499
+ discrepancyType?: "quantity" | "damage" | "missing" | "extra" | "condition";
500
+ discrepancyReason?: string;
501
+ discrepancyResolution?: "accept" | "reject" | "adjust" | "investigate";
502
+ status: "pending" | "picked" | "shipped" | "received" | "accepted" | "rejected";
503
+ createdAt: Date;
504
+ updatedAt: Date;
505
+ pickedAt?: Date;
506
+ shippedAt?: Date;
507
+ receivedAt?: Date;
508
+ notes?: string;
509
+ }
510
+ export interface TransferFilter extends BaseFilter, DateRangeFilter, StatusFilter {
511
+ transferType?: string;
512
+ priority?: string;
513
+ sourceLocationId?: string;
514
+ destinationLocationId?: string;
515
+ requestedBy?: string;
516
+ hasDiscrepancies?: boolean;
517
+ }
518
+ export interface AutomationRule {
519
+ id: string;
520
+ tenantId: string;
521
+ storeId: string;
522
+ ruleName: string;
523
+ description?: string;
524
+ ruleType: "reorder" | "transfer" | "adjustment" | "alert" | "threshold" | "expiry" | "velocity" | "optimization";
525
+ scope: "global" | "location" | "category" | "product" | "sku";
526
+ locationIds?: string[];
527
+ locationTypes?: string[];
528
+ productCategories?: string[];
529
+ productIds?: string[];
530
+ skus?: string[];
531
+ triggerConditions?: Record<string, unknown>;
532
+ actions?: Array<{
533
+ actionType: string;
534
+ priority: "low" | "medium" | "high" | "urgent";
535
+ parameters: Record<string, unknown>;
536
+ requiresApproval?: boolean;
537
+ approvalRoles?: string[];
538
+ }>;
539
+ aiEnabled: boolean;
540
+ mlModelId?: string;
541
+ confidenceThreshold?: number;
542
+ learningEnabled: boolean;
543
+ executionMode: "automatic" | "manual_approval" | "suggestion_only";
544
+ maxExecutionsPerDay?: number;
545
+ cooldownPeriod?: number;
546
+ priority: number;
547
+ executionOrder: number;
548
+ isScheduled: boolean;
549
+ schedulePattern?: string;
550
+ nextScheduledRun?: Date;
551
+ isActive: boolean;
552
+ canOverride: boolean;
553
+ temporaryDisableUntil?: Date;
554
+ executionCount: number;
555
+ successCount: number;
556
+ failureCount: number;
557
+ lastExecutedAt?: Date;
558
+ lastSuccessAt?: Date;
559
+ lastFailureAt?: Date;
560
+ averageExecutionTime?: number;
561
+ successRate?: number;
562
+ costSavings?: number;
563
+ createdBy: string;
564
+ updatedBy?: string;
565
+ createdAt: Date;
566
+ updatedAt: Date;
567
+ tags?: string[];
568
+ customAttributes?: Record<string, unknown>;
569
+ }
570
+ export interface CreateAutomationRuleRequest {
571
+ ruleName: string;
572
+ description?: string;
573
+ ruleType: AutomationRule["ruleType"];
574
+ scope: AutomationRule["scope"];
575
+ locationIds?: string[];
576
+ locationTypes?: string[];
577
+ productCategories?: string[];
578
+ productIds?: string[];
579
+ skus?: string[];
580
+ triggerConditions?: Record<string, unknown>;
581
+ actions?: AutomationRule["actions"];
582
+ aiEnabled?: boolean;
583
+ mlModelId?: string;
584
+ confidenceThreshold?: number;
585
+ learningEnabled?: boolean;
586
+ executionMode?: AutomationRule["executionMode"];
587
+ maxExecutionsPerDay?: number;
588
+ cooldownPeriod?: number;
589
+ priority?: number;
590
+ executionOrder?: number;
591
+ isScheduled?: boolean;
592
+ schedulePattern?: string;
593
+ nextScheduledRun?: Date;
594
+ canOverride?: boolean;
595
+ tags?: string[];
596
+ customAttributes?: Record<string, unknown>;
597
+ }
598
+ export interface AutomationRuleFilter extends BaseFilter, StatusFilter {
599
+ ruleType?: string;
600
+ scope?: string;
601
+ aiEnabled?: boolean;
602
+ executionMode?: string;
603
+ isScheduled?: boolean;
604
+ tags?: string[];
605
+ }
606
+ export interface AIRecommendation {
607
+ id: string;
608
+ type: "reorder" | "transfer" | "pricing" | "optimization";
609
+ confidence: number;
610
+ priority: "low" | "medium" | "high" | "urgent";
611
+ title: string;
612
+ description: string;
613
+ impact: {
614
+ financial?: number;
615
+ operational?: string;
616
+ risk?: string;
617
+ };
618
+ actions: Array<{
619
+ actionType: string;
620
+ parameters: Record<string, unknown>;
621
+ estimatedOutcome: string;
622
+ }>;
623
+ dataPoints: Record<string, unknown>;
624
+ expiresAt?: Date;
625
+ createdAt: Date;
626
+ }
627
+ export interface InventorySnapshot {
628
+ date: Date;
629
+ totalItems: number;
630
+ totalValue: number;
631
+ lowStockItems: number;
632
+ outOfStockItems: number;
633
+ averageTurnover: number;
634
+ topMovingItems: Array<{
635
+ sku: string;
636
+ productName: string;
637
+ quantity: number;
638
+ value: number;
639
+ }>;
640
+ }
641
+ export interface LowStockAlert {
642
+ id: string;
643
+ inventoryItemId: string;
644
+ sku: string;
645
+ productName: string;
646
+ locationId: string;
647
+ locationName: string;
648
+ currentQuantity: number;
649
+ reorderPoint: number;
650
+ safetyStock: number;
651
+ daysOfSupply: number;
652
+ severity: "low" | "medium" | "high" | "critical";
653
+ createdAt: Date;
654
+ }
655
+ export interface InventoryInsight {
656
+ type: "trend" | "anomaly" | "opportunity" | "risk";
657
+ title: string;
658
+ description: string;
659
+ metric: string;
660
+ value: number;
661
+ change: number;
662
+ changeDirection: "up" | "down" | "stable";
663
+ timeframe: string;
664
+ actionable: boolean;
665
+ recommendations?: string[];
666
+ }
667
+ export interface DashboardMetrics {
668
+ totalItems: number;
669
+ totalValue: number;
670
+ lowStockCount: number;
671
+ outOfStockCount: number;
672
+ expiringSoonCount: number;
673
+ pendingTransfersCount: number;
674
+ averageTurnoverRate: number;
675
+ inventoryAccuracy: number;
676
+ recentActivity: Array<{
677
+ type: string;
678
+ description: string;
679
+ timestamp: Date;
680
+ }>;
681
+ alerts: LowStockAlert[];
682
+ insights: InventoryInsight[];
683
+ }
684
+ export interface InventoryOverview {
685
+ totalItems: number;
686
+ totalValue: number;
687
+ totalLocations: number;
688
+ lowStockPercentage: number;
689
+ outOfStockPercentage: number;
690
+ turnoverRate: number;
691
+ accuracy: number;
692
+ categoryBreakdown: Array<{
693
+ category: string;
694
+ itemCount: number;
695
+ value: number;
696
+ percentage: number;
697
+ }>;
698
+ locationBreakdown: Array<{
699
+ locationId: string;
700
+ locationName: string;
701
+ itemCount: number;
702
+ value: number;
703
+ utilization: number;
704
+ }>;
705
+ }
706
+ export interface StockMovementReport {
707
+ period: {
708
+ startDate: Date;
709
+ endDate: Date;
710
+ };
711
+ totalMovements: number;
712
+ inboundMovements: number;
713
+ outboundMovements: number;
714
+ adjustments: number;
715
+ transfers: number;
716
+ valueChange: number;
717
+ topMovingItems: Array<{
718
+ sku: string;
719
+ productName: string;
720
+ totalMovement: number;
721
+ inbound: number;
722
+ outbound: number;
723
+ netChange: number;
724
+ }>;
725
+ movementsByDay: Array<{
726
+ date: Date;
727
+ inbound: number;
728
+ outbound: number;
729
+ net: number;
730
+ }>;
731
+ }
732
+ export interface VelocityAnalysis {
733
+ period: {
734
+ startDate: Date;
735
+ endDate: Date;
736
+ };
737
+ items: Array<{
738
+ sku: string;
739
+ productName: string;
740
+ currentQuantity: number;
741
+ totalSold: number;
742
+ averageDailySales: number;
743
+ turnoverRate: number;
744
+ daysOfSupply: number;
745
+ velocityCategory: "fast" | "medium" | "slow" | "dead";
746
+ reorderRecommendation: string;
747
+ }>;
748
+ summary: {
749
+ fastMoving: number;
750
+ mediumMoving: number;
751
+ slowMoving: number;
752
+ deadStock: number;
753
+ averageTurnover: number;
754
+ };
755
+ }
756
+ export interface ABCClassification {
757
+ items: Array<{
758
+ sku: string;
759
+ productName: string;
760
+ annualValue: number;
761
+ annualQuantity: number;
762
+ cumulativeValue: number;
763
+ cumulativePercentage: number;
764
+ classification: "A" | "B" | "C";
765
+ recommendedManagement: string;
766
+ }>;
767
+ summary: {
768
+ classA: {
769
+ count: number;
770
+ valuePercentage: number;
771
+ };
772
+ classB: {
773
+ count: number;
774
+ valuePercentage: number;
775
+ };
776
+ classC: {
777
+ count: number;
778
+ valuePercentage: number;
779
+ };
780
+ };
781
+ }
782
+ export interface StockValuation {
783
+ totalValue: number;
784
+ valuationMethod: "FIFO" | "LIFO" | "weighted_average";
785
+ byCategory: Array<{
786
+ category: string;
787
+ value: number;
788
+ percentage: number;
789
+ itemCount: number;
790
+ }>;
791
+ byLocation: Array<{
792
+ locationId: string;
793
+ locationName: string;
794
+ value: number;
795
+ percentage: number;
796
+ itemCount: number;
797
+ }>;
798
+ ageAnalysis: Array<{
799
+ ageRange: string;
800
+ value: number;
801
+ percentage: number;
802
+ itemCount: number;
803
+ }>;
804
+ }
805
+ export interface ExpiryReport {
806
+ expiredItems: Array<{
807
+ sku: string;
808
+ productName: string;
809
+ batchNumber: string;
810
+ expiryDate: Date;
811
+ quantity: number;
812
+ value: number;
813
+ daysExpired: number;
814
+ locationName: string;
815
+ }>;
816
+ expiringSoon: Array<{
817
+ sku: string;
818
+ productName: string;
819
+ batchNumber: string;
820
+ expiryDate: Date;
821
+ quantity: number;
822
+ value: number;
823
+ daysUntilExpiry: number;
824
+ locationName: string;
825
+ }>;
826
+ summary: {
827
+ totalExpiredValue: number;
828
+ totalExpiredQuantity: number;
829
+ expiringInNext30Days: number;
830
+ expiringInNext7Days: number;
831
+ averageDaysToExpiry: number;
832
+ };
833
+ }
834
+ export interface ForecastData {
835
+ sku: string;
836
+ productName: string;
837
+ forecastPeriod: {
838
+ startDate: Date;
839
+ endDate: Date;
840
+ };
841
+ historicalDemand: Array<{
842
+ date: Date;
843
+ demand: number;
844
+ actual?: number;
845
+ }>;
846
+ forecastedDemand: Array<{
847
+ date: Date;
848
+ predicted: number;
849
+ confidence: number;
850
+ upperBound: number;
851
+ lowerBound: number;
852
+ }>;
853
+ accuracy: {
854
+ mape: number;
855
+ rmse: number;
856
+ bias: number;
857
+ };
858
+ seasonality: {
859
+ detected: boolean;
860
+ pattern: string;
861
+ strength: number;
862
+ };
863
+ trend: {
864
+ direction: "up" | "down" | "stable";
865
+ strength: number;
866
+ };
867
+ }
868
+ export interface ReorderRecommendation {
869
+ sku: string;
870
+ productName: string;
871
+ locationId: string;
872
+ locationName: string;
873
+ currentQuantity: number;
874
+ reorderPoint: number;
875
+ safetyStock: number;
876
+ recommendedOrderQuantity: number;
877
+ leadTime: number;
878
+ daysOfSupply: number;
879
+ priority: "low" | "medium" | "high" | "urgent";
880
+ reasoning: string[];
881
+ estimatedCost: number;
882
+ estimatedStockoutRisk: number;
883
+ supplierRecommendations: Array<{
884
+ supplierId: string;
885
+ supplierName: string;
886
+ unitPrice: number;
887
+ leadTime: number;
888
+ minimumOrder: number;
889
+ reliability: number;
890
+ }>;
891
+ aiConfidence: number;
892
+ lastUpdated: Date;
893
+ }
894
+ export type { OperationResult, PaginatedResult, TenantContext, UserContext, } from "../schemas/types";