@jaicome/contracts 0.0.73

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.
@@ -0,0 +1,2804 @@
1
+ import z$1, { z } from "zod";
2
+
3
+ //#region src/schema/pagination.ts
4
+ const paginationSchema = z.object({
5
+ pageSize: z.number().max(100).default(10),
6
+ page: z.number().min(1).default(1)
7
+ });
8
+
9
+ //#endregion
10
+ //#region src/schema/shared.ts
11
+ /**
12
+ * Base filter schema with common time-based filtering
13
+ */
14
+ const baseFilterSchema = z.object({
15
+ startTime: z.coerce.date().nullish(),
16
+ endTime: z.coerce.date().nullish()
17
+ });
18
+ /**
19
+ * Sort direction enum
20
+ */
21
+ const sortDirectionSchema = z.enum(["asc", "desc"]);
22
+ /**
23
+ * Generic sort schema - accepts any string keys but enforces "asc" | "desc" values
24
+ */
25
+ const sortSchema = z.record(z.string(), sortDirectionSchema);
26
+ /**
27
+ * Base list input schema with pagination, filters, and sorting
28
+ */
29
+ const baseListInputSchema = (filterSchema) => z.object({
30
+ pagination: paginationSchema.optional().default({
31
+ page: 1,
32
+ pageSize: 20
33
+ }),
34
+ filter: filterSchema.optional(),
35
+ sort: sortSchema.optional()
36
+ });
37
+ /**
38
+ * Base list output schema with pagination
39
+ */
40
+ const baseListOutputSchema = (itemSchema) => z.object({
41
+ items: z.array(itemSchema),
42
+ pagination: z.object({
43
+ page: z.number(),
44
+ pageSize: z.number(),
45
+ totalItems: z.number(),
46
+ totalPages: z.number()
47
+ })
48
+ });
49
+ /**
50
+ * Default sort for time-based entities (most recent first)
51
+ */
52
+ const defaultTimeSort = { createdAt: "desc" };
53
+
54
+ //#endregion
55
+ //#region src/schema/banners.ts
56
+ const placementSchema = z.enum(["TOP", "SECONDARY"]);
57
+ const bannerStatusSchema = z.enum([
58
+ "PENDING",
59
+ "APPROVED",
60
+ "REJECTED"
61
+ ]);
62
+ const createBannerInputSchema = z.object({
63
+ merchantId: z.uuid().optional(),
64
+ placement: placementSchema,
65
+ title: z.string().min(1),
66
+ description: z.string().optional(),
67
+ photo: z.instanceof(File),
68
+ url: z.url().optional(),
69
+ badgeText: z.string().optional(),
70
+ badgeColor: z.string().optional(),
71
+ ordinal: z.number().int().positive().optional(),
72
+ startsAt: z.date().optional(),
73
+ expiresAt: z.date().optional()
74
+ });
75
+ const updateBannerInputSchema = z.object({
76
+ title: z.string().min(1).optional(),
77
+ description: z.string().optional(),
78
+ photo: z.instanceof(File).optional(),
79
+ url: z.url().optional(),
80
+ badgeText: z.string().optional(),
81
+ badgeColor: z.string().optional(),
82
+ ordinal: z.number().int().positive().optional(),
83
+ startsAt: z.date().optional(),
84
+ expiresAt: z.date().optional(),
85
+ status: bannerStatusSchema.optional()
86
+ });
87
+ const listBannersInputSchema = z.object({
88
+ filter: z.object({
89
+ merchantId: z.uuid().optional(),
90
+ placement: placementSchema.optional(),
91
+ status: bannerStatusSchema.optional(),
92
+ createdBy: z.string().optional()
93
+ }).optional(),
94
+ pagination: paginationSchema
95
+ });
96
+ const approveBannerInputSchema = z.object({ status: z.enum(["APPROVED", "REJECTED"]) });
97
+ const bannerIdInputSchema = z.object({ bannerId: z.uuid() });
98
+ const bannerOutputSchema = z.object({
99
+ id: z.uuid(),
100
+ merchantId: z.uuid().nullable(),
101
+ placement: placementSchema,
102
+ status: bannerStatusSchema,
103
+ title: z.string(),
104
+ description: z.string().nullable(),
105
+ photoUrl: z.string().nullable(),
106
+ url: z.string().nullable(),
107
+ badgeText: z.string().nullable(),
108
+ badgeColor: z.string().nullable(),
109
+ ordinal: z.number().int().nullable(),
110
+ startsAt: z.date().nullable(),
111
+ expiresAt: z.date().nullable(),
112
+ createdAt: z.date(),
113
+ updatedAt: z.date(),
114
+ createdBy: z.string(),
115
+ approvedBy: z.string().nullable()
116
+ });
117
+ const bannerListOutputSchema = baseListOutputSchema(bannerOutputSchema);
118
+ const listActiveBannersInputSchema = z.object({ placement: placementSchema.optional() });
119
+ const activeBannerOutputSchema = bannerOutputSchema.extend({ isActive: z.boolean() });
120
+ const activeBannerListOutputSchema = z.object({ items: z.array(activeBannerOutputSchema) });
121
+
122
+ //#endregion
123
+ //#region src/schema/business-hours.ts
124
+ const dayOfWeekEnum = z$1.enum([
125
+ "SUN",
126
+ "MON",
127
+ "TUE",
128
+ "WED",
129
+ "THU",
130
+ "FRI",
131
+ "SAT"
132
+ ]);
133
+ /**
134
+ * Schema describing a single day-of-week operating window.
135
+ */
136
+ const businessHoursPeriodSchema = z$1.object({
137
+ dayOfWeek: dayOfWeekEnum,
138
+ startTime: z$1.iso.time(),
139
+ endTime: z$1.iso.time()
140
+ });
141
+ /**
142
+ * Core business hours metadata and canonical period definitions.
143
+ */
144
+ const businessHoursSchema = z$1.object({
145
+ id: z$1.string(),
146
+ name: z$1.string(),
147
+ description: z$1.string().nullish(),
148
+ isShared: z$1.boolean().default(false),
149
+ lockedShared: z$1.boolean().default(false),
150
+ effectiveFrom: z$1.coerce.date().nullish(),
151
+ effectiveTo: z$1.coerce.date().nullish(),
152
+ priority: z$1.number().int().default(0),
153
+ periods: z$1.array(businessHoursPeriodSchema)
154
+ });
155
+
156
+ //#endregion
157
+ //#region src/schema/translations.ts
158
+ const translationFieldSchema = z.record(z.string(), z.string());
159
+
160
+ //#endregion
161
+ //#region src/schema/catalog.ts
162
+ const catalogAmountSchema = z.bigint();
163
+ const catalogAvailabilityValues = [
164
+ "AVAILABLE",
165
+ "SOLDOUT",
166
+ "UNAVAILABLE"
167
+ ];
168
+ const catalogSelectionTypeValues = ["SINGLE", "MULTIPLE"];
169
+ const catalogFoodIngredientValues = [
170
+ "CELERY",
171
+ "CRUSTACEANS",
172
+ "EGGS",
173
+ "FISH",
174
+ "GLUTEN",
175
+ "LUPIN",
176
+ "MILK",
177
+ "MOLLUSCS",
178
+ "MUSTARD",
179
+ "PEANUTS",
180
+ "SESAME",
181
+ "SOY",
182
+ "SULPHITES",
183
+ "TREE_NUTS"
184
+ ];
185
+ const catalogDietaryPreferenceValues = [
186
+ "DAIRY_FREE",
187
+ "GLUTEN_FREE",
188
+ "SPICY",
189
+ "HIGH_SALT",
190
+ "NUT_FREE",
191
+ "VEGAN",
192
+ "VEGETARIAN"
193
+ ];
194
+ const catalogCategoryBaseSchema = z.object({
195
+ id: z.string(),
196
+ name: translationFieldSchema,
197
+ ordinal: z.number().nullish(),
198
+ itemCount: z.number().nullish()
199
+ });
200
+ const catalogPriceRangeSchema = z.object({
201
+ minAmount: catalogAmountSchema,
202
+ maxAmount: catalogAmountSchema,
203
+ currency: z.string()
204
+ });
205
+ const catalogModifierBaseSchema = z.object({
206
+ id: z.string(),
207
+ name: translationFieldSchema,
208
+ priceAmount: catalogAmountSchema,
209
+ currency: z.string(),
210
+ availability: z.enum(catalogAvailabilityValues).nullish(),
211
+ ordinal: z.number().nullish(),
212
+ onByDefault: z.boolean()
213
+ });
214
+ const catalogModifierListBaseSchema = z.object({
215
+ id: z.string(),
216
+ name: translationFieldSchema,
217
+ selectionType: z.enum(catalogSelectionTypeValues),
218
+ ordinal: z.number().nullish(),
219
+ modifiers: z.array(catalogModifierBaseSchema).nullish()
220
+ });
221
+ const catalogVariationBaseSchema = z.object({
222
+ id: z.string(),
223
+ name: translationFieldSchema,
224
+ priceAmount: catalogAmountSchema,
225
+ currency: z.string(),
226
+ availability: z.enum(catalogAvailabilityValues).nullish(),
227
+ ordinal: z.number().nullish()
228
+ });
229
+ const catalogVariationWithDefaultSchema = catalogVariationBaseSchema.extend({ onByDefault: z.boolean() });
230
+ const catalogItemSummarySchema = z.object({
231
+ id: z.string(),
232
+ name: translationFieldSchema,
233
+ quickAddVariationId: z.string().nullish(),
234
+ description: translationFieldSchema.nullish(),
235
+ imageUrl: z.string(),
236
+ availability: z.enum(catalogAvailabilityValues).nullish(),
237
+ ordinal: z.number().nullish(),
238
+ currency: z.string(),
239
+ priceRange: catalogPriceRangeSchema,
240
+ categories: z.array(z.object({
241
+ id: z.string(),
242
+ name: translationFieldSchema
243
+ })).nullish()
244
+ });
245
+ const catalogItemDetailSchema = z.object({
246
+ id: z.string(),
247
+ name: translationFieldSchema,
248
+ description: translationFieldSchema.nullish(),
249
+ imageUrls: z.string().array(),
250
+ foodAndBeverageDetails: z.object({
251
+ calorie: z.number(),
252
+ ingredients: z.array(z.enum(catalogFoodIngredientValues)),
253
+ dietaryPreferences: z.array(z.enum(catalogDietaryPreferenceValues))
254
+ }).nullish(),
255
+ variations: z.array(catalogVariationBaseSchema),
256
+ modifierLists: z.array(catalogModifierListBaseSchema.extend({ modifiers: z.array(catalogModifierBaseSchema) })),
257
+ categories: z.array(catalogCategoryBaseSchema).nullish(),
258
+ availability: z.enum(catalogAvailabilityValues),
259
+ ordinal: z.number().nullish(),
260
+ currency: z.string(),
261
+ priceRange: catalogPriceRangeSchema
262
+ });
263
+ const catalogCategorySchema = z.object({
264
+ category: catalogCategoryBaseSchema,
265
+ items: z.array(catalogItemSummarySchema)
266
+ });
267
+ const catalogItemFilterSchema = baseFilterSchema.extend({
268
+ locationId: z.string().nullish(),
269
+ categoryId: z.string().nullish(),
270
+ availability: z.enum(catalogAvailabilityValues).nullish(),
271
+ name: z.string().nullish(),
272
+ priceMin: catalogAmountSchema.nullish(),
273
+ priceMax: catalogAmountSchema.nullish()
274
+ }).refine((data) => data.locationId, { message: "locationId is required" });
275
+ const listCatalogItemsInputSchema = baseListInputSchema(catalogItemFilterSchema);
276
+ const listCatalogItemsOutputSchema = baseListOutputSchema(catalogItemSummarySchema);
277
+ const getCatalogItemInputSchema = z.object({
278
+ itemId: z.string(),
279
+ locationId: z.string().nullish()
280
+ });
281
+ const getCatalogItemOutputSchema = catalogItemDetailSchema;
282
+ const catalogVariationFilterSchema = baseFilterSchema.extend({
283
+ itemId: z.string(),
284
+ locationId: z.string().nullish(),
285
+ availability: z.enum(catalogAvailabilityValues).nullish(),
286
+ name: z.string().nullish(),
287
+ priceMin: catalogAmountSchema.nullish(),
288
+ priceMax: catalogAmountSchema.nullish()
289
+ });
290
+ const listCatalogVariationsInputSchema = baseListInputSchema(catalogVariationFilterSchema);
291
+ const listCatalogVariationsOutputSchema = baseListOutputSchema(catalogVariationWithDefaultSchema);
292
+ const catalogModifierFilterSchema = baseFilterSchema.extend({
293
+ itemId: z.string().nullish(),
294
+ availability: z.enum(catalogAvailabilityValues).nullish(),
295
+ name: z.string().nullish(),
296
+ priceMin: catalogAmountSchema.nullish(),
297
+ priceMax: catalogAmountSchema.nullish()
298
+ });
299
+ const listCatalogModifiersInputSchema = baseListInputSchema(catalogModifierFilterSchema);
300
+ const listCatalogModifiersOutputSchema = baseListOutputSchema(catalogModifierBaseSchema);
301
+ const catalogModifierListFilterSchema = baseFilterSchema.extend({
302
+ itemId: z.string().nullish(),
303
+ locationId: z.string().nullish(),
304
+ name: z.string().nullish(),
305
+ selectionType: z.enum(catalogSelectionTypeValues).nullish()
306
+ });
307
+ const listCatalogModifierListsInputSchema = baseListInputSchema(catalogModifierListFilterSchema);
308
+ const catalogModifierListSummarySchema = z.object({
309
+ id: z.string(),
310
+ name: translationFieldSchema,
311
+ selectionType: z.enum(catalogSelectionTypeValues),
312
+ ordinal: z.number().nullish()
313
+ });
314
+ const listCatalogModifierListsOutputSchema = baseListOutputSchema(catalogModifierListSummarySchema);
315
+ const catalogCategoryFilterSchema = baseFilterSchema.extend({
316
+ locationId: z.string(),
317
+ categoryId: z.string().nullish(),
318
+ categoryName: z.string().nullish()
319
+ });
320
+ const listCatalogCategoriesWithItemsInputSchema = baseListInputSchema(catalogCategoryFilterSchema);
321
+ const listCatalogCategoriesWithItemsOutputSchema = baseListOutputSchema(catalogCategorySchema);
322
+ const listCatalogCategoriesInputSchema = baseListInputSchema(catalogCategoryFilterSchema);
323
+ const listCatalogCategoriesOutputSchema = baseListOutputSchema(catalogCategoryBaseSchema);
324
+ const linkItemWithCategoryInputSchema = z.object({
325
+ itemId: z.string(),
326
+ categoryId: z.string()
327
+ });
328
+ const linkItemWithModifierListInputSchema = z.object({
329
+ itemId: z.string(),
330
+ modifierListId: z.string()
331
+ });
332
+ const linkItemWithImageInputSchema = z.object({
333
+ itemId: z.string(),
334
+ imageId: z.string()
335
+ });
336
+ const unlinkItemWithCategoryInputSchema = z.object({
337
+ itemId: z.string(),
338
+ categoryId: z.string()
339
+ });
340
+ const unlinkItemWithModifierListInputSchema = z.object({
341
+ itemId: z.string(),
342
+ modifierListId: z.string()
343
+ });
344
+ const unlinkItemWithImageInputSchema = z.object({
345
+ itemId: z.string(),
346
+ imageId: z.string()
347
+ });
348
+ const upsertItemLocationOverrideInputSchema = z.object({
349
+ itemId: z.string(),
350
+ locationId: z.string(),
351
+ availability: z.enum(catalogAvailabilityValues).nullish()
352
+ });
353
+ const upsertVariationLocationOverrideInputSchema = z.object({
354
+ variationId: z.string(),
355
+ locationId: z.string(),
356
+ availability: z.enum(catalogAvailabilityValues).nullish()
357
+ });
358
+ const upsertModifierLocationOverrideInputSchema = z.object({
359
+ modifierId: z.string(),
360
+ locationId: z.string(),
361
+ availability: z.enum(catalogAvailabilityValues).nullish()
362
+ });
363
+ const upsertModifierInputSchema = z.object({
364
+ modifierListId: z.string(),
365
+ name: z.string(),
366
+ priceAmount: catalogAmountSchema,
367
+ onByDefault: z.boolean(),
368
+ ordinal: z.number().int().nonnegative().nullish(),
369
+ modifierId: z.string().nullish(),
370
+ merchantId: z.string().optional()
371
+ });
372
+ const upsertItemModifierOverrideInputSchema = z.object({
373
+ itemId: z.string(),
374
+ modifierId: z.string(),
375
+ onByDefault: z.boolean()
376
+ });
377
+ const upsertModifierDefaultLocationOverrideInputSchema = z.object({
378
+ modifierId: z.string(),
379
+ locationId: z.string(),
380
+ onByDefault: z.boolean()
381
+ });
382
+ const createItemInputSchema = z.object({
383
+ name: z.record(z.string(), z.string()),
384
+ description: z.record(z.string(), z.string()).nullish(),
385
+ externalId: z.string().nullish(),
386
+ merchantId: z.string().optional(),
387
+ variation: z.object({
388
+ name: z.record(z.string(), z.string()),
389
+ priceAmount: catalogAmountSchema,
390
+ externalId: z.string().nullish(),
391
+ ordinal: z.number().nullish()
392
+ })
393
+ });
394
+ const createItemOutputSchema = z.object({
395
+ id: z.string(),
396
+ name: translationFieldSchema,
397
+ description: translationFieldSchema.nullish()
398
+ });
399
+ const updateItemInputSchema = z.object({
400
+ itemId: z.string(),
401
+ update: z.object({
402
+ name: z.record(z.string(), z.string()).nullish(),
403
+ description: z.record(z.string(), z.string()).nullish(),
404
+ availability: z.enum(catalogAvailabilityValues).nullish()
405
+ })
406
+ });
407
+ const updateItemOutputSchema = z.object({
408
+ id: z.string(),
409
+ name: translationFieldSchema,
410
+ description: translationFieldSchema.nullish(),
411
+ availability: z.enum(catalogAvailabilityValues).nullish()
412
+ });
413
+ const deleteItemInputSchema = z.object({ itemId: z.string() });
414
+ const deleteItemOutputSchema = z.object({ id: z.string() });
415
+ const deleteVariationInputSchema = z.object({ variationId: z.string() });
416
+ const deleteVariationOutputSchema = z.object({ id: z.string() });
417
+ const createVariationInputSchema = z.object({
418
+ itemId: z.string(),
419
+ name: z.record(z.string(), z.string()),
420
+ priceAmount: catalogAmountSchema,
421
+ availability: z.enum(catalogAvailabilityValues).nullish(),
422
+ externalId: z.string().nullish(),
423
+ merchantId: z.string().optional(),
424
+ ordinal: z.number().nullish()
425
+ });
426
+ const createVariationOutputSchema = z.object({
427
+ id: z.string(),
428
+ itemId: z.string(),
429
+ name: translationFieldSchema,
430
+ priceAmount: catalogAmountSchema,
431
+ availability: z.enum(catalogAvailabilityValues).nullish()
432
+ });
433
+ const updateVariationInputSchema = z.object({
434
+ variationId: z.string(),
435
+ update: z.object({
436
+ name: z.record(z.string(), z.string()).nullish(),
437
+ priceAmount: catalogAmountSchema.nullish(),
438
+ availability: z.enum(catalogAvailabilityValues).nullish(),
439
+ externalId: z.string().nullish(),
440
+ ordinal: z.number().nullish()
441
+ })
442
+ });
443
+ const updateVariationOutputSchema = z.object({
444
+ id: z.string(),
445
+ availability: z.enum(catalogAvailabilityValues).nullish()
446
+ });
447
+ const createModifierListInputSchema = z.object({
448
+ name: z.record(z.string(), z.string()),
449
+ externalId: z.string().nullish(),
450
+ selectionType: z.enum(catalogSelectionTypeValues).default("SINGLE"),
451
+ ordinal: z.number().int().nonnegative().nullish(),
452
+ merchantId: z.string().optional()
453
+ });
454
+ const createModifierListOutputSchema = z.object({
455
+ id: z.string(),
456
+ name: translationFieldSchema,
457
+ selectionType: z.enum(catalogSelectionTypeValues).nullish()
458
+ });
459
+ const createModifierInputSchema = z.object({
460
+ modifierListId: z.string(),
461
+ name: z.record(z.string(), z.string()),
462
+ priceAmount: catalogAmountSchema,
463
+ onByDefault: z.boolean().nullish(),
464
+ ordinal: z.number().int().nonnegative().nullish(),
465
+ externalId: z.string().nullish(),
466
+ merchantId: z.string().optional()
467
+ });
468
+ const createModifierOutputSchema = z.object({
469
+ id: z.string(),
470
+ name: translationFieldSchema,
471
+ priceAmount: catalogAmountSchema,
472
+ modifierListId: z.string(),
473
+ onByDefault: z.boolean()
474
+ });
475
+ const createCategoryInputSchema = z.object({
476
+ name: z.record(z.string(), z.string()),
477
+ ordinal: z.number().int().nonnegative().nullish(),
478
+ externalId: z.string().nullish(),
479
+ merchantId: z.string().optional()
480
+ });
481
+ const createCategoryOutputSchema = z.object({
482
+ id: z.string(),
483
+ name: translationFieldSchema
484
+ });
485
+ const getCategoryInputSchema = z.object({ categoryId: z.string() });
486
+ const getCategoryOutputSchema = z.object({
487
+ id: z.string(),
488
+ name: translationFieldSchema,
489
+ ordinal: z.number().nullish()
490
+ });
491
+ const updateCategoryInputSchema = z.object({
492
+ categoryId: z.string(),
493
+ name: z.record(z.string(), z.string()),
494
+ ordinal: z.number().int().nonnegative().nullish()
495
+ });
496
+ const updateCategoryOutputSchema = z.object({ id: z.string() });
497
+ const deleteCategoryInputSchema = z.object({ categoryId: z.string() });
498
+ const deleteCategoryOutputSchema = z.object({ id: z.string() });
499
+ const createImageInputSchema = z.object({
500
+ url: z.string(),
501
+ altText: z.string().nullish(),
502
+ externalId: z.string().nullish(),
503
+ merchantId: z.string().optional()
504
+ });
505
+ const createImageOutputSchema = z.object({
506
+ id: z.string(),
507
+ url: z.string(),
508
+ altText: z.string().nullish()
509
+ });
510
+ const mutationIdOutputSchema = z.object({ id: z.string() });
511
+ const getModifierInputSchema = z.object({ modifierId: z.string() });
512
+ const catalogModifierLocationOverrideSchema = z.object({
513
+ modifierId: z.string(),
514
+ locationId: z.string(),
515
+ availability: z.enum(catalogAvailabilityValues).nullish(),
516
+ onByDefaultOverride: z.boolean().nullish()
517
+ });
518
+ const catalogModifierItemOverrideSchema = z.object({
519
+ modifierId: z.string(),
520
+ itemId: z.string(),
521
+ onByDefaultOverride: z.boolean().nullish()
522
+ });
523
+ const catalogModifierDefaultLocationOverrideSchema = z.object({
524
+ modifierId: z.string(),
525
+ locationId: z.string(),
526
+ onByDefaultOverride: z.boolean().nullish()
527
+ });
528
+ const getModifierOutputSchema = catalogModifierBaseSchema.extend({
529
+ modifierListId: z.string(),
530
+ locationOverrides: z.array(catalogModifierLocationOverrideSchema).nullish(),
531
+ itemOverrides: z.array(catalogModifierItemOverrideSchema).nullish(),
532
+ defaultLocationOverrides: z.array(catalogModifierDefaultLocationOverrideSchema).nullish()
533
+ });
534
+ const getModifierListInputSchema = z.object({
535
+ modifierListId: z.string(),
536
+ locationId: z.string().nullish()
537
+ });
538
+ const catalogModifierListDetailSchema = z.object({
539
+ id: z.string(),
540
+ name: translationFieldSchema,
541
+ selectionType: z.enum(catalogSelectionTypeValues),
542
+ ordinal: z.number().nullish(),
543
+ modifiers: z.array(getModifierOutputSchema).nullish()
544
+ });
545
+ const getModifierListOutputSchema = catalogModifierListDetailSchema;
546
+ const updateModifierInputSchema = z.object({
547
+ modifierId: z.string(),
548
+ name: z.string(),
549
+ priceAmount: catalogAmountSchema,
550
+ onByDefault: z.boolean(),
551
+ ordinal: z.number().int().nonnegative().nullish(),
552
+ merchantId: z.string().optional()
553
+ });
554
+ const updateModifierOutputSchema = mutationIdOutputSchema;
555
+ const updateModifierListInputSchema = z.object({
556
+ modifierListId: z.string(),
557
+ name: z.string(),
558
+ selectionType: z.enum(catalogSelectionTypeValues),
559
+ ordinal: z.number().int().nonnegative().nullish(),
560
+ merchantId: z.string().optional()
561
+ });
562
+ const updateModifierListOutputSchema = mutationIdOutputSchema;
563
+ const deleteModifierInputSchema = z.object({ modifierId: z.string() });
564
+ const deleteModifierOutputSchema = mutationIdOutputSchema;
565
+ const deleteModifierListInputSchema = z.object({ modifierListId: z.string() });
566
+ const deleteModifierListOutputSchema = mutationIdOutputSchema;
567
+ const modifierOverrideTypeValues = [
568
+ "LOCATION",
569
+ "DEFAULT_LOCATION",
570
+ "ITEM"
571
+ ];
572
+ const upsertModifierOverrideInputSchema = z.object({
573
+ modifierId: z.string(),
574
+ overrideType: z.enum(modifierOverrideTypeValues),
575
+ locationId: z.string().nullish(),
576
+ itemId: z.string().nullish(),
577
+ availability: z.enum(catalogAvailabilityValues).nullish(),
578
+ onByDefaultOverride: z.boolean().nullish()
579
+ });
580
+ const upsertModifierOverrideOutputSchema = mutationIdOutputSchema;
581
+ const deleteModifierOverrideInputSchema = z.object({
582
+ modifierId: z.string(),
583
+ overrideType: z.enum(modifierOverrideTypeValues),
584
+ locationId: z.string().nullish(),
585
+ itemId: z.string().nullish()
586
+ });
587
+ const deleteModifierOverrideOutputSchema = mutationIdOutputSchema;
588
+ const linkOperationOutputSchema = z.void();
589
+ const bytesLimit = 5 * 1024 * 1024;
590
+ const uploadCatalogItemPhotoInputSchema = z.object({
591
+ itemId: z.string(),
592
+ photo: z.file().max(bytesLimit).mime([
593
+ "image/jpeg",
594
+ "image/png",
595
+ "image/webp"
596
+ ])
597
+ });
598
+ const uploadCatalogItemPhotoOutputSchema = z.object({ imageUrl: z.string() });
599
+
600
+ //#endregion
601
+ //#region src/schema/customers.ts
602
+ const customerBaseSchema = z.object({
603
+ id: z.uuid().nullish(),
604
+ userId: z.string().nullish(),
605
+ totalOrders: z.number().default(0),
606
+ totalSpent: z.bigint().default(0n),
607
+ lastOrderAt: z.date().nullish(),
608
+ firstOrderAt: z.date().nullish(),
609
+ createdAt: z.date().nullish(),
610
+ updatedAt: z.date().nullish(),
611
+ deletedAt: z.date().nullish(),
612
+ name: z.string(),
613
+ email: z.email(),
614
+ phoneNumber: z.string().nullish(),
615
+ image: z.string().nullish(),
616
+ emailVerified: z.boolean().default(false),
617
+ phoneNumberVerified: z.boolean().nullish()
618
+ });
619
+ const customerAddressBaseSchema = z.object({
620
+ id: z.uuid().nullish(),
621
+ customerId: z.uuid(),
622
+ addressLine1: z.string(),
623
+ addressLine2: z.string().nullish(),
624
+ city: z.string(),
625
+ state: z.string(),
626
+ zipCode: z.string(),
627
+ country: z.string(),
628
+ shortAddress: z.string().nullish(),
629
+ coordinates: z.object({
630
+ latitude: z.number(),
631
+ longitude: z.number()
632
+ })
633
+ });
634
+ const upsertCustomerInputSchema = z.object({
635
+ firstName: z.string(),
636
+ lastName: z.string()
637
+ });
638
+ const customerFilterSchema = baseFilterSchema.extend({
639
+ name: z.string().nullish(),
640
+ email: z.email().nullish(),
641
+ phoneNumber: z.string().nullish(),
642
+ merchantId: z.uuid().nullish()
643
+ });
644
+ const listCustomersInputSchema = baseListInputSchema(customerFilterSchema);
645
+ const customerByIdInputSchema = z.object({ customerId: z.uuid() });
646
+ const customerAddressByIdInputSchema = z.object({ addressId: z.uuid() });
647
+ const createCustomerAddressInputSchema = customerAddressBaseSchema.omit({ customerId: true });
648
+ const customerOutputSchema = customerBaseSchema;
649
+ const listCustomersOutputSchema = baseListOutputSchema(customerBaseSchema);
650
+ const customerAddressOutputSchema = customerAddressBaseSchema;
651
+ const customerAddressFilterSchema = baseFilterSchema.extend({
652
+ customerId: z.uuid().nullish(),
653
+ city: z.string().nullish(),
654
+ state: z.string().nullish(),
655
+ country: z.string().nullish(),
656
+ zipCode: z.string().nullish()
657
+ });
658
+ const listCustomerAddressesInputSchema = baseListInputSchema(customerAddressFilterSchema);
659
+ const listCustomerAddressesOutputSchema = baseListOutputSchema(customerAddressBaseSchema);
660
+ const merchantCustomerBaseSchema = z.object({
661
+ id: z.uuid().nullish(),
662
+ merchantId: z.uuid(),
663
+ customerId: z.uuid(),
664
+ customerNotes: z.string().nullish(),
665
+ totalOrders: z.number().default(0),
666
+ totalSpent: z.bigint().default(0n),
667
+ lastOrderAt: z.date().nullish(),
668
+ firstOrderAt: z.date().nullish(),
669
+ createdAt: z.date().nullish(),
670
+ updatedAt: z.date().nullish(),
671
+ deletedAt: z.date().nullish(),
672
+ name: z.string(),
673
+ email: z.email(),
674
+ phoneNumber: z.string().nullish(),
675
+ image: z.string().nullish(),
676
+ emailVerified: z.boolean().default(false),
677
+ phoneNumberVerified: z.boolean().nullish(),
678
+ userId: z.string()
679
+ });
680
+ const merchantCustomerFilterSchema = baseFilterSchema.extend({
681
+ name: z.string().nullish(),
682
+ email: z.email().nullish(),
683
+ phoneNumber: z.string().nullish(),
684
+ customerNotes: z.string().nullish(),
685
+ merchantId: z.uuid().optional()
686
+ });
687
+ const listMerchantCustomersInputSchema = baseListInputSchema(merchantCustomerFilterSchema);
688
+ const merchantCustomerByIdInputSchema = z.object({
689
+ customerId: z.uuid(),
690
+ merchantId: z.uuid().optional()
691
+ });
692
+ const deleteMerchantCustomerInputSchema = z.object({
693
+ customerId: z.uuid(),
694
+ merchantId: z.uuid().optional()
695
+ });
696
+ const deleteCustomerInputSchema = z.object({ customerId: z.uuid() });
697
+ const createCustomerManualInputSchema = z.object({
698
+ name: z.string().min(1, "Name is required"),
699
+ phoneNumber: z.string().min(1, "Phone number is required")
700
+ });
701
+ const createCustomerManualOutputSchema = customerBaseSchema;
702
+ const createMerchantCustomerManualInputSchema = z.object({
703
+ name: z.string().min(1, "Name is required"),
704
+ phoneNumber: z.string().min(1, "Phone number is required"),
705
+ merchantId: z.uuid().optional()
706
+ });
707
+ const createMerchantCustomerManualOutputSchema = merchantCustomerBaseSchema;
708
+ const merchantCustomerOutputSchema = merchantCustomerBaseSchema;
709
+ const listMerchantCustomersOutputSchema = baseListOutputSchema(merchantCustomerBaseSchema);
710
+ const defaultCustomerSort = defaultTimeSort;
711
+ const defaultCustomerAddressSort = defaultTimeSort;
712
+ const defaultMerchantCustomerSort = defaultTimeSort;
713
+ const bulkCustomerImportRowClientSchema = z.object({
714
+ email: z.string().email("Invalid email address").or(z.literal("")).optional(),
715
+ name: z.string().min(1, "Name is required"),
716
+ phoneNumber: z.string().min(1, "Phone number is required"),
717
+ totalOrders: z.string().nullish(),
718
+ totalPaid: z.string().nullish(),
719
+ createdAt: z.string().datetime().nullish()
720
+ });
721
+ const bulkCustomerImportRowSchema = z.object({
722
+ email: z.string().email("Invalid email address").or(z.literal("")).optional(),
723
+ name: z.string().min(1, "Name is required"),
724
+ phoneNumber: z.string().min(1, "Phone number is required"),
725
+ totalOrders: z.string().nullish().transform((val) => {
726
+ if (!val || val.trim() === "") return 0;
727
+ const parsed = Number.parseInt(val.replace(/[, ]/g, ""), 10);
728
+ return Number.isNaN(parsed) ? 0 : parsed;
729
+ }),
730
+ totalPaid: z.string().nullish().transform((val) => {
731
+ if (!val || val.trim() === "") return 0n;
732
+ try {
733
+ const cleaned = val.replace(/[, ]/g, "");
734
+ const parsed = Number.parseInt(cleaned, 10);
735
+ return Number.isNaN(parsed) ? 0n : BigInt(parsed);
736
+ } catch {
737
+ return 0n;
738
+ }
739
+ }),
740
+ createdAt: z.string().datetime().nullish()
741
+ });
742
+ const bulkCustomerImportInputSchema = z.object({
743
+ rows: z.array(bulkCustomerImportRowClientSchema),
744
+ merchantId: z.uuid().nullish()
745
+ });
746
+ const bulkCustomerImportErrorSchema = z.object({
747
+ rowIndex: z.number(),
748
+ message: z.string(),
749
+ row: bulkCustomerImportRowSchema.partial().optional()
750
+ });
751
+ const bulkCustomerImportResultSchema = z.object({
752
+ success: z.boolean(),
753
+ summary: z.object({
754
+ totalRows: z.number(),
755
+ created: z.number(),
756
+ updated: z.number(),
757
+ skipped: z.number(),
758
+ failed: z.number()
759
+ }),
760
+ errors: z.array(bulkCustomerImportErrorSchema)
761
+ });
762
+ const bulkCustomerExportInputSchema = z.object({ merchantId: z.uuid().nullish() });
763
+ const bulkCustomerExportRowSchema = z.object({
764
+ id: z.string().nullish(),
765
+ name: z.string(),
766
+ email: z.string(),
767
+ phoneNumber: z.string().nullish(),
768
+ totalOrders: z.number(),
769
+ totalSpent: z.string(),
770
+ lastOrderAt: z.string().nullish(),
771
+ firstOrderAt: z.string().nullish(),
772
+ createdAt: z.string().nullish()
773
+ });
774
+ const bulkCustomerExportResultSchema = z.object({ csv: z.string() });
775
+
776
+ //#endregion
777
+ //#region src/schema/discounts.ts
778
+ const discountScopes = ["ORDER", "LINE_ITEM"];
779
+ const discountTypes = ["PERCENTAGE", "FIXED_AMOUNT"];
780
+ const discountAutoApplyScopes = [
781
+ "ALL_ITEMS",
782
+ "CATEGORY",
783
+ "SELECTED_ITEMS"
784
+ ];
785
+ const discountValueSchema = z.number().int().positive({ message: "Value must be greater than zero" }).max(1e6, { message: "Value is too large" });
786
+ const discountBaseSchema = z.object({
787
+ id: z.string().uuid(),
788
+ merchantId: z.string().uuid(),
789
+ locationId: z.string().uuid(),
790
+ name: z.string(),
791
+ scope: z.enum(discountScopes),
792
+ discountType: z.enum(discountTypes),
793
+ value: z.number(),
794
+ autoApplyScope: z.enum(discountAutoApplyScopes),
795
+ isActive: z.boolean(),
796
+ startsAt: z.date().nullish(),
797
+ endsAt: z.date().nullish(),
798
+ createdAt: z.date(),
799
+ updatedAt: z.date(),
800
+ itemIds: z.array(z.string().uuid()).default([]),
801
+ categoryIds: z.array(z.string().uuid()).default([])
802
+ });
803
+ const ensureTargets = (data, ctx) => {
804
+ if (data.autoApplyScope === "SELECTED_ITEMS" && (!data.itemIds || data.itemIds.length === 0)) ctx.addIssue({
805
+ code: z.ZodIssueCode.custom,
806
+ path: ["itemIds"],
807
+ message: "itemIds are required when autoApplyScope is SELECTED_ITEMS"
808
+ });
809
+ if (data.autoApplyScope === "CATEGORY" && (!data.categoryIds || data.categoryIds.length === 0)) ctx.addIssue({
810
+ code: z.ZodIssueCode.custom,
811
+ path: ["categoryIds"],
812
+ message: "categoryIds are required when autoApplyScope is CATEGORY"
813
+ });
814
+ };
815
+ const discountCoreSchema = z.object({
816
+ merchantId: z.string().uuid(),
817
+ locationId: z.string().uuid(),
818
+ name: z.string().min(1),
819
+ scope: z.enum(discountScopes),
820
+ discountType: z.enum(discountTypes),
821
+ value: discountValueSchema,
822
+ autoApplyScope: z.enum(discountAutoApplyScopes).default("ALL_ITEMS"),
823
+ isActive: z.boolean().default(true),
824
+ startsAt: z.date().nullish(),
825
+ endsAt: z.date().nullish(),
826
+ itemIds: z.array(z.string().uuid()).nullish(),
827
+ categoryIds: z.array(z.string().uuid()).nullish()
828
+ });
829
+ const createDiscountInputSchema = discountCoreSchema.superRefine((data, ctx) => {
830
+ ensureTargets(data, ctx);
831
+ if (data.discountType === "PERCENTAGE" && data.value > 100) ctx.addIssue({
832
+ code: z.ZodIssueCode.custom,
833
+ path: ["value"],
834
+ message: "Percentage discounts cannot exceed 100%"
835
+ });
836
+ });
837
+ const updateDiscountPatchSchema = discountCoreSchema.partial().superRefine((data, ctx) => {
838
+ ensureTargets(data, ctx);
839
+ if ((data.discountType === "PERCENTAGE" || !data.discountType) && typeof data.value === "number" && data.value > 100) ctx.addIssue({
840
+ code: z.ZodIssueCode.custom,
841
+ path: ["value"],
842
+ message: "Percentage discounts cannot exceed 100%"
843
+ });
844
+ }).refine((value) => Object.keys(value).length > 0, { message: "At least one field must be provided" });
845
+ const updateDiscountInputSchema = z.object({
846
+ discountId: z.string().uuid(),
847
+ update: updateDiscountPatchSchema
848
+ });
849
+ const listDiscountsInputSchema = z.object({
850
+ merchantId: z.string().uuid().nullish(),
851
+ locationId: z.string().uuid().nullish(),
852
+ isActive: z.boolean().nullish()
853
+ });
854
+ const discountIdInputSchema = z.object({ discountId: z.string().uuid() });
855
+ const discountListOutputSchema = z.object({ discounts: discountBaseSchema.array() });
856
+ const discountOutputSchema = discountBaseSchema;
857
+
858
+ //#endregion
859
+ //#region src/schema/external/anb.ts
860
+ /**
861
+ * ANB Payment Status values from their API
862
+ */
863
+ const anbPaymentStatusSchema = z.enum([
864
+ "INITIATED",
865
+ "PENDING",
866
+ "PROCESSING",
867
+ "PAID",
868
+ "FAILED",
869
+ "RETURNED",
870
+ "CANCELED"
871
+ ]);
872
+ /**
873
+ * ANB Single Payment Initiation Request Payload
874
+ *
875
+ * Note: Some minimum length constraints are relaxed from ANB's strict requirements
876
+ * to accommodate real-world data in our database. Data should be normalized/validated
877
+ * at the source (DB/UI) before being passed here.
878
+ */
879
+ const anbSinglePaymentRequestSchema = z.object({
880
+ sequenceNumber: z.string().min(1).max(16),
881
+ valueDate: z.string().regex(/^\d{6}$/, "Must be YYMMDD format"),
882
+ currency: z.string().length(3),
883
+ amount: z.string().regex(/^\d+(\.\d+)?$/, "Must be a positive number string"),
884
+ feeIncluded: z.boolean().optional().default(false),
885
+ orderingParty: z.string().min(2).max(35),
886
+ orderingPartyAddress1: z.string().min(2).max(35),
887
+ orderingPartyAddress2: z.string().min(2).max(35),
888
+ orderingPartyAddress3: z.string().min(2).max(35),
889
+ debitAccount: z.string().min(1).max(24),
890
+ channel: z.enum([
891
+ "ANB",
892
+ "SARIE",
893
+ "IPS",
894
+ "SWIFT"
895
+ ]).optional(),
896
+ destinationBankBIC: z.string().min(1).max(11),
897
+ creditAccount: z.string().min(1).max(35),
898
+ beneficiaryName: z.string().min(2).max(35),
899
+ beneficiaryAddress1: z.string().min(2).max(35),
900
+ beneficiaryAddress2: z.string().min(1).max(35).optional(),
901
+ beneficiaryAddress3: z.string().min(1).max(35).optional(),
902
+ narrative: z.string().max(35).optional(),
903
+ transactionComment: z.string().max(105).optional(),
904
+ purposeOfTransfer: z.string().optional(),
905
+ externalReferenceNumber: z.string().optional()
906
+ });
907
+ /**
908
+ * ANB Single Payment Initiation Response (POST /b2b-payment/single-payment)
909
+ * Based on ANB docs, the POST response is minimal and may only include:
910
+ * - id, sequenceNumber, transactionReferenceNumber, status
911
+ * Other fields like createdAt/updatedAt are typically only in GET status responses
912
+ *
913
+ * Note: Made fields optional to handle varying ANB response structures.
914
+ * sequenceNumber should always be present as we send it in the request.
915
+ */
916
+ const anbSinglePaymentInitiationResponseSchema = z.object({
917
+ id: z.string().optional(),
918
+ sequenceNumber: z.string().optional(),
919
+ transactionReferenceNumber: z.string().optional(),
920
+ externalReferenceNumber: z.string().optional(),
921
+ status: anbPaymentStatusSchema.optional(),
922
+ transactionComment: z.string().optional(),
923
+ createdAt: z.string().datetime().optional(),
924
+ updatedAt: z.string().datetime().optional(),
925
+ exchangeRate: z.string().optional(),
926
+ reasonOfFailure: z.string().optional()
927
+ }).passthrough();
928
+ /**
929
+ * ANB Single Payment Initiation Response (legacy - kept for backward compatibility)
930
+ * @deprecated Use anbSinglePaymentInitiationResponseSchema instead
931
+ */
932
+ const anbSinglePaymentResponseSchema = anbSinglePaymentInitiationResponseSchema;
933
+ /**
934
+ * ANB Payment Status Query Response (GET /v2/payment/{id})
935
+ */
936
+ const anbPaymentStatusResponseSchema = z.object({
937
+ id: z.string().uuid(),
938
+ sequenceNumber: z.string(),
939
+ transactionReferenceNumber: z.string(),
940
+ externalReferenceNumber: z.string().optional(),
941
+ status: anbPaymentStatusSchema,
942
+ createdAt: z.string().datetime(),
943
+ updatedAt: z.string().datetime(),
944
+ exchangeRate: z.string().optional(),
945
+ reasonOfFailure: z.string().optional()
946
+ });
947
+ /**
948
+ * ANB Webhook Notification Payload
949
+ * Based on payment status response structure, webhooks likely follow similar format
950
+ */
951
+ const anbWebhookPayloadSchema = z.object({
952
+ id: z.string().uuid(),
953
+ sequenceNumber: z.string(),
954
+ transactionReferenceNumber: z.string(),
955
+ externalReferenceNumber: z.string().optional(),
956
+ status: anbPaymentStatusSchema,
957
+ createdAt: z.string().datetime(),
958
+ updatedAt: z.string().datetime(),
959
+ exchangeRate: z.string().optional(),
960
+ reasonOfFailure: z.string().optional(),
961
+ eventType: z.string().optional(),
962
+ timestamp: z.string().datetime().optional()
963
+ });
964
+ /**
965
+ * Maps ANB payment status to internal payout status
966
+ */
967
+ function mapAnbStatusToPayoutStatus(anbStatus) {
968
+ switch (anbStatus) {
969
+ case "INITIATED": return "PROCESSING";
970
+ case "PENDING": return "PENDING";
971
+ case "PROCESSING": return "PROCESSING";
972
+ case "PAID": return "PAID";
973
+ case "FAILED": return "FAILED";
974
+ case "RETURNED": return "FAILED";
975
+ case "CANCELED": return "CANCELLED";
976
+ default: return "PENDING";
977
+ }
978
+ }
979
+
980
+ //#endregion
981
+ //#region src/schema/socials.ts
982
+ /**
983
+ * Strict enum for social media platforms.
984
+ * Both merchant socials and location social overrides use this same enum.
985
+ */
986
+ const socialPlatformsEnum = z.enum([
987
+ "INSTAGRAM",
988
+ "TIKTOK",
989
+ "TWITTER",
990
+ "FACEBOOK",
991
+ "SNAPCHAT",
992
+ "WEBSITE"
993
+ ]);
994
+ /**
995
+ * Base social schema used for both merchant socials and location social overrides.
996
+ */
997
+ const socialBaseSchema = z.object({
998
+ id: z.uuid(),
999
+ platform: socialPlatformsEnum,
1000
+ handle: z.string().nullable(),
1001
+ url: z.string().nullable(),
1002
+ iconUrl: z.string().nullable(),
1003
+ createdAt: z.date(),
1004
+ updatedAt: z.date()
1005
+ });
1006
+ /**
1007
+ * Input schema for creating a social (merchant social or location override).
1008
+ */
1009
+ const createSocialInputSchema = z.object({
1010
+ platform: socialPlatformsEnum,
1011
+ handle: z.string().min(1).nullable(),
1012
+ url: z.string().url().nullable(),
1013
+ iconUrl: z.string().url().nullable()
1014
+ });
1015
+ /**
1016
+ * Input schema for updating a social (merchant social or location override).
1017
+ */
1018
+ const updateSocialInputSchema = createSocialInputSchema.partial();
1019
+ /**
1020
+ * Schema for getting a single social by ID.
1021
+ */
1022
+ const socialIdInputSchema = z.object({ id: z.uuid() });
1023
+
1024
+ //#endregion
1025
+ //#region src/schema/merchants.ts
1026
+ const merchantBaseSchema = z.object({
1027
+ id: z.uuid(),
1028
+ name: translationFieldSchema,
1029
+ description: translationFieldSchema,
1030
+ slug: z.string(),
1031
+ ownerId: z.string(),
1032
+ country: z.string(),
1033
+ businessEmail: z.string(),
1034
+ phoneNumber: z.string(),
1035
+ logoUrl: z.string(),
1036
+ bannerUrl: z.string(),
1037
+ createdAt: z.date(),
1038
+ updatedAt: z.date()
1039
+ });
1040
+ const createMerchantInputSchema = z.object({
1041
+ name: z.string().min(1),
1042
+ email: z.email(),
1043
+ phoneNumber: z.string().min(1),
1044
+ merchantName: translationFieldSchema.optional(),
1045
+ description: translationFieldSchema.optional(),
1046
+ logo: z.instanceof(File).optional(),
1047
+ banner: z.instanceof(File).optional()
1048
+ });
1049
+ const merchantIntegrationSchema = z.object({
1050
+ id: z.uuid(),
1051
+ merchantId: z.uuid(),
1052
+ accountId: z.string(),
1053
+ provider: z.string(),
1054
+ createdAt: z.date(),
1055
+ updatedAt: z.date()
1056
+ });
1057
+ const merchantLegalDetailsSchema = z.object({
1058
+ id: z.uuid(),
1059
+ merchantId: z.uuid(),
1060
+ CRNNumber: z.string(),
1061
+ VATName: z.string().nullable(),
1062
+ VATNumber: z.string().nullable(),
1063
+ crnDocUrl: z.string().nullable(),
1064
+ vatDocUrl: z.string().nullable(),
1065
+ createdAt: z.date(),
1066
+ updatedAt: z.date()
1067
+ });
1068
+ const merchantFullDetailsSchema = z.object({
1069
+ id: z.uuid(),
1070
+ name: translationFieldSchema,
1071
+ description: translationFieldSchema.nullable(),
1072
+ slug: z.string().nullable(),
1073
+ ownerId: z.string(),
1074
+ ownerName: z.string(),
1075
+ ownerEmail: z.string(),
1076
+ ownerPhoneNumber: z.string().nullable(),
1077
+ country: z.string(),
1078
+ businessEmail: z.string().nullable(),
1079
+ phoneNumber: z.string().nullable(),
1080
+ logoUrl: z.string().nullable(),
1081
+ bannerUrl: z.string().nullable(),
1082
+ createdAt: z.date(),
1083
+ updatedAt: z.date(),
1084
+ integrations: z.array(merchantIntegrationSchema),
1085
+ socials: z.array(socialBaseSchema),
1086
+ legalDetails: merchantLegalDetailsSchema.nullable()
1087
+ });
1088
+ const merchantSummarySchema = z.object({
1089
+ merchant: merchantBaseSchema,
1090
+ accountId: z.string(),
1091
+ country: z.string(),
1092
+ status: z.string(),
1093
+ businessEmail: z.string(),
1094
+ phoneNumber: z.string(),
1095
+ logoUrl: z.string(),
1096
+ bannerUrl: z.string(),
1097
+ createdAt: z.date(),
1098
+ updatedAt: z.date()
1099
+ });
1100
+ const merchantSyncEventSchema = z.object({ message: z.string() });
1101
+ const merchantIdInputSchema = z.object({ merchantId: z.string() });
1102
+ const createMerchantOutputSchema = z.object({
1103
+ merchantId: z.string(),
1104
+ userId: z.string()
1105
+ });
1106
+ const linkSquareIntegrationInputSchema = z.object({
1107
+ redirectUrl: z.string(),
1108
+ userId: z.string().nullish()
1109
+ });
1110
+ const linkSquareIntegrationOutputSchema = z.object({
1111
+ url: z.string(),
1112
+ redirect: z.boolean().default(true)
1113
+ });
1114
+ const merchantFilterSchema = baseFilterSchema.extend({
1115
+ name: z.string().nullish(),
1116
+ businessEmail: z.string().nullish(),
1117
+ hasNoLocations: z.boolean().nullish()
1118
+ });
1119
+ const listMerchantsInputSchema = baseListInputSchema(merchantFilterSchema);
1120
+ const merchantListItemSchema = z.object({
1121
+ id: z.uuid(),
1122
+ name: translationFieldSchema,
1123
+ businessEmail: z.string().nullable(),
1124
+ phoneNumber: z.string().nullable(),
1125
+ country: z.string(),
1126
+ createdAt: z.date()
1127
+ });
1128
+ const listMerchantsOutputSchema = baseListOutputSchema(merchantListItemSchema);
1129
+ const createMerchantLegalDetailsInputSchema = z.object({
1130
+ merchantId: z.uuid(),
1131
+ CRNNumber: z.string().min(1),
1132
+ VATName: z.string().optional(),
1133
+ VATNumber: z.string().optional(),
1134
+ crnDoc: z.instanceof(File).optional(),
1135
+ vatDoc: z.instanceof(File).optional()
1136
+ });
1137
+ const updateMerchantLegalDetailsInputSchema = z.object({
1138
+ merchantId: z.uuid(),
1139
+ legalDetailsId: z.uuid(),
1140
+ CRNNumber: z.string().min(1).optional(),
1141
+ VATName: z.string().optional(),
1142
+ VATNumber: z.string().optional(),
1143
+ crnDoc: z.instanceof(File).nullable().optional(),
1144
+ vatDoc: z.instanceof(File).nullable().optional()
1145
+ });
1146
+ const uploadCrnDocumentInputSchema = z.object({
1147
+ merchantId: z.uuid(),
1148
+ crnDoc: z.instanceof(File)
1149
+ });
1150
+ const uploadVatDocumentInputSchema = z.object({
1151
+ merchantId: z.uuid(),
1152
+ vatDoc: z.instanceof(File)
1153
+ });
1154
+
1155
+ //#endregion
1156
+ //#region src/schema/leads.ts
1157
+ /**
1158
+ * Preferred contact time enum for leads
1159
+ */
1160
+ const preferredContactTimeSchema = z.enum([
1161
+ "morning",
1162
+ "afternoon",
1163
+ "evening"
1164
+ ]);
1165
+ /**
1166
+ * Input schema for creating a lead as admin
1167
+ * Includes all merchant creation fields plus lead-specific fields
1168
+ */
1169
+ const createLeadForAdminInputSchema = createMerchantInputSchema.extend({
1170
+ services: z.array(z.string()).default([]),
1171
+ preferredContactTime: preferredContactTimeSchema
1172
+ });
1173
+ /**
1174
+ * Output schema for lead creation
1175
+ * Returns the created merchant and optional CRM lead ID
1176
+ */
1177
+ const createLeadForAdminOutputSchema = z.object({
1178
+ merchant: merchantFullDetailsSchema,
1179
+ crmLeadId: z.string().nullable()
1180
+ });
1181
+
1182
+ //#endregion
1183
+ //#region src/schema/payment-methods.ts
1184
+ /**
1185
+ * Payment Method: What the user/customer chooses to pay with (user-facing).
1186
+ * - COD: Cash on Delivery/Pickup
1187
+ * - CARD: Online card payment
1188
+ */
1189
+ const paymentMethodIds = ["COD", "CARD"];
1190
+ /**
1191
+ * Accepted Payments: Payment methods a location/fulfillment accepts.
1192
+ * Used in fulfillment configuration (pickup, delivery, dinein, curbside).
1193
+ * Must always be COD and/or CARD - no legacy CASH or ONLINE values.
1194
+ */
1195
+ const acceptedPaymentIds = ["COD", "CARD"];
1196
+ /**
1197
+ * Payment Gateway: Which backend processor handled the payment (backend/storage).
1198
+ * - MOYASAR: Moyasar payment gateway
1199
+ * - null: Internal/offline payment (COD, manual, etc)
1200
+ */
1201
+ const paymentGatewayIds = ["MOYASAR"];
1202
+
1203
+ //#endregion
1204
+ //#region src/schema/promocodes.ts
1205
+ const promoCodeAmountSchema = z.bigint();
1206
+ const promoCodeScopes = ["APP", "LOCATION"];
1207
+ const promoCodeDiscountTypes = ["PERCENTAGE", "FIXED_AMOUNT"];
1208
+ const promoCodeApplicationTargets = [
1209
+ "DELIVERY",
1210
+ "PICKUP",
1211
+ "CURBSIDE",
1212
+ "DINEIN",
1213
+ "SHIPPING"
1214
+ ];
1215
+ const promoCodeConfigurationSchema = z.object({
1216
+ usageLimit: z.number().int().positive().nullish(),
1217
+ applyOn: z.array(z.enum(promoCodeApplicationTargets)).nullish(),
1218
+ minOrderAmount: promoCodeAmountSchema.nullish(),
1219
+ maxDiscountAmount: z.number().int().positive().max(25).nullish()
1220
+ }).partial();
1221
+ const promoCodeBaseSchema = z.object({
1222
+ id: z.uuid(),
1223
+ code: z.string(),
1224
+ scope: z.enum(promoCodeScopes),
1225
+ merchantId: z.uuid().nullable(),
1226
+ locationId: z.uuid().nullable(),
1227
+ description: z.string().nullish(),
1228
+ discountType: z.enum(promoCodeDiscountTypes),
1229
+ value: z.number(),
1230
+ currency: z.string().nullish(),
1231
+ configuration: promoCodeConfigurationSchema.nullish(),
1232
+ isActive: z.boolean(),
1233
+ startsAt: z.date().nullish(),
1234
+ expiresAt: z.date().nullish(),
1235
+ createdAt: z.date(),
1236
+ updatedAt: z.date()
1237
+ });
1238
+ const promoCodeCoreSchema = z.object({
1239
+ code: z.string().min(1),
1240
+ scope: z.enum(promoCodeScopes),
1241
+ merchantId: z.uuid().nullish(),
1242
+ locationId: z.uuid().nullish(),
1243
+ description: z.string().nullish(),
1244
+ discountType: z.enum(promoCodeDiscountTypes),
1245
+ value: z.number().int().positive(),
1246
+ currency: z.string().nullish(),
1247
+ configuration: promoCodeConfigurationSchema.nullish(),
1248
+ isActive: z.boolean().default(true),
1249
+ startsAt: z.date().nullish(),
1250
+ expiresAt: z.date().nullish()
1251
+ });
1252
+ const createPromoCodeInputSchema = promoCodeCoreSchema.superRefine((data, ctx) => {
1253
+ if (data.scope === "LOCATION" && !data.locationId) ctx.addIssue({
1254
+ code: z.ZodIssueCode.custom,
1255
+ path: ["locationId"],
1256
+ message: "locationId is required for location scoped promo codes"
1257
+ });
1258
+ if (data.discountType === "PERCENTAGE" && data.value > 25) ctx.addIssue({
1259
+ code: z.ZodIssueCode.custom,
1260
+ path: ["value"],
1261
+ message: "Percentage discounts cannot exceed 25%"
1262
+ });
1263
+ if (data.discountType === "FIXED_AMOUNT" && data.value > 25) ctx.addIssue({
1264
+ code: z.ZodIssueCode.custom,
1265
+ path: ["value"],
1266
+ message: "Fixed amount discounts cannot exceed 25"
1267
+ });
1268
+ if (data.startsAt && data.expiresAt && data.expiresAt < data.startsAt) ctx.addIssue({
1269
+ code: z.ZodIssueCode.custom,
1270
+ path: ["expiresAt"],
1271
+ message: "expiresAt must be after startsAt"
1272
+ });
1273
+ });
1274
+ const updatePromoCodePatchSchema = promoCodeCoreSchema.partial().superRefine((data, ctx) => {
1275
+ if (data.scope === "LOCATION" && typeof data.locationId === "undefined") ctx.addIssue({
1276
+ code: z.ZodIssueCode.custom,
1277
+ path: ["locationId"],
1278
+ message: "locationId must be provided when changing scope to LOCATION"
1279
+ });
1280
+ if ((data.discountType === "PERCENTAGE" || !data.discountType) && typeof data.value === "number" && data.value > 25) ctx.addIssue({
1281
+ code: z.ZodIssueCode.custom,
1282
+ path: ["value"],
1283
+ message: "Percentage discounts cannot exceed 25%"
1284
+ });
1285
+ if ((data.discountType === "FIXED_AMOUNT" || !data.discountType) && typeof data.value === "number" && data.value > 25) ctx.addIssue({
1286
+ code: z.ZodIssueCode.custom,
1287
+ path: ["value"],
1288
+ message: "Fixed amount discounts cannot exceed 25"
1289
+ });
1290
+ if (data.startsAt && data.expiresAt && data.expiresAt < data.startsAt) ctx.addIssue({
1291
+ code: z.ZodIssueCode.custom,
1292
+ path: ["expiresAt"],
1293
+ message: "expiresAt must be after startsAt"
1294
+ });
1295
+ });
1296
+ const updatePromoCodeInputSchema = updatePromoCodePatchSchema;
1297
+ const promoCodeFilterSchema = baseFilterSchema.extend({
1298
+ merchantId: z.uuid().nullish(),
1299
+ locationId: z.uuid().nullish(),
1300
+ scope: z.enum(promoCodeScopes).nullish(),
1301
+ code: z.string().nullish(),
1302
+ isActive: z.boolean().nullish(),
1303
+ discountType: z.enum(promoCodeDiscountTypes).nullish(),
1304
+ startsAt: z.coerce.date().nullish(),
1305
+ expiresAt: z.coerce.date().nullish()
1306
+ });
1307
+ const listPromoCodesInputSchema = baseListInputSchema(promoCodeFilterSchema);
1308
+ const promoCodeIdInputSchema = z.object({ promoCodeId: z.uuid() });
1309
+ const promoCodeValidationInputSchema = z.object({
1310
+ code: z.string(),
1311
+ merchantId: z.uuid().nullish(),
1312
+ locationId: z.uuid().nullish(),
1313
+ orderTotalAmount: promoCodeAmountSchema.nullish(),
1314
+ orderType: z.enum(promoCodeApplicationTargets).nullish()
1315
+ });
1316
+ const promoCodeValidationResultSchema = z.object({
1317
+ valid: z.boolean(),
1318
+ message: z.string().nullish(),
1319
+ promoCode: promoCodeBaseSchema.nullish(),
1320
+ discountAmount: promoCodeAmountSchema.nullish(),
1321
+ totalAmount: promoCodeAmountSchema.nullish(),
1322
+ originalAmount: promoCodeAmountSchema.nullish()
1323
+ });
1324
+ const promoCodeListOutputSchema = baseListOutputSchema(promoCodeBaseSchema);
1325
+ const promoCodeOutputSchema = promoCodeBaseSchema;
1326
+ const defaultPromoCodeSort = defaultTimeSort;
1327
+
1328
+ //#endregion
1329
+ //#region src/schema/orders.ts
1330
+ const orderAmountSchema = z.bigint();
1331
+ const orderFulfillmentStateValues = [
1332
+ "NEW",
1333
+ "AWAITING_DELIVERY",
1334
+ "CONFIRMED",
1335
+ "READY",
1336
+ "ON_THE_WAY",
1337
+ "COMPLETED",
1338
+ "CANCELLED",
1339
+ "FAILED",
1340
+ "REFUNDED"
1341
+ ];
1342
+ /**
1343
+ * Fulfillment State Machine
1344
+ *
1345
+ * State Definitions:
1346
+ * - NEW: Customer placed & paid order
1347
+ * - AWAITING_DELIVERY: Merchant accepted delivery order, waiting for delivery provider acceptance
1348
+ * - CONFIRMED: Provider accepted delivery OR non-delivery order accepted by merchant
1349
+ * - READY: [OPTIONAL] Merchant marked order as ready for pickup/delivery
1350
+ * - COMPLETED: Order delivered or picked up
1351
+ * - CANCELLED: Cancelled before fulfillment (terminal)
1352
+ * - FAILED: Fulfillment attempt failed (terminal)
1353
+ * - REFUNDED: Order payment has been refunded (terminal)
1354
+ *
1355
+ * State Transitions:
1356
+ * - NEW → AWAITING_DELIVERY (Merchant accepts delivery order)
1357
+ * - NEW → CONFIRMED (Merchant accepts non-delivery order)
1358
+ * - NEW → CANCELLED (Merchant/Customer rejects)
1359
+ * - AWAITING_DELIVERY → CONFIRMED (Provider accepts delivery)
1360
+ * - AWAITING_DELIVERY → FAILED (Provider rejects, no fallbacks)
1361
+ * - AWAITING_DELIVERY → CANCELLED (Merchant/Customer cancels)
1362
+ * - CONFIRMED → READY (Merchant marks as ready - OPTIONAL)
1363
+ * - CONFIRMED → COMPLETED (Skip READY, go straight to completion)
1364
+ * - CONFIRMED → REFUNDED (Refund requested)
1365
+ * - CONFIRMED → CANCELLED (Cancelled after confirmation)
1366
+ * - READY → COMPLETED (Order picked up/delivered)
1367
+ * - READY → REFUNDED (Refund requested)
1368
+ * - READY → CANCELLED (Cancelled during preparation)
1369
+ * - COMPLETED → REFUNDED (Post-completion refund)
1370
+ * - CANCELLED/FAILED/REFUNDED are terminal states
1371
+ */
1372
+ /**
1373
+ * @deprecated Use paymentMethodIds from payment-methods.ts instead.
1374
+ * This is kept for backwards compatibility during migration.
1375
+ */
1376
+ const orderGatewayIds = paymentMethodIds;
1377
+ const orderFulfillmentTypes = [
1378
+ "DELIVERY",
1379
+ "PICKUP",
1380
+ "CURBSIDE",
1381
+ "DINEIN",
1382
+ "SHIPPING"
1383
+ ];
1384
+ const scheduleTypeEnum = z.enum(["ASAP", "SCHEDULED"]);
1385
+ const internalOrderSourceApps = z.enum(["POS", "JAICOME"]);
1386
+ const externalOrderSourceApps = z.enum(["SQUARE"]);
1387
+ const orderSourceSchema = z.discriminatedUnion("type", [z.object({
1388
+ type: z.literal("INTERNAL"),
1389
+ app: internalOrderSourceApps
1390
+ }), z.object({
1391
+ type: z.literal("EXTERNAL"),
1392
+ app: externalOrderSourceApps
1393
+ })]);
1394
+ const orderFulfillmentSchema = z.discriminatedUnion("type", [
1395
+ z.object({
1396
+ type: z.literal("DELIVERY"),
1397
+ coordinates: z.object({
1398
+ latitude: z.number(),
1399
+ longitude: z.number()
1400
+ })
1401
+ }),
1402
+ z.object({ type: z.literal("PICKUP") }),
1403
+ z.object({
1404
+ type: z.literal("CURBSIDE"),
1405
+ carPlateNumber: z.string(),
1406
+ parkingNumber: z.string().nullish()
1407
+ }),
1408
+ z.object({
1409
+ type: z.literal("DINEIN"),
1410
+ tableNumber: z.string()
1411
+ })
1412
+ ]);
1413
+ const orderFulfillmentOutputSchema = z.discriminatedUnion("type", [
1414
+ z.object({
1415
+ type: z.literal("DELIVERY"),
1416
+ state: z.enum(orderFulfillmentStateValues),
1417
+ coordinates: z.object({
1418
+ latitude: z.number(),
1419
+ longitude: z.number()
1420
+ }),
1421
+ customerAddress: z.string(),
1422
+ duration: z.number(),
1423
+ distance: z.number()
1424
+ }),
1425
+ z.object({
1426
+ type: z.literal("PICKUP"),
1427
+ state: z.enum(orderFulfillmentStateValues)
1428
+ }),
1429
+ z.object({
1430
+ type: z.literal("CURBSIDE"),
1431
+ state: z.enum(orderFulfillmentStateValues),
1432
+ carPlateNumber: z.string(),
1433
+ parkingNumber: z.string().nullish()
1434
+ }),
1435
+ z.object({
1436
+ type: z.literal("DINEIN"),
1437
+ state: z.enum(orderFulfillmentStateValues),
1438
+ tableNumber: z.string()
1439
+ })
1440
+ ]);
1441
+ const orderFulfillmentHistorySchema = z.object({
1442
+ id: z.string(),
1443
+ fulfillmentId: z.string(),
1444
+ oldState: z.enum(orderFulfillmentStateValues).nullish(),
1445
+ newState: z.enum(orderFulfillmentStateValues),
1446
+ version: z.number(),
1447
+ createdAt: z.date()
1448
+ });
1449
+ const orderModifierSchema = z.object({
1450
+ id: z.string(),
1451
+ quantity: z.number()
1452
+ });
1453
+ const orderLineItemInputSchema = z.object({
1454
+ variationId: z.string(),
1455
+ quantity: z.number(),
1456
+ note: z.string().nullish(),
1457
+ modifiers: z.array(orderModifierSchema).nullish()
1458
+ });
1459
+ const orderPromocodeInputSchema = z.object({
1460
+ code: z.string().min(1),
1461
+ promoCodeId: z.uuid().nullish()
1462
+ });
1463
+ const orderLineItemSchema = z.object({
1464
+ id: z.string(),
1465
+ quantity: z.number(),
1466
+ name: translationFieldSchema,
1467
+ variationName: translationFieldSchema,
1468
+ imageUrl: z.string().nullish(),
1469
+ unitPriceAmount: orderAmountSchema,
1470
+ currency: z.string(),
1471
+ modifiers: z.object({
1472
+ id: z.string(),
1473
+ unitPriceAmount: orderAmountSchema,
1474
+ totalAmount: orderAmountSchema,
1475
+ name: translationFieldSchema,
1476
+ quantity: z.number()
1477
+ }).array().nullish(),
1478
+ totalAmount: orderAmountSchema,
1479
+ note: z.string().nullish()
1480
+ });
1481
+ const orderPromocodeSummarySchema = z.object({
1482
+ valid: z.boolean(),
1483
+ code: z.string().nullish(),
1484
+ promoCodeId: z.uuid().nullish(),
1485
+ scope: z.enum(promoCodeScopes).nullish(),
1486
+ discountType: z.enum(promoCodeDiscountTypes).nullish(),
1487
+ discountValue: z.number().nullish(),
1488
+ discountAmount: promoCodeAmountSchema.nullish(),
1489
+ totalAmount: promoCodeAmountSchema.nullish(),
1490
+ originalAmount: promoCodeAmountSchema.nullish(),
1491
+ message: z.string().nullish()
1492
+ });
1493
+ const orderCustomerSchema = z.object({
1494
+ id: z.string(),
1495
+ name: z.string(),
1496
+ email: z.string().nullish(),
1497
+ phoneNumber: z.string().nullish(),
1498
+ emailVerified: z.boolean().default(false),
1499
+ image: z.string().nullish()
1500
+ });
1501
+ const orderSchema = z.object({
1502
+ id: z.string(),
1503
+ locationId: z.string(),
1504
+ merchantId: z.string(),
1505
+ merchantName: translationFieldSchema.nullish(),
1506
+ customerId: z.string().nullish(),
1507
+ customer: orderCustomerSchema.nullish(),
1508
+ lineItems: orderLineItemSchema.array(),
1509
+ fulfillments: orderFulfillmentOutputSchema.array(),
1510
+ paymentMethod: z.enum(paymentMethodIds),
1511
+ taxes: z.object({
1512
+ id: z.string().nullish(),
1513
+ catalogObjectId: z.string().nullish(),
1514
+ name: z.string().nullish(),
1515
+ percentage: z.string().nullish(),
1516
+ type: z.string().nullish(),
1517
+ appliedAmount: orderAmountSchema.nullish(),
1518
+ scope: z.string().nullish(),
1519
+ autoApplied: z.boolean().nullish()
1520
+ }).array().nullish(),
1521
+ discounts: z.object({
1522
+ id: z.string().nullish(),
1523
+ catalogObjectId: z.string().nullish(),
1524
+ name: z.string().nullish(),
1525
+ percentage: z.string().nullish(),
1526
+ appliedAmount: orderAmountSchema.nullish(),
1527
+ type: z.string().nullish(),
1528
+ scope: z.string().nullish()
1529
+ }).array().nullish(),
1530
+ createdAt: z.date(),
1531
+ updatedAt: z.date(),
1532
+ discountAmount: orderAmountSchema.default(0n),
1533
+ subtotalAmount: orderAmountSchema.default(0n),
1534
+ taxAmount: orderAmountSchema.default(0n),
1535
+ serviceChargeAmount: orderAmountSchema.default(0n),
1536
+ tipAmount: orderAmountSchema.default(0n),
1537
+ totalAmount: orderAmountSchema.default(0n),
1538
+ serviceCharges: z.object({
1539
+ name: z.string(),
1540
+ totalAmount: orderAmountSchema.default(0n),
1541
+ appliedAmount: orderAmountSchema.default(0n),
1542
+ calculationPhase: z.string().nullish(),
1543
+ taxable: z.boolean().default(true),
1544
+ scope: z.string().nullish()
1545
+ }).array().default([]),
1546
+ netAmounts: z.object({
1547
+ subtotalAmount: orderAmountSchema.default(0n),
1548
+ taxAmount: orderAmountSchema.default(0n),
1549
+ discountAmount: orderAmountSchema.default(0n),
1550
+ tipAmount: orderAmountSchema.default(0n),
1551
+ serviceChargeAmount: orderAmountSchema.default(0n),
1552
+ totalAmount: orderAmountSchema.default(0n)
1553
+ }),
1554
+ pricingOptions: z.object({
1555
+ autoApplyDiscounts: z.boolean().nullish(),
1556
+ autoApplyTaxes: z.boolean().nullish()
1557
+ }).nullish(),
1558
+ amountDue: orderAmountSchema.nullish(),
1559
+ currency: z.string(),
1560
+ note: z.string().nullish(),
1561
+ metadata: z.record(z.string(), z.any()).nullish(),
1562
+ promocode: orderPromocodeSummarySchema.nullish(),
1563
+ paymentIds: z.array(z.uuid()),
1564
+ source: orderSourceSchema.nullish(),
1565
+ fulfillmentHistory: orderFulfillmentHistorySchema.array().default([])
1566
+ });
1567
+ const orderEntitiesSchema = z.object({ merchantId: z.string() });
1568
+ const orderConfigSchema = z.object({
1569
+ merchantId: z.uuid(),
1570
+ locationId: z.uuid().nullish(),
1571
+ supportedScheduleTypes: z.array(scheduleTypeEnum).min(1),
1572
+ autoCancelAfterMinutes: z.number().int().min(1)
1573
+ });
1574
+ const upsertOrderConfigInputSchema = z.object({
1575
+ merchantId: z.uuid().optional(),
1576
+ locationId: z.uuid().optional(),
1577
+ supportedScheduleTypes: z.array(scheduleTypeEnum).min(1).nullable().optional(),
1578
+ autoCancelAfterMinutes: z.number().int().min(1).nullable().optional()
1579
+ });
1580
+ const getOrderConfigInputSchema = z.object({
1581
+ merchantId: z.string().uuid().optional(),
1582
+ locationId: z.string().uuid().optional()
1583
+ });
1584
+ const createOrderInputSchema = z.object({
1585
+ entities: orderEntitiesSchema,
1586
+ order: z.object({
1587
+ locationId: z.string(),
1588
+ lineItems: z.array(orderLineItemInputSchema),
1589
+ note: z.string().nullish(),
1590
+ fulfillment: orderFulfillmentSchema,
1591
+ paymentMethod: z.enum(paymentMethodIds),
1592
+ metadata: z.record(z.string(), z.any()).nullish(),
1593
+ successUrl: z.string(),
1594
+ promocode: orderPromocodeInputSchema.nullish()
1595
+ })
1596
+ });
1597
+ const orderOutputSchema = z.object({ order: orderSchema });
1598
+ const orderByIdOutputSchema = z.object({
1599
+ id: z.string(),
1600
+ lineItems: z.array(orderLineItemSchema),
1601
+ promocode: orderPromocodeSummarySchema.nullish()
1602
+ });
1603
+ const checkoutResultSchema = z.object({
1604
+ orderId: z.string(),
1605
+ redirectUrl: z.string().nullish()
1606
+ });
1607
+ const updateFulfillmentInputSchema = z.object({
1608
+ orderId: z.string(),
1609
+ status: z.enum(orderFulfillmentStateValues),
1610
+ deliveryProvider: z.enum([
1611
+ "LOCAL",
1612
+ "QMILE",
1613
+ "LEAJLAK",
1614
+ "PARCEL"
1615
+ ]).optional()
1616
+ }).refine((data) => {
1617
+ if (data.deliveryProvider && data.status !== "AWAITING_DELIVERY") return false;
1618
+ return true;
1619
+ }, { message: "deliveryProvider can only be specified when transitioning to AWAITING_DELIVERY" });
1620
+ const getOrderByIdInputSchema = z.object({ orderId: z.string() });
1621
+ const validatePromoCodeForOrderResultSchema = promoCodeValidationResultSchema;
1622
+ const fetchOrderByIdOutputSchema = orderOutputSchema;
1623
+ const orderFilterSchema = baseFilterSchema.extend({
1624
+ merchantId: z.uuid().nullish(),
1625
+ locationId: z.uuid().nullish(),
1626
+ customerId: z.uuid().nullish(),
1627
+ fulfillmentState: z.enum(orderFulfillmentStateValues).nullish(),
1628
+ fulfillmentType: z.enum(orderFulfillmentTypes).nullish(),
1629
+ paymentMethod: z.enum(paymentMethodIds).nullish(),
1630
+ coordinates: z.object({
1631
+ latitude: z.number(),
1632
+ longitude: z.number()
1633
+ }).nullish()
1634
+ });
1635
+ const listOrdersInputSchema = baseListInputSchema(orderFilterSchema);
1636
+ const orderSummarySchema = z.object({
1637
+ id: z.string(),
1638
+ merchantId: z.string(),
1639
+ merchantName: translationFieldSchema.nullish(),
1640
+ locationId: z.string(),
1641
+ customerId: z.string().nullish(),
1642
+ customerName: z.string().nullish(),
1643
+ paymentMethod: z.enum(paymentMethodIds),
1644
+ paymentIds: z.array(z.uuid()),
1645
+ currency: z.string(),
1646
+ totalAmount: orderAmountSchema,
1647
+ discountAmount: orderAmountSchema.nullish(),
1648
+ subtotalAmount: orderAmountSchema.nullish(),
1649
+ taxAmount: orderAmountSchema.nullish(),
1650
+ serviceChargeAmount: orderAmountSchema.nullish(),
1651
+ tipAmount: orderAmountSchema.nullish(),
1652
+ amountDue: orderAmountSchema.nullish(),
1653
+ createdAt: z.date(),
1654
+ updatedAt: z.date(),
1655
+ fulfillmentState: z.enum(orderFulfillmentStateValues).nullish(),
1656
+ fulfillmentType: z.enum(orderFulfillmentTypes).nullish(),
1657
+ source: orderSourceSchema.nullish()
1658
+ });
1659
+ const listOrdersOutputSchema = baseListOutputSchema(orderSummarySchema);
1660
+ const defaultOrderSort = defaultTimeSort;
1661
+
1662
+ //#endregion
1663
+ //#region src/schema/locations.ts
1664
+ const fulfillmentTypeEnum = z$1.enum([
1665
+ "GENERAL",
1666
+ "PICKUP",
1667
+ "DELIVERY",
1668
+ "DINEIN",
1669
+ "CURBSIDE"
1670
+ ]);
1671
+ const locationAddressSchema = z$1.object({
1672
+ addressLine1: z$1.string(),
1673
+ addressLine2: z$1.string().nullish(),
1674
+ country: z$1.string(),
1675
+ city: z$1.string(),
1676
+ state: z$1.string(),
1677
+ zipCode: z$1.string(),
1678
+ coordinates: z$1.object({
1679
+ latitude: z$1.number(),
1680
+ longitude: z$1.number()
1681
+ }).nullish()
1682
+ });
1683
+ const locationMeatSourceSchema = z$1.object({
1684
+ id: z$1.string(),
1685
+ meatType: z$1.string(),
1686
+ butcherName: z$1.string(),
1687
+ contactInformation: z$1.string().nullish()
1688
+ });
1689
+ const locationStatusFilterSchema = z$1.enum([
1690
+ "ACTIVE",
1691
+ "INACTIVE",
1692
+ "TEST",
1693
+ "HIDDEN"
1694
+ ]);
1695
+ const locationFilterSchema = baseFilterSchema.extend({
1696
+ coordinates: z$1.object({
1697
+ latitude: z$1.number(),
1698
+ longitude: z$1.number()
1699
+ }).nullish(),
1700
+ merchantId: z$1.uuid().nullish(),
1701
+ status: z$1.array(locationStatusFilterSchema).min(1).nullish(),
1702
+ type: z$1.enum(["PHYSICAL", "ONLINE"]).nullish(),
1703
+ name: z$1.string().nullish(),
1704
+ slug: z$1.string().nullish(),
1705
+ country: z$1.string().nullish(),
1706
+ city: z$1.string().nullish()
1707
+ });
1708
+ const listLocationsInputSchema = baseListInputSchema(locationFilterSchema);
1709
+ const createAddressInputSchema = locationAddressSchema;
1710
+ const locationListSchema = z$1.object({
1711
+ id: z$1.string(),
1712
+ name: translationFieldSchema,
1713
+ description: translationFieldSchema.nullish(),
1714
+ slug: z$1.string(),
1715
+ merchantId: z$1.string(),
1716
+ logoUrl: z$1.string().nullish(),
1717
+ bannerUrl: z$1.string().nullish()
1718
+ });
1719
+ const amountSchema = z$1.bigint();
1720
+ /**
1721
+ * Provider Strategies:
1722
+ *
1723
+ * - AUTO: Automatically select the best provider based on availability and priority.
1724
+ * The system will try providers in order of priority until one accepts.
1725
+ * This is the default behavior when merchants don't manually select a provider.
1726
+ *
1727
+ * - FALLBACK: Used as backup when AUTO providers are unavailable or busy.
1728
+ * Merchants can configure FALLBACK providers with lower priority that are
1729
+ * only used when primary providers cannot fulfill the delivery.
1730
+ *
1731
+ * - MANUAL: Provider must be manually selected by merchant when accepting the order.
1732
+ * These providers will NOT be automatically selected by the system.
1733
+ * Useful for specialty delivery services or when merchant wants full control.
1734
+ */
1735
+ const providerStrategyEnum = z$1.enum([
1736
+ "AUTO",
1737
+ "FALLBACK",
1738
+ "MANUAL"
1739
+ ]);
1740
+ const createDeliveryWindowInputSchema = z$1.object({
1741
+ dayOfWeek: z$1.enum([
1742
+ "SUN",
1743
+ "MON",
1744
+ "TUE",
1745
+ "WED",
1746
+ "THU",
1747
+ "FRI",
1748
+ "SAT"
1749
+ ]),
1750
+ startTime: z$1.string().regex(/^\d{2}:\d{2}$/, "Format: HH:mm"),
1751
+ endTime: z$1.string().regex(/^\d{2}:\d{2}$/, "Format: HH:mm")
1752
+ });
1753
+ const providerPricingConfigSchema = z$1.object({
1754
+ provider: z$1.enum([
1755
+ "LOCAL",
1756
+ "QMILE",
1757
+ "LEAJLAK",
1758
+ "PARCEL"
1759
+ ]),
1760
+ isEnabled: z$1.boolean().default(true),
1761
+ priority: z$1.number().int().min(0).default(0),
1762
+ strategy: providerStrategyEnum.default("AUTO"),
1763
+ pricing: z$1.object({
1764
+ basePriceAmount: amountSchema,
1765
+ baseDistance: z$1.number().int().min(0),
1766
+ pricePerKmAmount: amountSchema,
1767
+ pricePerMinAmount: amountSchema
1768
+ }).nullable().default(null),
1769
+ serviceChargeId: z$1.uuid().nullable().optional()
1770
+ });
1771
+ const createDeliveryConfigInputSchema = z$1.object({
1772
+ isEnabled: z$1.boolean().default(false),
1773
+ providers: z$1.array(providerPricingConfigSchema).min(1),
1774
+ windows: z$1.array(createDeliveryWindowInputSchema).default([]),
1775
+ minDeliveryAmount: amountSchema.nullish(),
1776
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1).default(["COD", "CARD"])
1777
+ });
1778
+ const deliveryConfigSchema = z$1.object({
1779
+ isEnabled: z$1.boolean(),
1780
+ providers: z$1.array(providerPricingConfigSchema),
1781
+ windows: z$1.array(z$1.object({
1782
+ dayOfWeek: z$1.enum([
1783
+ "SUN",
1784
+ "MON",
1785
+ "TUE",
1786
+ "WED",
1787
+ "THU",
1788
+ "FRI",
1789
+ "SAT"
1790
+ ]),
1791
+ startTime: z$1.string().regex(/^\d{2}:\d{2}$/),
1792
+ endTime: z$1.string().regex(/^\d{2}:\d{2}$/)
1793
+ })),
1794
+ minDeliveryAmount: amountSchema.nullish(),
1795
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1)
1796
+ });
1797
+ const addProviderInputSchema = z$1.object({
1798
+ locationId: z$1.uuid(),
1799
+ provider: providerPricingConfigSchema
1800
+ });
1801
+ const removeProviderInputSchema = z$1.object({
1802
+ locationId: z$1.uuid(),
1803
+ provider: z$1.enum([
1804
+ "LOCAL",
1805
+ "QMILE",
1806
+ "LEAJLAK",
1807
+ "PARCEL"
1808
+ ])
1809
+ });
1810
+ const updateProviderInputSchema = z$1.object({
1811
+ locationId: z$1.uuid(),
1812
+ provider: z$1.enum([
1813
+ "LOCAL",
1814
+ "QMILE",
1815
+ "LEAJLAK",
1816
+ "PARCEL"
1817
+ ]),
1818
+ updates: providerPricingConfigSchema.partial()
1819
+ });
1820
+ const themeSchema = z$1.object({
1821
+ colors: z$1.object({
1822
+ "50": z$1.string(),
1823
+ "100": z$1.string(),
1824
+ "200": z$1.string(),
1825
+ "300": z$1.string(),
1826
+ "400": z$1.string(),
1827
+ "500": z$1.string(),
1828
+ "600": z$1.string(),
1829
+ "700": z$1.string(),
1830
+ "800": z$1.string(),
1831
+ "900": z$1.string()
1832
+ }),
1833
+ config: z$1.object({
1834
+ initialColorMode: z$1.enum(["light", "dark"]),
1835
+ useSystemColorMode: z$1.boolean()
1836
+ })
1837
+ });
1838
+ const pickupConfigSchema = z$1.object({
1839
+ isEnabled: z$1.boolean(),
1840
+ preparationTimeMinutes: z$1.number().int().min(0),
1841
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1)
1842
+ });
1843
+ const dineInConfigSchema = z$1.object({
1844
+ isEnabled: z$1.boolean(),
1845
+ numberOfTables: z$1.number().int().min(0),
1846
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1)
1847
+ });
1848
+ const curbsideSpotSchema = z$1.object({
1849
+ id: z$1.string(),
1850
+ spotLabel: z$1.string(),
1851
+ isOccupied: z$1.boolean(),
1852
+ currentOrderId: z$1.string().nullish()
1853
+ });
1854
+ const curbsideConfigSchema = z$1.object({
1855
+ isEnabled: z$1.boolean(),
1856
+ hasParkingSpots: z$1.boolean(),
1857
+ spots: z$1.array(curbsideSpotSchema).optional(),
1858
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1)
1859
+ });
1860
+ const locationSchema = z$1.object({
1861
+ id: z$1.string(),
1862
+ merchantId: z$1.string(),
1863
+ name: translationFieldSchema,
1864
+ description: translationFieldSchema.nullish(),
1865
+ status: z$1.enum([
1866
+ "ACTIVE",
1867
+ "INACTIVE",
1868
+ "TEST",
1869
+ "HIDDEN"
1870
+ ]),
1871
+ phoneNumber: z$1.string(),
1872
+ businessEmail: z$1.string(),
1873
+ address: locationAddressSchema,
1874
+ businessHours: businessHoursSchema.nullish(),
1875
+ fulfillmentBusinessHours: z$1.record(fulfillmentTypeEnum, businessHoursSchema.nullish()).nullish(),
1876
+ country: z$1.string(),
1877
+ createdAt: z$1.date(),
1878
+ currency: z$1.string(),
1879
+ delivery: deliveryConfigSchema.nullish(),
1880
+ pickup: pickupConfigSchema.nullish(),
1881
+ dinein: dineInConfigSchema.nullish(),
1882
+ curbside: curbsideConfigSchema.nullish(),
1883
+ acceptedFulfillment: z$1.array(fulfillmentTypeEnum),
1884
+ socials: z$1.array(socialBaseSchema),
1885
+ languageCode: z$1.string(),
1886
+ logoUrl: z$1.string().nullish(),
1887
+ backgroundUrl: z$1.string().nullish(),
1888
+ mcc: z$1.string().nullish(),
1889
+ paymentTypes: z$1.enum(["COD", "CARD"]).array(),
1890
+ theme: themeSchema.nullish(),
1891
+ timezone: z$1.string(),
1892
+ type: z$1.string(),
1893
+ meatSources: z$1.array(locationMeatSourceSchema).nullish(),
1894
+ orderConfig: orderConfigSchema
1895
+ });
1896
+ const locationSummarySchema = z$1.object({
1897
+ id: z$1.string(),
1898
+ name: translationFieldSchema,
1899
+ description: translationFieldSchema.nullish(),
1900
+ merchantId: z$1.string(),
1901
+ status: z$1.enum([
1902
+ "ACTIVE",
1903
+ "INACTIVE",
1904
+ "TEST",
1905
+ "HIDDEN"
1906
+ ]),
1907
+ phoneNumber: z$1.string(),
1908
+ businessEmail: z$1.string(),
1909
+ address: locationAddressSchema,
1910
+ businessHours: businessHoursSchema.nullish(),
1911
+ fulfillmentBusinessHours: z$1.record(fulfillmentTypeEnum, businessHoursSchema.nullish()).nullish(),
1912
+ country: z$1.string(),
1913
+ createdAt: z$1.date(),
1914
+ currency: z$1.string(),
1915
+ delivery: deliveryConfigSchema.nullish(),
1916
+ pickup: pickupConfigSchema.nullish(),
1917
+ dinein: dineInConfigSchema.nullish(),
1918
+ curbside: curbsideConfigSchema.nullish(),
1919
+ acceptedFulfillment: z$1.array(fulfillmentTypeEnum),
1920
+ timezone: z$1.string(),
1921
+ languageCode: z$1.string(),
1922
+ logoUrl: z$1.string().nullish(),
1923
+ bannerUrl: z$1.string().nullish(),
1924
+ mcc: z$1.string().nullish(),
1925
+ numberOfTables: z$1.number().default(0),
1926
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array(),
1927
+ theme: themeSchema.nullish(),
1928
+ type: z$1.string(),
1929
+ meatSources: z$1.array(locationMeatSourceSchema).nullish()
1930
+ });
1931
+ const listLocationsOutputSchema = baseListOutputSchema(locationSummarySchema);
1932
+ const defaultLocationSort = defaultTimeSort;
1933
+ const createLocationInputSchema = z$1.object({
1934
+ name: translationFieldSchema.optional(),
1935
+ slug: z$1.string().nullish(),
1936
+ phoneNumber: z$1.string().nullish(),
1937
+ description: translationFieldSchema.nullish(),
1938
+ type: z$1.enum(["PHYSICAL", "ONLINE"]).default("PHYSICAL"),
1939
+ status: locationStatusFilterSchema.default("INACTIVE"),
1940
+ address: createAddressInputSchema.nullish(),
1941
+ merchantId: z$1.string().nullish()
1942
+ });
1943
+ const updateLocationInputSchema = createLocationInputSchema.partial();
1944
+ const locationIdInputSchema = z$1.object({ locationId: z$1.string() });
1945
+ const createAddressForLocationInputSchema = z$1.object({
1946
+ locationId: z$1.string(),
1947
+ address: createAddressInputSchema
1948
+ });
1949
+ const createDeliveryConfigForLocationInputSchema = z$1.object({
1950
+ locationId: z$1.string(),
1951
+ config: createDeliveryConfigInputSchema
1952
+ });
1953
+ const locationMutationOutputSchema = z$1.object({ id: z$1.string() });
1954
+ const upsertLocationThemeInputSchema = z$1.object({
1955
+ locationId: z$1.uuid(),
1956
+ theme: themeSchema
1957
+ });
1958
+ const removeLocationThemeInputSchema = z$1.object({ locationId: z$1.uuid() });
1959
+ const upsertDineInInputSchema = z$1.object({
1960
+ locationId: z$1.uuid(),
1961
+ dinein: dineInConfigSchema.partial().extend({
1962
+ windows: z$1.array(businessHoursPeriodSchema).optional(),
1963
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1).optional()
1964
+ })
1965
+ });
1966
+ const upsertDeliveryInputSchema = z$1.object({
1967
+ locationId: z$1.uuid(),
1968
+ delivery: createDeliveryConfigInputSchema.partial()
1969
+ });
1970
+ const removeDeliveryInputSchema = z$1.object({ locationId: z$1.uuid() });
1971
+ const updateDeliveryConfigInputSchema = z$1.object({
1972
+ locationId: z$1.uuid(),
1973
+ isEnabled: z$1.boolean().optional(),
1974
+ windows: z$1.array(createDeliveryWindowInputSchema).optional()
1975
+ });
1976
+ const upsertPickupInputSchema = z$1.object({
1977
+ locationId: z$1.uuid(),
1978
+ pickup: pickupConfigSchema.partial().extend({
1979
+ windows: z$1.array(businessHoursPeriodSchema).optional(),
1980
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1).optional()
1981
+ })
1982
+ });
1983
+ const upsertCurbsideInputSchema = z$1.object({
1984
+ locationId: z$1.uuid(),
1985
+ curbside: curbsideConfigSchema.omit({
1986
+ spots: true,
1987
+ hasParkingSpots: true
1988
+ }).partial().extend({
1989
+ windows: z$1.array(businessHoursPeriodSchema).optional(),
1990
+ acceptedPayments: z$1.enum(["COD", "CARD"]).array().min(1).optional()
1991
+ })
1992
+ });
1993
+ const addCurbsideSpotInputSchema = z$1.object({
1994
+ locationId: z$1.uuid(),
1995
+ spotLabel: z$1.string()
1996
+ });
1997
+ const removeCurbsideSpotInputSchema = z$1.object({
1998
+ locationId: z$1.uuid(),
1999
+ spotId: z$1.string()
2000
+ });
2001
+ const uploadLocationPhotoInputSchema = z$1.object({
2002
+ locationId: z$1.uuid(),
2003
+ photo: z$1.instanceof(File)
2004
+ });
2005
+ const uploadLocationBannerInputSchema = z$1.object({
2006
+ locationId: z$1.uuid(),
2007
+ banner: z$1.instanceof(File)
2008
+ });
2009
+ const uploadLocationPhotoOutputSchema = z$1.object({ photoUrl: z$1.string().nullable() });
2010
+ const uploadLocationBannerOutputSchema = z$1.object({ bannerUrl: z$1.string().nullable() });
2011
+ /**
2012
+ * List WhatsApp groups available on the merchant's connected account
2013
+ */
2014
+ const listAvailableWhatsAppGroupsInputSchema = z$1.object({ merchantId: z$1.string().uuid() });
2015
+ const availableWhatsAppGroupSchema = z$1.object({
2016
+ id: z$1.string(),
2017
+ name: z$1.string().nullable(),
2018
+ imgUrl: z$1.string().nullable()
2019
+ });
2020
+ const listAvailableWhatsAppGroupsOutputSchema = z$1.object({ groups: z$1.array(availableWhatsAppGroupSchema) });
2021
+ /**
2022
+ * List WhatsApp groups linked to a specific location
2023
+ */
2024
+ const listLocationWhatsAppGroupsInputSchema = z$1.object({ locationId: z$1.string().uuid() });
2025
+ const locationWhatsAppGroupSchema = z$1.object({
2026
+ id: z$1.string().uuid(),
2027
+ groupJid: z$1.string(),
2028
+ groupName: z$1.string(),
2029
+ isActive: z$1.boolean(),
2030
+ createdAt: z$1.date(),
2031
+ participantCount: z$1.number().optional()
2032
+ });
2033
+ const listLocationWhatsAppGroupsOutputSchema = z$1.object({ groups: z$1.array(locationWhatsAppGroupSchema) });
2034
+ /**
2035
+ * Create a new WhatsApp group and link to location
2036
+ */
2037
+ const createWhatsAppGroupInputSchema = z$1.object({
2038
+ locationId: z$1.string().uuid(),
2039
+ groupName: z$1.string().min(1).max(100).optional()
2040
+ });
2041
+ const createWhatsAppGroupOutputSchema = z$1.object({
2042
+ id: z$1.string().uuid(),
2043
+ groupJid: z$1.string(),
2044
+ groupName: z$1.string()
2045
+ });
2046
+ /**
2047
+ * Link an existing WhatsApp group to a location
2048
+ */
2049
+ const linkWhatsAppGroupInputSchema = z$1.object({
2050
+ locationId: z$1.string().uuid(),
2051
+ groupJid: z$1.string().regex(/^[0-9-]+@g\.us$/, "Invalid group JID format"),
2052
+ groupName: z$1.string().min(1).max(100)
2053
+ });
2054
+ const linkWhatsAppGroupOutputSchema = createWhatsAppGroupOutputSchema;
2055
+ /**
2056
+ * Update WhatsApp group settings
2057
+ */
2058
+ const updateWhatsAppGroupInputSchema = z$1.object({
2059
+ locationId: z$1.string().uuid(),
2060
+ groupId: z$1.string().uuid(),
2061
+ groupName: z$1.string().min(1).max(100).optional(),
2062
+ isActive: z$1.boolean().optional()
2063
+ });
2064
+ /**
2065
+ * Delete WhatsApp group
2066
+ */
2067
+ const deleteWhatsAppGroupInputSchema = z$1.object({
2068
+ locationId: z$1.string().uuid(),
2069
+ groupId: z$1.string().uuid()
2070
+ });
2071
+ /**
2072
+ * Upsert business hours for a fulfillment type
2073
+ * Supports all fulfillment types: PICKUP, DELIVERY, DINEIN, CURBSIDE
2074
+ */
2075
+ const upsertFulfillmentBusinessHoursInputSchema = z$1.object({
2076
+ locationId: z$1.uuid(),
2077
+ fulfillmentType: fulfillmentTypeEnum,
2078
+ periods: z$1.array(businessHoursPeriodSchema)
2079
+ });
2080
+ /**
2081
+ * Delete business hours for a fulfillment type
2082
+ */
2083
+ const deleteFulfillmentBusinessHoursInputSchema = z$1.object({
2084
+ locationId: z$1.uuid(),
2085
+ fulfillmentType: fulfillmentTypeEnum
2086
+ });
2087
+ /**
2088
+ * Output for business hours operations
2089
+ */
2090
+ const fulfillmentBusinessHoursOutputSchema = z$1.object({
2091
+ businessHoursId: z$1.string().uuid(),
2092
+ fulfillmentType: fulfillmentTypeEnum,
2093
+ periods: z$1.array(businessHoursPeriodSchema)
2094
+ });
2095
+ /**
2096
+ * Upsert business hours for a location (fulfillmentType = GENERAL)
2097
+ */
2098
+ const upsertLocationBusinessHoursInputSchema = z$1.object({
2099
+ locationId: z$1.uuid(),
2100
+ periods: z$1.array(businessHoursPeriodSchema)
2101
+ });
2102
+ /**
2103
+ * Delete business hours for a location (fulfillmentType = GENERAL)
2104
+ */
2105
+ const deleteLocationBusinessHoursInputSchema = z$1.object({ locationId: z$1.uuid() });
2106
+
2107
+ //#endregion
2108
+ //#region src/schema/merchant-subscriptions.ts
2109
+ const subscriptionPlanSchema = z.object({
2110
+ id: z.uuid(),
2111
+ name: z.string(),
2112
+ description: z.string().nullable(),
2113
+ price: z.bigint(),
2114
+ currency: z.string(),
2115
+ billingPeriodDays: z.number().int(),
2116
+ platformFeeFixedCents: z.bigint(),
2117
+ platformFeePercentage: z.number().int(),
2118
+ capabilities: z.record(z.string(), z.unknown()),
2119
+ isActive: z.boolean(),
2120
+ createdAt: z.date(),
2121
+ updatedAt: z.date()
2122
+ });
2123
+ const createSubscriptionPlanInputSchema = z.object({
2124
+ name: z.string().min(1),
2125
+ description: z.string().nullable().optional(),
2126
+ price: z.number().nonnegative(),
2127
+ currency: z.string().default("SAR"),
2128
+ billingPeriodDays: z.number().int().positive(),
2129
+ platformFeeFixedCents: z.number().int().nonnegative().default(0),
2130
+ platformFeePercentage: z.number().int().nonnegative().default(0),
2131
+ capabilities: z.object({
2132
+ maxLocations: z.number().nullable().optional(),
2133
+ orderFeePercentage: z.number().nullable().optional(),
2134
+ allowedPaymentMethods: z.array(z.string()).optional(),
2135
+ canBeActive: z.boolean().optional(),
2136
+ canBeHidden: z.boolean().optional()
2137
+ }).passthrough(),
2138
+ isActive: z.boolean().default(true)
2139
+ });
2140
+ const updateSubscriptionPlanInputSchema = z.object({
2141
+ name: z.string().min(1).optional(),
2142
+ description: z.string().nullable().optional(),
2143
+ price: z.number().nonnegative().optional(),
2144
+ currency: z.string().optional(),
2145
+ billingPeriodDays: z.number().int().positive().optional(),
2146
+ platformFeeFixedCents: z.number().int().nonnegative().optional(),
2147
+ platformFeePercentage: z.number().int().nonnegative().optional(),
2148
+ capabilities: z.object({
2149
+ maxLocations: z.number().nullable().optional(),
2150
+ orderFeePercentage: z.number().nullable().optional(),
2151
+ allowedPaymentMethods: z.array(z.string()).optional(),
2152
+ canBeActive: z.boolean().optional(),
2153
+ canBeHidden: z.boolean().optional()
2154
+ }).passthrough().optional(),
2155
+ isActive: z.boolean().optional()
2156
+ });
2157
+ const merchantSubscriptionSchema = z.object({
2158
+ id: z.uuid(),
2159
+ merchantId: z.uuid(),
2160
+ planId: z.uuid(),
2161
+ status: z.enum([
2162
+ "PENDING",
2163
+ "ACTIVE",
2164
+ "EXPIRED",
2165
+ "CANCELLED"
2166
+ ]),
2167
+ startDate: z.date().nullable(),
2168
+ endDate: z.date().nullable(),
2169
+ autoRenew: z.boolean(),
2170
+ metadata: z.record(z.string(), z.unknown()).nullable(),
2171
+ createdAt: z.date(),
2172
+ updatedAt: z.date()
2173
+ });
2174
+ const merchantInvoiceSchema = z.object({
2175
+ id: z.uuid(),
2176
+ merchantId: z.uuid(),
2177
+ subscriptionId: z.uuid().nullable(),
2178
+ planId: z.uuid().nullable(),
2179
+ amount: z.bigint(),
2180
+ currency: z.string(),
2181
+ status: z.enum([
2182
+ "DRAFT",
2183
+ "PENDING",
2184
+ "PAID",
2185
+ "FAILED",
2186
+ "CANCELLED"
2187
+ ]),
2188
+ dueDate: z.date().nullable(),
2189
+ paidAt: z.date().nullable(),
2190
+ externalProvider: z.string().nullable(),
2191
+ externalInvoiceId: z.string().nullable(),
2192
+ externalInvoiceUrl: z.string().nullable(),
2193
+ paymentUrl: z.string().nullable(),
2194
+ moyasarInvoiceId: z.string().nullable(),
2195
+ metadata: z.record(z.string(), z.unknown()).nullable(),
2196
+ createdAt: z.date(),
2197
+ updatedAt: z.date()
2198
+ });
2199
+ const createMerchantInvoiceInputSchema = z.object({
2200
+ merchantId: z.uuid(),
2201
+ planId: z.uuid(),
2202
+ subscriptionId: z.uuid().optional(),
2203
+ amount: z.number().positive().optional(),
2204
+ dueDate: z.date().optional()
2205
+ });
2206
+ const sendMerchantInvoiceInputSchema = z.object({
2207
+ merchantId: z.uuid(),
2208
+ invoiceId: z.uuid()
2209
+ });
2210
+
2211
+ //#endregion
2212
+ //#region src/schema/message-templates.ts
2213
+ const messageTemplateProviderEnum = [
2214
+ "whatsapp",
2215
+ "email",
2216
+ "push",
2217
+ "sms"
2218
+ ];
2219
+ const messageTemplateBaseSchema = z.object({
2220
+ id: z.uuid().nullish(),
2221
+ name: z.string().min(1, "Name is required"),
2222
+ language: z.string().default("ar"),
2223
+ description: z.string().nullish(),
2224
+ provider: z.enum(messageTemplateProviderEnum),
2225
+ template: z.string().min(1, "Template content is required"),
2226
+ isActive: z.boolean().default(true),
2227
+ createdAt: z.date().nullish(),
2228
+ updatedAt: z.date().nullish()
2229
+ });
2230
+ const createMessageTemplateInputSchema = messageTemplateBaseSchema.omit({
2231
+ id: true,
2232
+ createdAt: true,
2233
+ updatedAt: true
2234
+ });
2235
+ const updateMessageTemplateInputSchema = messageTemplateBaseSchema.omit({
2236
+ id: true,
2237
+ createdAt: true,
2238
+ updatedAt: true
2239
+ }).partial();
2240
+ const messageTemplateFilterSchema = baseFilterSchema.extend({
2241
+ name: z.string().nullish(),
2242
+ language: z.string().nullish(),
2243
+ provider: z.enum(messageTemplateProviderEnum).nullish(),
2244
+ isActive: z.boolean().nullish()
2245
+ });
2246
+ const listMessageTemplatesInputSchema = baseListInputSchema(messageTemplateFilterSchema);
2247
+ const messageTemplateByIdInputSchema = z.object({ templateId: z.uuid() });
2248
+ const messageTemplateOutputSchema = messageTemplateBaseSchema;
2249
+ const listMessageTemplatesOutputSchema = baseListOutputSchema(messageTemplateBaseSchema);
2250
+ const defaultMessageTemplateSort = defaultTimeSort;
2251
+ const templateVariableSchema = z.object({
2252
+ name: z.string(),
2253
+ description: z.string(),
2254
+ example: z.string(),
2255
+ type: z.enum([
2256
+ "string",
2257
+ "number",
2258
+ "date",
2259
+ "boolean"
2260
+ ])
2261
+ });
2262
+ const templateVariableCategorySchema = z.object({
2263
+ category: z.string(),
2264
+ description: z.string(),
2265
+ variables: z.array(templateVariableSchema)
2266
+ });
2267
+ const templateHelperSchema = z.object({
2268
+ name: z.string(),
2269
+ description: z.string(),
2270
+ example: z.string(),
2271
+ result: z.string()
2272
+ });
2273
+ const availableTemplateResourcesSchema = z.object({
2274
+ variables: z.array(templateVariableCategorySchema),
2275
+ helpers: z.object({
2276
+ stringHelpers: z.array(templateHelperSchema),
2277
+ formattingHelpers: z.array(templateHelperSchema),
2278
+ conditionalHelpers: z.array(templateHelperSchema),
2279
+ mathHelpers: z.array(templateHelperSchema)
2280
+ })
2281
+ });
2282
+
2283
+ //#endregion
2284
+ //#region src/schema/messages.ts
2285
+ const messageScopeEnum = [
2286
+ "all_merchants",
2287
+ "all_customers",
2288
+ "user_ids"
2289
+ ];
2290
+ const messageProviderEnum = [
2291
+ "push",
2292
+ "whatsapp",
2293
+ "email",
2294
+ "sms",
2295
+ "wasenderapi"
2296
+ ];
2297
+ const baseMessageFields = z.object({
2298
+ providers: z.array(z.enum(messageProviderEnum)).min(1),
2299
+ subject: z.string().optional(),
2300
+ templateData: z.record(z.string(), z.unknown()).optional()
2301
+ });
2302
+ const messageWithUserIds = baseMessageFields.extend({
2303
+ scope: z.literal("user_ids"),
2304
+ userIds: z.array(z.string()).min(1)
2305
+ });
2306
+ const messageWithoutUserIds = baseMessageFields.extend({ scope: z.enum(["all_merchants", "all_customers"]) });
2307
+ const sendMessageInputSchema = z.union([
2308
+ messageWithUserIds.extend({
2309
+ templateSource: z.literal("saved"),
2310
+ templateId: z.uuid()
2311
+ }),
2312
+ messageWithoutUserIds.extend({
2313
+ templateSource: z.literal("saved"),
2314
+ templateId: z.uuid()
2315
+ }),
2316
+ messageWithUserIds.extend({
2317
+ templateSource: z.literal("inline"),
2318
+ inlineTemplate: z.string().min(1)
2319
+ }),
2320
+ messageWithoutUserIds.extend({
2321
+ templateSource: z.literal("inline"),
2322
+ inlineTemplate: z.string().min(1)
2323
+ })
2324
+ ]);
2325
+ const sendMessageOutputSchema = z.object({
2326
+ success: z.boolean(),
2327
+ sentCount: z.number(),
2328
+ failedCount: z.number()
2329
+ });
2330
+ /**
2331
+ * SMS provider enum for balance and cost calculations
2332
+ */
2333
+ const smsProviderEnum = ["msegat"];
2334
+ /**
2335
+ * Input schema for getting SMS balance
2336
+ */
2337
+ const getSmsBalanceInputSchema = z.object({ provider: z.enum(smsProviderEnum) });
2338
+ /**
2339
+ * Output schema for SMS balance response
2340
+ */
2341
+ const getSmsBalanceOutputSchema = z.object({
2342
+ provider: z.string(),
2343
+ balance: z.string(),
2344
+ success: z.boolean()
2345
+ });
2346
+ /**
2347
+ * Input schema for calculating SMS cost
2348
+ */
2349
+ const calculateSmsCostInputSchema = z.object({
2350
+ provider: z.enum(smsProviderEnum),
2351
+ message: z.string().min(1)
2352
+ });
2353
+ /**
2354
+ * Output schema for SMS cost response
2355
+ */
2356
+ const calculateSmsCostOutputSchema = z.object({
2357
+ provider: z.string(),
2358
+ messageCount: z.string(),
2359
+ success: z.boolean()
2360
+ });
2361
+ /**
2362
+ * Recipient schema for direct message sending
2363
+ */
2364
+ const recipientSchema = z.object({
2365
+ provider: z.enum(messageProviderEnum),
2366
+ userId: z.string().min(1)
2367
+ });
2368
+ /**
2369
+ * Input schema for direct message sending (generic send message API)
2370
+ */
2371
+ const sendDirectMessageInputSchema = z.object({
2372
+ recipients: z.array(recipientSchema).min(1),
2373
+ subject: z.string().optional(),
2374
+ message: z.string().min(1)
2375
+ });
2376
+ /**
2377
+ * Output schema for direct message sending
2378
+ */
2379
+ const sendDirectMessageOutputSchema = z.object({
2380
+ success: z.boolean(),
2381
+ sentCount: z.number(),
2382
+ failedCount: z.number()
2383
+ });
2384
+
2385
+ //#endregion
2386
+ //#region src/schema/payments.ts
2387
+ const gatewayIds = paymentGatewayIds;
2388
+ const paymentStatuses = [
2389
+ "INITIATED",
2390
+ "PAID",
2391
+ "AUTHORIZED",
2392
+ "FAILED",
2393
+ "REFUNDED",
2394
+ "CAPTURED",
2395
+ "VOIDED",
2396
+ "VERIFIED"
2397
+ ];
2398
+ const initiatePaymentInputSchema = z.object({
2399
+ entities: z.object({
2400
+ merchantId: z.string(),
2401
+ customerId: z.string()
2402
+ }),
2403
+ payment: z.object({
2404
+ method: z.enum(paymentMethodIds),
2405
+ orderId: z.string(),
2406
+ amount: z.number(),
2407
+ currency: z.string(),
2408
+ description: z.string(),
2409
+ language: z.string(),
2410
+ metadata: z.record(z.string(), z.unknown()),
2411
+ success_url: z.string()
2412
+ }),
2413
+ metadata: z.record(z.string(), z.unknown()).nullish()
2414
+ });
2415
+ const initiatePaymentOutputSchema = z.object({ url: z.string() });
2416
+ const paymentSourceSchema = z.object({
2417
+ type: z.string().optional(),
2418
+ company: z.string().optional(),
2419
+ entryMethod: z.string().optional(),
2420
+ card: z.object({
2421
+ bin: z.string().optional(),
2422
+ expMonth: z.number().optional(),
2423
+ expYear: z.number().optional(),
2424
+ fingerprint: z.string().optional(),
2425
+ last4: z.string().optional()
2426
+ }).optional(),
2427
+ digitalWalletDetails: z.object({
2428
+ type: z.string().optional(),
2429
+ brand: z.string().optional(),
2430
+ applicationDetails: z.unknown().optional()
2431
+ }).optional(),
2432
+ receivedMoney: z.unknown().optional(),
2433
+ changeMoney: z.unknown().optional()
2434
+ });
2435
+ const recordPaymentInputSchema = z.object({
2436
+ merchantId: z.string(),
2437
+ orderId: z.string(),
2438
+ payment: z.object({
2439
+ paymentId: z.string(),
2440
+ amount: z.number(),
2441
+ currency: z.string(),
2442
+ fee: z.number(),
2443
+ status: z.enum(paymentStatuses),
2444
+ gateway: z.enum(gatewayIds).nullable(),
2445
+ source: paymentSourceSchema,
2446
+ metadata: z.unknown(),
2447
+ ip: z.string().optional()
2448
+ })
2449
+ });
2450
+ const refundPaymentInputSchema = z.object({
2451
+ paymentId: z.string(),
2452
+ amount: z.number()
2453
+ });
2454
+ const paymentOutputSchema = z.object({
2455
+ id: z.string(),
2456
+ amount: z.number(),
2457
+ currency: z.string(),
2458
+ fee: z.number(),
2459
+ status: z.enum(paymentStatuses),
2460
+ gateway: z.enum(gatewayIds).nullable(),
2461
+ source: paymentSourceSchema,
2462
+ metadata: z.record(z.string(), z.unknown()).nullish(),
2463
+ ip: z.string().nullish(),
2464
+ orderId: z.string().uuid().nullish(),
2465
+ createdAt: z.date(),
2466
+ updatedAt: z.date()
2467
+ });
2468
+ const paymentListItemSchema = z.object({
2469
+ id: z.string(),
2470
+ amount: z.number(),
2471
+ currency: z.string(),
2472
+ fee: z.number(),
2473
+ status: z.enum(paymentStatuses),
2474
+ gateway: z.enum(gatewayIds).nullable(),
2475
+ source: paymentSourceSchema,
2476
+ orderId: z.string().uuid().nullish(),
2477
+ createdAt: z.date()
2478
+ });
2479
+ const paymentFilterSchema = z.object({
2480
+ merchantId: z.uuid().nullish(),
2481
+ orderId: z.uuid().nullish(),
2482
+ status: z.enum(paymentStatuses).nullish(),
2483
+ gateway: z.enum(gatewayIds).nullable().nullish(),
2484
+ startTime: z.coerce.date().nullish(),
2485
+ endTime: z.coerce.date().nullish()
2486
+ });
2487
+ const listPaymentsInputSchema = z.object({
2488
+ pagination: z.object({
2489
+ page: z.number().min(1).default(1),
2490
+ pageSize: z.number().min(1).max(100).default(20)
2491
+ }).optional().default({
2492
+ page: 1,
2493
+ pageSize: 20
2494
+ }),
2495
+ filter: paymentFilterSchema.optional(),
2496
+ sort: z.record(z.string(), z.enum(["asc", "desc"])).optional()
2497
+ });
2498
+ const listPaymentsOutputSchema = z.object({
2499
+ items: z.array(paymentListItemSchema),
2500
+ pagination: z.object({
2501
+ page: z.number(),
2502
+ pageSize: z.number(),
2503
+ totalItems: z.number(),
2504
+ totalPages: z.number()
2505
+ })
2506
+ });
2507
+ const getPaymentInputSchema = z.object({ paymentId: z.uuid() });
2508
+ const refundOrderInputSchema = z.object({
2509
+ orderId: z.uuid(),
2510
+ amount: z.number().optional()
2511
+ });
2512
+ const refundOrderOutputSchema = z.object({
2513
+ orderId: z.string(),
2514
+ refundInitiated: z.boolean(),
2515
+ paymentIds: z.array(z.string()),
2516
+ message: z.string()
2517
+ });
2518
+
2519
+ //#endregion
2520
+ //#region src/schema/payouts.ts
2521
+ const payoutStatusSchema = z.enum([
2522
+ "PENDING",
2523
+ "QUEUED",
2524
+ "PROCESSING",
2525
+ "PAID",
2526
+ "FAILED",
2527
+ "CANCELLED"
2528
+ ]);
2529
+ const payoutProviderSchema = z.enum(["ANB"]);
2530
+ const bankAccountSchema = z.object({
2531
+ id: z.string().uuid(),
2532
+ merchantId: z.string().uuid(),
2533
+ locationId: z.string().uuid().nullable(),
2534
+ bicCode: z.string(),
2535
+ accountNumber: z.string(),
2536
+ accountHolderName: z.string(),
2537
+ createdAt: z.date(),
2538
+ updatedAt: z.date()
2539
+ });
2540
+ const createPayoutInputSchema = z.object({
2541
+ locationId: z.string().uuid(),
2542
+ windowStartAt: z.date(),
2543
+ windowEndAt: z.date(),
2544
+ provider: payoutProviderSchema.optional(),
2545
+ idempotencyKey: z.string().optional()
2546
+ });
2547
+ const payoutSchema = z.object({
2548
+ id: z.string().uuid(),
2549
+ locationId: z.string().uuid(),
2550
+ merchantId: z.string().uuid(),
2551
+ bankAccountId: z.string().uuid(),
2552
+ companyPayoutAccountId: z.string().uuid(),
2553
+ status: payoutStatusSchema,
2554
+ provider: payoutProviderSchema,
2555
+ amount: z.bigint(),
2556
+ currency: z.string(),
2557
+ windowStartAt: z.date(),
2558
+ windowEndAt: z.date(),
2559
+ grossAmount: z.bigint(),
2560
+ platformFee: z.bigint(),
2561
+ gatewayFee: z.bigint(),
2562
+ netAmount: z.bigint(),
2563
+ providerMetadata: z.record(z.string(), z.unknown()).nullable(),
2564
+ createdAt: z.date(),
2565
+ updatedAt: z.date(),
2566
+ processedAt: z.date().nullable(),
2567
+ paidAt: z.date().nullable()
2568
+ });
2569
+ const listPayoutsInputSchema = z.object({
2570
+ locationId: z.string().uuid().optional(),
2571
+ merchantId: z.string().uuid().optional(),
2572
+ status: payoutStatusSchema.optional(),
2573
+ page: z.number().int().positive().optional(),
2574
+ pageSize: z.number().int().positive().max(100).optional()
2575
+ });
2576
+ const listPayoutsOutputSchema = z.object({
2577
+ items: z.array(z.object({
2578
+ id: z.string().uuid(),
2579
+ locationId: z.string().uuid(),
2580
+ merchantId: z.string().uuid(),
2581
+ status: payoutStatusSchema,
2582
+ amount: z.bigint(),
2583
+ netAmount: z.bigint(),
2584
+ currency: z.string(),
2585
+ windowStartAt: z.date(),
2586
+ windowEndAt: z.date(),
2587
+ createdAt: z.date(),
2588
+ processedAt: z.date().nullable(),
2589
+ paidAt: z.date().nullable()
2590
+ })),
2591
+ total: z.number().int(),
2592
+ page: z.number().int(),
2593
+ pageSize: z.number().int()
2594
+ });
2595
+ const getPayoutInputSchema = z.object({ payoutId: z.string().uuid() });
2596
+ const upsertBankAccountInputSchema = z.object({
2597
+ merchantId: z.string().uuid(),
2598
+ locationId: z.string().uuid().optional(),
2599
+ bicCode: z.string(),
2600
+ accountNumber: z.string(),
2601
+ accountHolderName: z.string()
2602
+ });
2603
+ const getBankAccountInputSchema = z.object({
2604
+ merchantId: z.string().uuid(),
2605
+ locationId: z.string().uuid().optional()
2606
+ });
2607
+ const getBankAccountOutputSchema = z.object({ bankAccount: bankAccountSchema.nullable() });
2608
+ const getEffectiveBankAccountInputSchema = z.object({ locationId: z.string().uuid() });
2609
+ const getEffectiveBankAccountOutputSchema = z.object({ bankAccount: bankAccountSchema.nullable() });
2610
+ const getLocationBalanceInputSchema = z.object({
2611
+ locationId: z.string().uuid(),
2612
+ windowStartAt: z.date().optional(),
2613
+ windowEndAt: z.date().optional()
2614
+ });
2615
+ const locationBalanceSchema = z.object({
2616
+ grossAmount: z.bigint(),
2617
+ gatewayFee: z.bigint(),
2618
+ platformFee: z.bigint(),
2619
+ netAmount: z.bigint()
2620
+ });
2621
+ const unsettledBalanceItemSchema = z.object({
2622
+ paymentId: z.string().uuid(),
2623
+ orderId: z.string().uuid(),
2624
+ grossAmount: z.bigint(),
2625
+ gatewayFee: z.bigint(),
2626
+ platformFee: z.bigint(),
2627
+ netAmount: z.bigint(),
2628
+ createdAt: z.date(),
2629
+ currency: z.string()
2630
+ });
2631
+ const unsettledBalanceSchema = z.object({
2632
+ items: z.array(unsettledBalanceItemSchema),
2633
+ totals: locationBalanceSchema
2634
+ });
2635
+ const getLocationBalanceOutputSchema = z.object({ balance: locationBalanceSchema });
2636
+ const calculatePayoutOutputSchema = z.object({
2637
+ grossAmount: z.bigint(),
2638
+ platformFee: z.bigint(),
2639
+ gatewayFee: z.bigint(),
2640
+ netAmount: z.bigint()
2641
+ });
2642
+ const companyPayoutAccountSchema = z.object({
2643
+ id: z.string().uuid(),
2644
+ accountNumber: z.string(),
2645
+ accountName: z.string(),
2646
+ provider: payoutProviderSchema,
2647
+ isDefault: z.boolean(),
2648
+ createdAt: z.date(),
2649
+ updatedAt: z.date()
2650
+ });
2651
+ const createCompanyPayoutAccountInputSchema = z.object({
2652
+ accountNumber: z.string().min(1),
2653
+ accountName: z.string().min(1),
2654
+ provider: payoutProviderSchema.optional(),
2655
+ isDefault: z.boolean().optional()
2656
+ });
2657
+ const updateCompanyPayoutAccountInputSchema = z.object({
2658
+ id: z.string().uuid(),
2659
+ accountNumber: z.string().min(1).optional(),
2660
+ accountName: z.string().min(1).optional(),
2661
+ isDefault: z.boolean().optional()
2662
+ });
2663
+ const listCompanyPayoutAccountsInputSchema = z.object({ provider: payoutProviderSchema.optional() });
2664
+ const getCompanyPayoutAccountInputSchema = z.object({ id: z.string().uuid() });
2665
+ const deleteCompanyPayoutAccountInputSchema = z.object({ id: z.string().uuid() });
2666
+
2667
+ //#endregion
2668
+ //#region src/schema/payouts-report.ts
2669
+ /**
2670
+ * Input schema for payout report
2671
+ */
2672
+ const payoutReportInputSchema = z.object({
2673
+ startDate: z.date(),
2674
+ endDate: z.date(),
2675
+ locationIds: z.array(z.string().uuid()).optional(),
2676
+ statusFilter: z.enum([
2677
+ "completed",
2678
+ "canceled",
2679
+ "refunded",
2680
+ "all"
2681
+ ]).optional().default("all"),
2682
+ fulfillmentTypes: z.array(z.enum(orderFulfillmentTypes)).optional(),
2683
+ timezone: z.string().optional()
2684
+ });
2685
+ /**
2686
+ * Payment schema for payout report
2687
+ */
2688
+ const payoutReportPaymentSchema = z.object({
2689
+ id: z.string().uuid(),
2690
+ method: z.enum(paymentMethodIds),
2691
+ gateway: z.enum(paymentGatewayIds).nullable(),
2692
+ amount: z.bigint(),
2693
+ fee: z.bigint(),
2694
+ status: z.enum([
2695
+ "INITIATED",
2696
+ "PAID",
2697
+ "AUTHORIZED",
2698
+ "FAILED",
2699
+ "REFUNDED",
2700
+ "CAPTURED",
2701
+ "VOIDED",
2702
+ "VERIFIED"
2703
+ ]),
2704
+ reference: z.string().nullable(),
2705
+ processedAt: z.date()
2706
+ });
2707
+ /**
2708
+ * Fulfillment schema for payout report (single object, not array)
2709
+ */
2710
+ const payoutReportFulfillmentSchema = z.object({
2711
+ type: z.enum(orderFulfillmentTypes),
2712
+ status: z.enum(orderFulfillmentStateValues),
2713
+ pickupOrDeliveryTime: z.date().nullable(),
2714
+ notes: z.string().nullable()
2715
+ });
2716
+ /**
2717
+ * Order schema for payout report
2718
+ */
2719
+ const payoutReportOrderSchema = z.object({
2720
+ id: z.string().uuid(),
2721
+ externalId: z.string().nullable(),
2722
+ orderNumber: z.string().nullable(),
2723
+ createdAt: z.date(),
2724
+ closedAt: z.date().nullable(),
2725
+ location: z.object({
2726
+ id: z.string().uuid(),
2727
+ businessName: z.string()
2728
+ }),
2729
+ customer: z.object({
2730
+ id: z.string().uuid(),
2731
+ name: z.string(),
2732
+ email: z.string().nullable(),
2733
+ phoneNumber: z.string().nullable()
2734
+ }).nullable(),
2735
+ status: z.enum(orderFulfillmentStateValues),
2736
+ fulfillment: payoutReportFulfillmentSchema.nullable(),
2737
+ subtotal: z.bigint(),
2738
+ discounts: z.bigint(),
2739
+ tax: z.bigint(),
2740
+ tip: z.bigint(),
2741
+ totalAmount: z.bigint(),
2742
+ platformFee: z.bigint(),
2743
+ paymentFee: z.bigint(),
2744
+ netPayout: z.bigint(),
2745
+ payments: z.array(payoutReportPaymentSchema)
2746
+ });
2747
+ /**
2748
+ * Overall totals schema
2749
+ */
2750
+ const payoutReportOverallSchema = z.object({
2751
+ totalRevenue: z.bigint(),
2752
+ totalPlatformFee: z.bigint(),
2753
+ totalPaymentFee: z.bigint(),
2754
+ totalNetPayout: z.bigint(),
2755
+ orderCount: z.number().int(),
2756
+ onlinePaymentCount: z.number().int(),
2757
+ cashPaymentCount: z.number().int()
2758
+ });
2759
+ /**
2760
+ * Summary KPIs schema
2761
+ */
2762
+ const payoutReportSummarySchema = z.object({
2763
+ byFulfillmentType: z.array(z.object({
2764
+ type: z.enum(orderFulfillmentTypes),
2765
+ orderCount: z.number().int(),
2766
+ revenue: z.bigint()
2767
+ })),
2768
+ byStatus: z.object({
2769
+ completedCount: z.number().int(),
2770
+ canceledCount: z.number().int(),
2771
+ refundedCount: z.number().int(),
2772
+ otherCount: z.number().int()
2773
+ }),
2774
+ byPaymentMethod: z.array(z.object({
2775
+ method: z.enum(paymentMethodIds),
2776
+ orderCount: z.number().int(),
2777
+ revenue: z.bigint(),
2778
+ paymentFee: z.bigint()
2779
+ })),
2780
+ dailyTrend: z.array(z.object({
2781
+ date: z.date(),
2782
+ orderCount: z.number().int(),
2783
+ revenue: z.bigint(),
2784
+ netPayout: z.bigint()
2785
+ })),
2786
+ averageOrderValue: z.bigint(),
2787
+ topItems: z.array(z.object({
2788
+ itemId: z.string().uuid(),
2789
+ name: z.string(),
2790
+ quantity: z.number().int(),
2791
+ revenue: z.bigint()
2792
+ })).optional()
2793
+ });
2794
+ /**
2795
+ * Output schema for payout report
2796
+ */
2797
+ const payoutReportOutputSchema = z.object({
2798
+ overall: payoutReportOverallSchema,
2799
+ summary: payoutReportSummarySchema,
2800
+ orders: z.array(payoutReportOrderSchema)
2801
+ });
2802
+
2803
+ //#endregion
2804
+ export { messageScopeEnum as $, getCategoryInputSchema as $a, merchantCustomerBaseSchema as $i, orderLineItemInputSchema as $n, bannerListOutputSchema as $o, createSocialInputSchema as $r, listLocationsInputSchema as $t, unsettledBalanceSchema as A, createImageOutputSchema as Aa, createCustomerManualInputSchema as Ai, upsertLocationBusinessHoursInputSchema as An, updateModifierInputSchema as Ao, paymentMethodIds as Ar, createAddressInputSchema as At, paymentListItemSchema as B, deleteCategoryOutputSchema as Ba, customerFilterSchema as Bi, listOrdersOutputSchema as Bn, upsertModifierDefaultLocationOverrideInputSchema as Bo, listMerchantsOutputSchema as Br, deleteFulfillmentBusinessHoursInputSchema as Bt, listPayoutsInputSchema as C, catalogSelectionTypeValues as Ca, bulkCustomerExportRowSchema as Ci, uploadLocationBannerOutputSchema as Cn, unlinkItemWithCategoryInputSchema as Co, promoCodeOutputSchema as Cr, sendMerchantInvoiceInputSchema as Ct, payoutSchema as D, createCategoryInputSchema as Da, bulkCustomerImportRowClientSchema as Di, upsertDeliveryInputSchema as Dn, updateCategoryOutputSchema as Do, updatePromoCodeInputSchema as Dr, addProviderInputSchema as Dt, payoutProviderSchema as E, catalogVariationWithDefaultSchema as Ea, bulkCustomerImportResultSchema as Ei, upsertCurbsideInputSchema as En, updateCategoryInputSchema as Eo, promoCodeValidationResultSchema as Er, addCurbsideSpotInputSchema as Et, initiatePaymentInputSchema as F, createModifierListOutputSchema as Fa, customerAddressByIdInputSchema as Fi, defaultOrderSort as Fn, updateVariationOutputSchema as Fo, createMerchantLegalDetailsInputSchema as Fr, createWhatsAppGroupInputSchema as Ft, refundOrderInputSchema as G, deleteModifierListOutputSchema as Ga, deleteCustomerInputSchema as Gi, orderEntitiesSchema as Gn, upsertVariationLocationOverrideInputSchema as Go, merchantIntegrationSchema as Gr, fulfillmentBusinessHoursOutputSchema as Gt, paymentSourceSchema as H, deleteItemOutputSchema as Ha, defaultCustomerAddressSort as Hi, orderByIdOutputSchema as Hn, upsertModifierLocationOverrideInputSchema as Ho, merchantFilterSchema as Hr, deleteWhatsAppGroupInputSchema as Ht, initiatePaymentOutputSchema as I, createModifierOutputSchema as Ia, customerAddressFilterSchema as Ii, fetchOrderByIdOutputSchema as In, uploadCatalogItemPhotoInputSchema as Io, createMerchantOutputSchema as Ir, createWhatsAppGroupOutputSchema as It, calculateSmsCostInputSchema as J, deleteModifierOverrideOutputSchema as Ja, listCustomerAddressesOutputSchema as Ji, orderFulfillmentOutputSchema as Jn, businessHoursSchema as Jo, merchantSummarySchema as Jr, linkWhatsAppGroupOutputSchema as Jt, refundOrderOutputSchema as K, deleteModifierOutputSchema as Ka, deleteMerchantCustomerInputSchema as Ki, orderFilterSchema as Kn, translationFieldSchema as Ko, merchantLegalDetailsSchema as Kr, fulfillmentTypeEnum as Kt, listPaymentsInputSchema as L, createVariationInputSchema as La, customerAddressOutputSchema as Li, getOrderByIdInputSchema as Ln, uploadCatalogItemPhotoOutputSchema as Lo, linkSquareIntegrationInputSchema as Lr, curbsideConfigSchema as Lt, upsertBankAccountInputSchema as M, createItemOutputSchema as Ma, createMerchantCustomerManualInputSchema as Mi, upsertPickupInputSchema as Mn, updateModifierListOutputSchema as Mo, createLeadForAdminOutputSchema as Mr, createDeliveryConfigInputSchema as Mt, gatewayIds as N, createModifierInputSchema as Na, createMerchantCustomerManualOutputSchema as Ni, checkoutResultSchema as Nn, updateModifierOutputSchema as No, preferredContactTimeSchema as Nr, createDeliveryWindowInputSchema as Nt, payoutStatusSchema as O, createCategoryOutputSchema as Oa, bulkCustomerImportRowSchema as Oi, upsertDineInInputSchema as On, updateItemInputSchema as Oo, acceptedPaymentIds as Or, availableWhatsAppGroupSchema as Ot, getPaymentInputSchema as P, createModifierListInputSchema as Pa, customerAddressBaseSchema as Pi, createOrderInputSchema as Pn, updateVariationInputSchema as Po, createMerchantInputSchema as Pr, createLocationInputSchema as Pt, messageProviderEnum as Q, getCatalogItemOutputSchema as Qa, listMerchantCustomersOutputSchema as Qi, orderGatewayIds as Qn, bannerIdInputSchema as Qo, uploadVatDocumentInputSchema as Qr, listLocationWhatsAppGroupsOutputSchema as Qt, listPaymentsOutputSchema as R, createVariationOutputSchema as Ra, customerBaseSchema as Ri, getOrderConfigInputSchema as Rn, upsertItemLocationOverrideInputSchema as Ro, linkSquareIntegrationOutputSchema as Rr, curbsideSpotSchema as Rt, listCompanyPayoutAccountsInputSchema as S, catalogPriceRangeSchema as Sa, bulkCustomerExportResultSchema as Si, uploadLocationBannerInputSchema as Sn, mutationIdOutputSchema as So, promoCodeListOutputSchema as Sr, merchantSubscriptionSchema as St, locationBalanceSchema as T, catalogVariationFilterSchema as Ta, bulkCustomerImportInputSchema as Ti, uploadLocationPhotoOutputSchema as Tn, unlinkItemWithModifierListInputSchema as To, promoCodeValidationInputSchema as Tr, updateSubscriptionPlanInputSchema as Tt, paymentStatuses as U, deleteModifierInputSchema as Ua, defaultCustomerSort as Ui, orderConfigSchema as Un, upsertModifierOverrideInputSchema as Uo, merchantFullDetailsSchema as Ur, deliveryConfigSchema as Ut, paymentOutputSchema as V, deleteItemInputSchema as Va, customerOutputSchema as Vi, orderAmountSchema as Vn, upsertModifierInputSchema as Vo, merchantBaseSchema as Vr, deleteLocationBusinessHoursInputSchema as Vt, recordPaymentInputSchema as W, deleteModifierListInputSchema as Wa, defaultMerchantCustomerSort as Wi, orderCustomerSchema as Wn, upsertModifierOverrideOutputSchema as Wo, merchantIdInputSchema as Wr, dineInConfigSchema as Wt, getSmsBalanceInputSchema as X, deleteVariationOutputSchema as Xa, listCustomersOutputSchema as Xi, orderFulfillmentStateValues as Xn, activeBannerOutputSchema as Xo, updateMerchantLegalDetailsInputSchema as Xr, listAvailableWhatsAppGroupsOutputSchema as Xt, calculateSmsCostOutputSchema as Y, deleteVariationInputSchema as Ya, listCustomersInputSchema as Yi, orderFulfillmentSchema as Yn, activeBannerListOutputSchema as Yo, merchantSyncEventSchema as Yr, listAvailableWhatsAppGroupsInputSchema as Yt, getSmsBalanceOutputSchema as Z, getCatalogItemInputSchema as Za, listMerchantCustomersInputSchema as Zi, orderFulfillmentTypes as Zn, approveBannerInputSchema as Zo, uploadCrnDocumentInputSchema as Zr, listLocationWhatsAppGroupsInputSchema as Zt, getEffectiveBankAccountInputSchema as _, catalogModifierItemOverrideSchema as _a, discountScopes as _i, themeSchema as _n, listCatalogModifiersInputSchema as _o, promoCodeBaseSchema as _r, templateVariableSchema as _t, payoutReportOverallSchema as a, catalogAvailabilityValues as aa, anbPaymentStatusSchema as ai, locationMeatSourceSchema as an, linkItemWithCategoryInputSchema as ao, orderSchema as ar, placementSchema as as, availableTemplateResourcesSchema as at, getLocationBalanceOutputSchema as b, catalogModifierListFilterSchema as ba, updateDiscountInputSchema as bi, updateProviderInputSchema as bn, listCatalogVariationsOutputSchema as bo, promoCodeFilterSchema as br, createSubscriptionPlanInputSchema as bt, bankAccountSchema as c, catalogCategorySchema as ca, anbSinglePaymentResponseSchema as ci, locationStatusFilterSchema as cn, linkOperationOutputSchema as co, scheduleTypeEnum as cr, baseListInputSchema as cs, listMessageTemplatesInputSchema as ct, createCompanyPayoutAccountInputSchema as d, catalogItemDetailSchema as da, createDiscountInputSchema as di, providerPricingConfigSchema as dn, listCatalogCategoriesWithItemsInputSchema as do, validatePromoCodeForOrderResultSchema as dr, sortDirectionSchema as ds, messageTemplateByIdInputSchema as dt, merchantCustomerByIdInputSchema as ea, socialBaseSchema as ei, listLocationsOutputSchema as en, getCategoryOutputSchema as eo, orderLineItemSchema as er, bannerOutputSchema as es, sendDirectMessageInputSchema as et, createPayoutInputSchema as f, catalogItemFilterSchema as fa, discountAutoApplyScopes as fi, providerStrategyEnum as fn, listCatalogCategoriesWithItemsOutputSchema as fo, createPromoCodeInputSchema as fr, sortSchema as fs, messageTemplateFilterSchema as ft, getCompanyPayoutAccountInputSchema as g, catalogModifierFilterSchema as ga, discountOutputSchema as gi, removeProviderInputSchema as gn, listCatalogModifierListsOutputSchema as go, promoCodeApplicationTargets as gr, templateVariableCategorySchema as gt, getBankAccountOutputSchema as h, catalogModifierDefaultLocationOverrideSchema as ha, discountListOutputSchema as hi, removeLocationThemeInputSchema as hn, listCatalogModifierListsInputSchema as ho, promoCodeAmountSchema as hr, templateHelperSchema as ht, payoutReportOutputSchema as i, catalogAmountSchema as ia, anbPaymentStatusResponseSchema as ii, locationListSchema as in, getModifierOutputSchema as io, orderPromocodeSummarySchema as ir, listBannersInputSchema as is, smsProviderEnum as it, updateCompanyPayoutAccountInputSchema as j, createItemInputSchema as ja, createCustomerManualOutputSchema as ji, upsertLocationThemeInputSchema as jn, updateModifierListInputSchema as jo, createLeadForAdminInputSchema as jr, createDeliveryConfigForLocationInputSchema as jt, unsettledBalanceItemSchema as k, createImageInputSchema as ka, createCustomerAddressInputSchema as ki, upsertFulfillmentBusinessHoursInputSchema as kn, updateItemOutputSchema as ko, paymentGatewayIds as kr, createAddressForLocationInputSchema as kt, calculatePayoutOutputSchema as l, catalogDietaryPreferenceValues as la, anbWebhookPayloadSchema as li, locationWhatsAppGroupSchema as ln, listCatalogCategoriesInputSchema as lo, updateFulfillmentInputSchema as lr, baseListOutputSchema as ls, listMessageTemplatesOutputSchema as lt, getBankAccountInputSchema as m, catalogModifierBaseSchema as ma, discountIdInputSchema as mi, removeDeliveryInputSchema as mn, listCatalogItemsOutputSchema as mo, listPromoCodesInputSchema as mr, messageTemplateProviderEnum as mt, payoutReportInputSchema as n, merchantCustomerOutputSchema as na, socialPlatformsEnum as ni, locationFilterSchema as nn, getModifierListInputSchema as no, orderOutputSchema as nr, createBannerInputSchema as ns, sendMessageInputSchema as nt, payoutReportPaymentSchema as o, catalogCategoryBaseSchema as oa, anbSinglePaymentInitiationResponseSchema as oi, locationMutationOutputSchema as on, linkItemWithImageInputSchema as oo, orderSourceSchema as or, updateBannerInputSchema as os, createMessageTemplateInputSchema as ot, deleteCompanyPayoutAccountInputSchema as p, catalogItemSummarySchema as pa, discountBaseSchema as pi, removeCurbsideSpotInputSchema as pn, listCatalogItemsInputSchema as po, defaultPromoCodeSort as pr, paginationSchema as ps, messageTemplateOutputSchema as pt, refundPaymentInputSchema as q, deleteModifierOverrideInputSchema as qa, listCustomerAddressesInputSchema as qi, orderFulfillmentHistorySchema as qn, businessHoursPeriodSchema as qo, merchantListItemSchema as qr, linkWhatsAppGroupInputSchema as qt, payoutReportOrderSchema as r, upsertCustomerInputSchema as ra, updateSocialInputSchema as ri, locationIdInputSchema as rn, getModifierListOutputSchema as ro, orderPromocodeInputSchema as rr, listActiveBannersInputSchema as rs, sendMessageOutputSchema as rt, payoutReportSummarySchema as s, catalogCategoryFilterSchema as sa, anbSinglePaymentRequestSchema as si, locationSchema as sn, linkItemWithModifierListInputSchema as so, orderSummarySchema as sr, baseFilterSchema as ss, defaultMessageTemplateSort as st, payoutReportFulfillmentSchema as t, merchantCustomerFilterSchema as ta, socialIdInputSchema as ti, locationAddressSchema as tn, getModifierInputSchema as to, orderModifierSchema as tr, bannerStatusSchema as ts, sendDirectMessageOutputSchema as tt, companyPayoutAccountSchema as u, catalogFoodIngredientValues as ua, mapAnbStatusToPayoutStatus as ui, pickupConfigSchema as un, listCatalogCategoriesOutputSchema as uo, upsertOrderConfigInputSchema as ur, defaultTimeSort as us, messageTemplateBaseSchema as ut, getEffectiveBankAccountOutputSchema as v, catalogModifierListBaseSchema as va, discountTypes as vi, updateDeliveryConfigInputSchema as vn, listCatalogModifiersOutputSchema as vo, promoCodeConfigurationSchema as vr, updateMessageTemplateInputSchema as vt, listPayoutsOutputSchema as w, catalogVariationBaseSchema as wa, bulkCustomerImportErrorSchema as wi, uploadLocationPhotoInputSchema as wn, unlinkItemWithImageInputSchema as wo, promoCodeScopes as wr, subscriptionPlanSchema as wt, getPayoutInputSchema as x, catalogModifierLocationOverrideSchema as xa, bulkCustomerExportInputSchema as xi, updateWhatsAppGroupInputSchema as xn, modifierOverrideTypeValues as xo, promoCodeIdInputSchema as xr, merchantInvoiceSchema as xt, getLocationBalanceInputSchema as y, catalogModifierListDetailSchema as ya, listDiscountsInputSchema as yi, updateLocationInputSchema as yn, listCatalogVariationsInputSchema as yo, promoCodeDiscountTypes as yr, createMerchantInvoiceInputSchema as yt, paymentFilterSchema as z, deleteCategoryInputSchema as za, customerByIdInputSchema as zi, listOrdersInputSchema as zn, upsertItemModifierOverrideInputSchema as zo, listMerchantsInputSchema as zr, defaultLocationSort as zt };