@devlider001/washlab-backend 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/convex/_generated/api.d.ts +6 -0
  2. package/convex/admin.d.ts +129 -4
  3. package/convex/analytics.d.ts +87 -0
  4. package/convex/attendants.d.ts +40 -0
  5. package/convex/audit.d.ts +39 -0
  6. package/convex/customers.d.ts +69 -1
  7. package/convex/lib/auth.d.ts +4 -0
  8. package/convex/loyalty.d.ts +1 -1
  9. package/convex/notifications.d.ts +170 -0
  10. package/convex/orders.d.ts +80 -4
  11. package/convex/payments.d.ts +47 -2
  12. package/convex/resources.d.ts +31 -0
  13. package/convex/schema.d.ts +141 -9
  14. package/convex/vouchers.d.ts +187 -0
  15. package/dist/convex/admin.d.ts +377 -0
  16. package/dist/convex/admin.d.ts.map +1 -0
  17. package/dist/convex/admin.js +959 -0
  18. package/dist/convex/admin.js.map +1 -0
  19. package/dist/convex/analytics.d.ts +87 -0
  20. package/dist/convex/analytics.d.ts.map +1 -0
  21. package/dist/convex/analytics.js +361 -0
  22. package/dist/convex/analytics.js.map +1 -0
  23. package/dist/convex/attendants.d.ts +140 -0
  24. package/dist/convex/attendants.d.ts.map +1 -0
  25. package/dist/convex/attendants.js +337 -0
  26. package/dist/convex/attendants.js.map +1 -0
  27. package/dist/convex/audit.d.ts +158 -0
  28. package/dist/convex/audit.d.ts.map +1 -0
  29. package/dist/convex/audit.js +184 -0
  30. package/dist/convex/audit.js.map +1 -0
  31. package/dist/convex/clerk.d.ts +53 -0
  32. package/dist/convex/clerk.d.ts.map +1 -0
  33. package/dist/convex/clerk.js +316 -0
  34. package/dist/convex/clerk.js.map +1 -0
  35. package/dist/convex/customers.d.ts +224 -0
  36. package/dist/convex/customers.d.ts.map +1 -0
  37. package/dist/convex/customers.js +504 -0
  38. package/dist/convex/customers.js.map +1 -0
  39. package/dist/convex/http.d.ts +3 -0
  40. package/dist/convex/http.d.ts.map +1 -0
  41. package/dist/convex/http.js +115 -0
  42. package/dist/convex/http.js.map +1 -0
  43. package/dist/convex/lib/audit.d.ts +36 -0
  44. package/dist/convex/lib/audit.d.ts.map +1 -0
  45. package/dist/convex/lib/audit.js +59 -0
  46. package/dist/convex/lib/audit.js.map +1 -0
  47. package/dist/convex/lib/auth.d.ts +96 -0
  48. package/dist/convex/lib/auth.d.ts.map +1 -0
  49. package/dist/convex/lib/auth.js +94 -0
  50. package/dist/convex/lib/auth.js.map +1 -0
  51. package/dist/convex/lib/utils.d.ts +38 -0
  52. package/dist/convex/lib/utils.d.ts.map +1 -0
  53. package/dist/convex/lib/utils.js +71 -0
  54. package/dist/convex/lib/utils.js.map +1 -0
  55. package/dist/convex/loyalty.d.ts +82 -0
  56. package/dist/convex/loyalty.d.ts.map +1 -0
  57. package/dist/convex/loyalty.js +286 -0
  58. package/dist/convex/loyalty.js.map +1 -0
  59. package/dist/convex/orders.d.ts +326 -0
  60. package/dist/convex/orders.d.ts.map +1 -0
  61. package/dist/convex/orders.js +570 -0
  62. package/dist/convex/orders.js.map +1 -0
  63. package/dist/convex/payments.d.ts +134 -0
  64. package/dist/convex/payments.d.ts.map +1 -0
  65. package/dist/convex/payments.js +360 -0
  66. package/dist/convex/payments.js.map +1 -0
  67. package/dist/convex/resources.d.ts +119 -0
  68. package/dist/convex/resources.d.ts.map +1 -0
  69. package/dist/convex/resources.js +283 -0
  70. package/dist/convex/resources.js.map +1 -0
  71. package/dist/convex/schema.d.ts +450 -0
  72. package/dist/convex/schema.d.ts.map +1 -0
  73. package/dist/convex/schema.js +347 -0
  74. package/dist/convex/schema.js.map +1 -0
  75. package/dist/convex/vouchers.d.ts +187 -0
  76. package/dist/convex/vouchers.d.ts.map +1 -0
  77. package/dist/convex/vouchers.js +464 -0
  78. package/dist/convex/vouchers.js.map +1 -0
  79. package/dist/src/index.d.ts +9 -0
  80. package/dist/src/index.d.ts.map +1 -0
  81. package/dist/src/index.js +9 -0
  82. package/dist/src/index.js.map +1 -0
  83. package/package.json +4 -3
@@ -0,0 +1,347 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+ /**
4
+ * WashLab Database Schema
5
+ *
6
+ * This schema defines all database tables for the WashLab laundry management system.
7
+ * All authentication is handled by Clerk - clerkUserId fields link Clerk users to our data.
8
+ */
9
+ export default defineSchema({
10
+ // Customer profiles (both guest and registered users)
11
+ users: defineTable({
12
+ // Identity
13
+ phoneNumber: v.string(),
14
+ email: v.optional(v.string()),
15
+ name: v.string(),
16
+ clerkUserId: v.optional(v.string()), // Clerk user ID (null for guest users)
17
+ // Account Status
18
+ isRegistered: v.boolean(), // true = registered (has Clerk account), false = guest
19
+ isVerified: v.boolean(), // Phone/email verification status (from Clerk)
20
+ status: v.union(v.literal("active"), // Normal active customer
21
+ v.literal("blocked"), // Blocked by admin (cannot place orders)
22
+ v.literal("suspended"), // Temporarily suspended
23
+ v.literal("restricted") // Restricted access (limited functionality)
24
+ ),
25
+ // Status Change Tracking
26
+ statusNote: v.optional(v.string()), // Admin note for status change
27
+ statusChangedBy: v.optional(v.id("admins")), // Admin who changed the status
28
+ statusChangedAt: v.optional(v.number()), // When status was changed
29
+ // Metadata
30
+ createdAt: v.number(),
31
+ lastLoginAt: v.optional(v.number()),
32
+ // Preferences
33
+ preferredBranchId: v.optional(v.id("branches")),
34
+ // Soft delete
35
+ isDeleted: v.boolean(),
36
+ })
37
+ .index("by_phone", ["phoneNumber"])
38
+ .index("by_email", ["email"])
39
+ .index("by_clerk_user", ["clerkUserId"])
40
+ .index("by_status", ["status"]),
41
+ // Attendant staff members (POS operators)
42
+ attendants: defineTable({
43
+ // Identity
44
+ name: v.string(),
45
+ email: v.string(), // Unique, for Clerk login
46
+ phoneNumber: v.string(),
47
+ clerkUserId: v.string(), // Clerk user ID (required for authentication)
48
+ passcode: v.optional(v.string()), // Optional: 4-6 digit PIN for quick POS access
49
+ // Assignment
50
+ branchId: v.id("branches"), // Assigned to single branch
51
+ isActive: v.boolean(), // Active/inactive status
52
+ // Metadata
53
+ createdAt: v.number(),
54
+ lastLoginAt: v.optional(v.number()),
55
+ // Soft delete
56
+ isDeleted: v.boolean(),
57
+ })
58
+ .index("by_branch", ["branchId"])
59
+ .index("by_email", ["email"])
60
+ .index("by_phone", ["phoneNumber"])
61
+ .index("by_clerk_user", ["clerkUserId"]),
62
+ // Admin users (system administrators)
63
+ admins: defineTable({
64
+ // Identity
65
+ name: v.string(),
66
+ email: v.string(), // Unique, for Clerk login
67
+ clerkUserId: v.string(), // Clerk user ID (required)
68
+ // Permissions (also managed in Clerk roles/metadata)
69
+ role: v.union(v.literal("super_admin"), v.literal("admin")),
70
+ // Metadata
71
+ createdAt: v.number(),
72
+ lastLoginAt: v.optional(v.number()),
73
+ // Soft delete
74
+ isDeleted: v.boolean(),
75
+ })
76
+ .index("by_email", ["email"])
77
+ .index("by_clerk_user", ["clerkUserId"]),
78
+ // Branch locations
79
+ branches: defineTable({
80
+ // Basic Info
81
+ name: v.string(), // e.g., "East Legon Branch"
82
+ code: v.string(), // Unique branch code (e.g., "IND", "BRU")
83
+ address: v.string(),
84
+ city: v.string(),
85
+ country: v.string(), // Default: "Ghana"
86
+ // Contact
87
+ phoneNumber: v.string(),
88
+ email: v.optional(v.string()),
89
+ // Configuration
90
+ pricingPerKg: v.number(), // Base price per kg in local currency
91
+ deliveryFee: v.number(), // Standard delivery fee
92
+ // Status
93
+ isActive: v.boolean(),
94
+ // Metadata
95
+ createdAt: v.number(),
96
+ createdBy: v.id("admins"), // Admin who created it
97
+ // Soft delete
98
+ isDeleted: v.boolean(),
99
+ })
100
+ .index("by_city", ["city"])
101
+ .index("by_active", ["isActive"])
102
+ .index("by_code", ["code"]),
103
+ // Orders (wash and dry orders)
104
+ orders: defineTable({
105
+ // Customer
106
+ customerId: v.id("users"),
107
+ customerPhoneNumber: v.string(), // Denormalized for quick lookup
108
+ // Order Details
109
+ branchId: v.id("branches"),
110
+ orderNumber: v.string(), // Unique order number (e.g., "WL-2024-001234")
111
+ orderType: v.union(v.literal("walk_in"), v.literal("online")),
112
+ // Service Details
113
+ serviceType: v.union(v.literal("wash_only"), v.literal("wash_and_dry"), v.literal("dry_only")),
114
+ estimatedWeight: v.optional(v.number()), // From customer input (online)
115
+ actualWeight: v.optional(v.number()), // Confirmed by attendant
116
+ itemCount: v.optional(v.number()), // Number of items (security tracking)
117
+ estimatedLoads: v.optional(v.number()), // Estimated number of loads
118
+ whitesSeparate: v.optional(v.boolean()), // Separate wash for whites
119
+ bagCardNumber: v.optional(v.string()), // Physical bag card number for tracking
120
+ notes: v.optional(v.string()),
121
+ // Delivery Details
122
+ isDelivery: v.boolean(),
123
+ deliveryAddress: v.optional(v.string()),
124
+ deliveryPhoneNumber: v.optional(v.string()),
125
+ deliveryHall: v.optional(v.string()), // Hall/Hostel name
126
+ deliveryRoom: v.optional(v.string()), // Room number
127
+ // Pricing
128
+ basePrice: v.number(), // Calculated price
129
+ deliveryFee: v.number(), // If delivery
130
+ totalPrice: v.number(), // basePrice + deliveryFee
131
+ finalPrice: v.number(), // After discounts/loyalty redemption
132
+ // Status
133
+ status: v.union(v.literal("pending"), // Online order, awaiting drop-off
134
+ v.literal("in_progress"), // Being cleaned
135
+ v.literal("ready_for_pickup"), // Ready
136
+ v.literal("delivered"), // Delivered (if delivery)
137
+ v.literal("completed"), // Picked up / Completed
138
+ v.literal("cancelled")),
139
+ // Payment
140
+ paymentStatus: v.union(v.literal("pending"), v.literal("paid"), v.literal("failed"), v.literal("refunded")),
141
+ paymentMethod: v.optional(v.union(v.literal("mobile_money"), v.literal("card"), v.literal("cash"))),
142
+ paymentId: v.optional(v.id("payments")),
143
+ // Tracking
144
+ createdAt: v.number(), // Order creation time
145
+ updatedAt: v.number(), // Last status update
146
+ createdBy: v.optional(v.id("attendants")), // Attendant who created (walk-in)
147
+ fulfilledBy: v.optional(v.id("attendants")), // Attendant handling
148
+ // Audit
149
+ statusHistory: v.array(v.object({
150
+ status: v.string(),
151
+ changedAt: v.number(),
152
+ changedBy: v.id("attendants"),
153
+ notes: v.optional(v.string()),
154
+ })),
155
+ // Soft delete
156
+ isDeleted: v.boolean(),
157
+ })
158
+ .index("by_customer", ["customerId"])
159
+ .index("by_branch", ["branchId"])
160
+ .index("by_status", ["status"])
161
+ .index("by_phone", ["customerPhoneNumber"])
162
+ .index("by_order_number", ["orderNumber"])
163
+ .index("by_created", ["createdAt"])
164
+ .index("by_fulfilled_by", ["fulfilledBy"]),
165
+ // Payment transactions
166
+ payments: defineTable({
167
+ // Reference
168
+ orderId: v.id("orders"),
169
+ customerId: v.id("users"),
170
+ // Payment Details
171
+ amount: v.number(), // Amount in local currency
172
+ currency: v.string(), // e.g., "GHS" or "USD"
173
+ paymentMethod: v.union(v.literal("mobile_money"), v.literal("card"), v.literal("cash")),
174
+ // Status
175
+ status: v.union(v.literal("pending"), v.literal("processing"), v.literal("completed"), v.literal("failed"), v.literal("refunded")),
176
+ // External Gateway (if applicable)
177
+ gatewayTransactionId: v.optional(v.string()), // External payment provider ID
178
+ gatewayResponse: v.optional(v.string()), // JSON string of gateway response
179
+ // Metadata
180
+ createdAt: v.number(),
181
+ completedAt: v.optional(v.number()),
182
+ processedBy: v.optional(v.id("attendants")), // Attendant who processed
183
+ // Audit
184
+ isDeleted: v.boolean(),
185
+ })
186
+ .index("by_order", ["orderId"])
187
+ .index("by_customer", ["customerId"])
188
+ .index("by_status", ["status"])
189
+ .index("by_created", ["createdAt"]),
190
+ // Customer loyalty points balances
191
+ loyaltyPoints: defineTable({
192
+ // Customer
193
+ customerId: v.id("users"),
194
+ // Points
195
+ points: v.number(), // Current balance
196
+ totalEarned: v.number(), // Lifetime earned
197
+ totalRedeemed: v.number(), // Lifetime redeemed
198
+ // Metadata
199
+ lastEarnedAt: v.optional(v.number()),
200
+ lastRedeemedAt: v.optional(v.number()),
201
+ // Soft delete
202
+ isDeleted: v.boolean(),
203
+ }).index("by_customer", ["customerId"]),
204
+ // Loyalty point transactions (history)
205
+ loyaltyTransactions: defineTable({
206
+ // Reference
207
+ customerId: v.id("users"),
208
+ orderId: v.optional(v.id("orders")), // If earned/redeemed via order
209
+ // Transaction
210
+ type: v.union(v.literal("earned"), // Points earned
211
+ v.literal("redeemed"), // Points redeemed
212
+ v.literal("expired"), // Points expired (future)
213
+ v.literal("adjusted") // Admin adjustment
214
+ ),
215
+ points: v.number(), // Positive for earned, negative for redeemed
216
+ balanceAfter: v.number(), // Balance after this transaction
217
+ // Metadata
218
+ description: v.optional(v.string()),
219
+ createdAt: v.number(),
220
+ createdBy: v.optional(v.id("admins")), // If admin adjustment
221
+ // Soft delete
222
+ isDeleted: v.boolean(),
223
+ })
224
+ .index("by_customer", ["customerId"])
225
+ .index("by_order", ["orderId"])
226
+ .index("by_created", ["createdAt"]),
227
+ // Attendant attendance logs (clock in/out)
228
+ attendanceLogs: defineTable({
229
+ // Attendant
230
+ attendantId: v.id("attendants"),
231
+ branchId: v.id("branches"),
232
+ // Session
233
+ clockInAt: v.number(),
234
+ clockOutAt: v.optional(v.number()),
235
+ // Device Info (optional, for audit)
236
+ deviceId: v.optional(v.string()),
237
+ deviceInfo: v.optional(v.string()), // JSON string
238
+ // Metadata
239
+ isActive: v.boolean(), // true = currently clocked in
240
+ // Soft delete
241
+ isDeleted: v.boolean(),
242
+ })
243
+ .index("by_attendant", ["attendantId"])
244
+ .index("by_branch", ["branchId"])
245
+ .index("by_clock_in", ["clockInAt"])
246
+ .index("by_active", ["isActive"]),
247
+ // Daily resource usage logs (detergent, tokens, etc.)
248
+ resourceUsageLogs: defineTable({
249
+ // Reference
250
+ branchId: v.id("branches"),
251
+ attendantId: v.id("attendants"),
252
+ date: v.string(), // YYYY-MM-DD format
253
+ // Resources
254
+ detergentUnits: v.number(), // Units used
255
+ tokensUsed: v.number(), // Machine tokens
256
+ waterCycles: v.optional(v.number()), // Optional future tracking
257
+ // Metadata
258
+ loggedAt: v.number(),
259
+ notes: v.optional(v.string()),
260
+ // Soft delete
261
+ isDeleted: v.boolean(),
262
+ })
263
+ .index("by_branch", ["branchId"])
264
+ .index("by_date", ["date"])
265
+ .index("by_attendant", ["attendantId"])
266
+ .index("by_branch_date", ["branchId", "date"]), // Composite for daily reports
267
+ // System audit logs (all actions)
268
+ auditLogs: defineTable({
269
+ // Actor
270
+ actorId: v.string(), // ID of user/attendant/admin
271
+ actorType: v.union(v.literal("customer"), v.literal("attendant"), v.literal("admin")),
272
+ actorRole: v.string(), // Specific role name
273
+ // Action
274
+ action: v.string(), // e.g., "order.created", "payment.completed"
275
+ entityType: v.string(), // e.g., "order", "payment"
276
+ entityId: v.optional(v.string()), // ID of affected entity
277
+ // Context
278
+ branchId: v.optional(v.id("branches")),
279
+ deviceId: v.optional(v.string()),
280
+ ipAddress: v.optional(v.string()),
281
+ // Details
282
+ details: v.optional(v.string()), // JSON string of additional context
283
+ oldValue: v.optional(v.string()), // JSON string (for updates)
284
+ newValue: v.optional(v.string()), // JSON string (for updates)
285
+ // Metadata
286
+ timestamp: v.number(),
287
+ })
288
+ .index("by_actor", ["actorId", "actorType"])
289
+ .index("by_action", ["action"])
290
+ .index("by_entity", ["entityType", "entityId"])
291
+ .index("by_timestamp", ["timestamp"])
292
+ .index("by_branch", ["branchId"]),
293
+ // Discount vouchers and promo codes
294
+ vouchers: defineTable({
295
+ // Voucher Details
296
+ code: v.string(), // Unique voucher code (e.g., "WELCOME10")
297
+ name: v.optional(v.string()), // Display name
298
+ // Discount Type
299
+ discountType: v.union(v.literal("percentage"), // Percentage off (e.g., 10%)
300
+ v.literal("fixed"), // Fixed amount off (e.g., ₵5)
301
+ v.literal("free_wash") // Free wash (100% discount)
302
+ ),
303
+ discountValue: v.number(), // Percentage (0-100) or fixed amount
304
+ // Usage Limits
305
+ usageLimit: v.number(), // Maximum number of times voucher can be used
306
+ usedCount: v.number(), // Current usage count
307
+ maxUsesPerCustomer: v.optional(v.number()), // Limit per customer
308
+ // Validity
309
+ isActive: v.boolean(),
310
+ validFrom: v.optional(v.number()), // Start date (timestamp)
311
+ validUntil: v.optional(v.number()), // End date (timestamp)
312
+ minOrderValue: v.optional(v.number()), // Minimum order amount to use voucher
313
+ // Restrictions
314
+ applicableBranches: v.optional(v.array(v.id("branches"))), // If empty, applies to all branches
315
+ applicableServiceTypes: v.optional(v.array(v.union(v.literal("wash_only"), v.literal("wash_and_dry"), v.literal("dry_only")))), // If empty, applies to all services
316
+ // Metadata
317
+ createdAt: v.number(),
318
+ createdBy: v.id("admins"), // Admin who created it
319
+ description: v.optional(v.string()),
320
+ // Soft delete
321
+ isDeleted: v.boolean(),
322
+ })
323
+ .index("by_code", ["code"])
324
+ .index("by_active", ["isActive"])
325
+ .index("by_created", ["createdAt"]),
326
+ // Voucher usage tracking
327
+ voucherUsages: defineTable({
328
+ // Reference
329
+ voucherId: v.id("vouchers"),
330
+ orderId: v.id("orders"),
331
+ customerId: v.id("users"),
332
+ // Usage Details
333
+ discountAmount: v.number(), // Actual discount applied
334
+ orderTotalBefore: v.number(), // Order total before discount
335
+ orderTotalAfter: v.number(), // Order total after discount
336
+ // Metadata
337
+ usedAt: v.number(),
338
+ usedBy: v.optional(v.id("attendants")), // Attendant who applied it
339
+ // Soft delete
340
+ isDeleted: v.boolean(),
341
+ })
342
+ .index("by_voucher", ["voucherId"])
343
+ .index("by_order", ["orderId"])
344
+ .index("by_customer", ["customerId"])
345
+ .index("by_used_at", ["usedAt"]),
346
+ });
347
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../convex/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC;;;;;GAKG;AACH,eAAe,YAAY,CAAC;IAC1B,sDAAsD;IACtD,KAAK,EAAE,WAAW,CAAC;QACjB,WAAW;QACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,uCAAuC;QAE5E,iBAAiB;QACjB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,uDAAuD;QAClF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,+CAA+C;QACxE,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,yBAAyB;QAC9C,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,yCAAyC;QAC/D,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,wBAAwB;QAChD,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,4CAA4C;SACrE;QAED,yBAAyB;QACzB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,+BAA+B;QACnE,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,+BAA+B;QAC5E,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,0BAA0B;QAEnE,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEnC,cAAc;QACd,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAE/C,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,CAAC;SAClC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;SAC5B,KAAK,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;SACvC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEjC,0CAA0C;IAC1C,UAAU,EAAE,WAAW,CAAC;QACtB,WAAW;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0BAA0B;QAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;QACvE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,+CAA+C;QAEjF,aAAa;QACb,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,4BAA4B;QACxD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,yBAAyB;QAEhD,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEnC,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;SAChC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;SAC5B,KAAK,CAAC,UAAU,EAAE,CAAC,aAAa,CAAC,CAAC;SAClC,KAAK,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;IAE1C,sCAAsC;IACtC,MAAM,EAAE,WAAW,CAAC;QAClB,WAAW;QACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0BAA0B;QAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,2BAA2B;QAEpD,qDAAqD;QACrD,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE3D,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEnC,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC;SAC5B,KAAK,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC;IAE1C,mBAAmB;IACnB,QAAQ,EAAE,WAAW,CAAC;QACpB,aAAa;QACb,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,4BAA4B;QAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0CAA0C;QAC5D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB;QAExC,UAAU;QACV,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAE7B,gBAAgB;QAChB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,sCAAsC;QAChE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,wBAAwB;QAEjD,SAAS;QACT,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QAErB,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,uBAAuB;QAElD,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;SAC1B,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;SAChC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;IAE7B,+BAA+B;IAC/B,MAAM,EAAE,WAAW,CAAC;QAClB,WAAW;QACX,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QACzB,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,gCAAgC;QAEjE,gBAAgB;QAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,+CAA+C;QACxE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE7D,kBAAkB;QAClB,WAAW,EAAE,CAAC,CAAC,KAAK,CAClB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CACtB;QACD,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,+BAA+B;QACxE,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,yBAAyB;QAC/D,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,sCAAsC;QACzE,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,4BAA4B;QACpE,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,2BAA2B;QACpE,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,wCAAwC;QAC/E,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAE7B,mBAAmB;QACnB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;QACvB,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACvC,mBAAmB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3C,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB;QACzD,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc;QAEpD,UAAU;QACV,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,mBAAmB;QAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,cAAc;QACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0BAA0B;QAClD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,qCAAqC;QAE7D,SAAS;QACT,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,kCAAkC;QACxD,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,gBAAgB;QAC1C,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ;QACvC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,0BAA0B;QAClD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,wBAAwB;QAChD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CACvB;QAED,UAAU;QACV,aAAa,EAAE,CAAC,CAAC,KAAK,CACpB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CACtB;QACD,aAAa,EAAE,CAAC,CAAC,QAAQ,CACvB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CACzE;QACD,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QAEvC,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;QAC7C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,qBAAqB;QAC5C,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,kCAAkC;QAC7E,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,qBAAqB;QAElE,QAAQ;QACR,aAAa,EAAE,CAAC,CAAC,KAAK,CACpB,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;YAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;YAC7B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC9B,CAAC,CACH;QAED,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,CAAC;SACpC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;SAChC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;SAC9B,KAAK,CAAC,UAAU,EAAE,CAAC,qBAAqB,CAAC,CAAC;SAC1C,KAAK,CAAC,iBAAiB,EAAE,CAAC,aAAa,CAAC,CAAC;SACzC,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;SAClC,KAAK,CAAC,iBAAiB,EAAE,CAAC,aAAa,CAAC,CAAC;IAE5C,uBAAuB;IACvB,QAAQ,EAAE,WAAW,CAAC;QACpB,YAAY;QACZ,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;QACvB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QAEzB,kBAAkB;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,2BAA2B;QAC/C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,uBAAuB;QAC7C,aAAa,EAAE,CAAC,CAAC,KAAK,CACpB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAClB;QAED,SAAS;QACT,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CACtB;QAED,mCAAmC;QACnC,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,+BAA+B;QAC7E,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,kCAAkC;QAE3E,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,0BAA0B;QAEvE,QAAQ;QACR,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC;SAC9B,KAAK,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,CAAC;SACpC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;SAC9B,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;IAErC,mCAAmC;IACnC,aAAa,EAAE,WAAW,CAAC;QACzB,WAAW;QACX,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QAEzB,SAAS;QACT,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB;QACtC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB;QAC3C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB;QAE/C,WAAW;QACX,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACpC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEtC,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,CAAC;IAEvC,uCAAuC;IACvC,mBAAmB,EAAE,WAAW,CAAC;QAC/B,YAAY;QACZ,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QACzB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,+BAA+B;QAEpE,cAAc;QACd,IAAI,EAAE,CAAC,CAAC,KAAK,CACX,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,gBAAgB;QACrC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,kBAAkB;QACzC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,0BAA0B;QAChD,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,mBAAmB;SAC1C;QACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,6CAA6C;QACjE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,iCAAiC;QAE3D,WAAW;QACX,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,sBAAsB;QAE7D,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,CAAC;SACpC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC;SAC9B,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;IAErC,2CAA2C;IAC3C,cAAc,EAAE,WAAW,CAAC;QAC1B,YAAY;QACZ,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;QAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAE1B,UAAU;QACV,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAElC,oCAAoC;QACpC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc;QAElD,WAAW;QACX,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,8BAA8B;QAErD,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,CAAC;SACtC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;SAChC,KAAK,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,CAAC;SACnC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;IAEnC,sDAAsD;IACtD,iBAAiB,EAAE,WAAW,CAAC;QAC7B,YAAY;QACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAC1B,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;QAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,oBAAoB;QAEtC,YAAY;QACZ,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,aAAa;QACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,iBAAiB;QACzC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,2BAA2B;QAEhE,WAAW;QACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAE7B,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;SAChC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;SAC1B,KAAK,CAAC,cAAc,EAAE,CAAC,aAAa,CAAC,CAAC;SACtC,KAAK,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,EAAE,8BAA8B;IAEhF,kCAAkC;IAClC,SAAS,EAAE,WAAW,CAAC;QACrB,QAAQ;QACR,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,6BAA6B;QAClD,SAAS,EAAE,CAAC,CAAC,KAAK,CAChB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EACrB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CACnB;QACD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,qBAAqB;QAE5C,SAAS;QACT,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,6CAA6C;QACjE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,2BAA2B;QACnD,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,wBAAwB;QAE1D,UAAU;QACV,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACtC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAChC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEjC,UAAU;QACV,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,oCAAoC;QACrE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,4BAA4B;QAC9D,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,4BAA4B;QAE9D,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC;SACC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;SAC3C,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;SAC9B,KAAK,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;SAC9C,KAAK,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,CAAC;SACpC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;IAEnC,oCAAoC;IACpC,QAAQ,EAAE,WAAW,CAAC;QACpB,kBAAkB;QAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0CAA0C;QAC5D,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,eAAe;QAE7C,gBAAgB;QAChB,YAAY,EAAE,CAAC,CAAC,KAAK,CACnB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,6BAA6B;QACtD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,8BAA8B;QAClD,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,4BAA4B;SACpD;QACD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,qCAAqC;QAEhE,eAAe;QACf,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;QACtE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,sBAAsB;QAC7C,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,qBAAqB;QAEjE,WAAW;QACX,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,yBAAyB;QAC5D,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,uBAAuB;QAC3D,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,sCAAsC;QAE7E,eAAe;QACf,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,oCAAoC;QAC/F,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAChC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CACtB,CAAC,CACH,EAAE,oCAAoC;QAEvC,WAAW;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,uBAAuB;QAClD,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAEnC,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;SAC1B,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;SAChC,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;IAErC,yBAAyB;IACzB,aAAa,EAAE,WAAW,CAAC;QACzB,YAAY;QACZ,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;QAC3B,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;QACvB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;QAEzB,gBAAgB;QAChB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0BAA0B;QACtD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,8BAA8B;QAC5D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,6BAA6B;QAE1D,WAAW;QACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,2BAA2B;QAEnE,cAAc;QACd,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;KACvB,CAAC;SACC,KAAK,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,CAAC;SAClC,KAAK,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC;SAC9B,KAAK,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,CAAC;SACpC,KAAK,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,CAAC;CACnC,CAAC,CAAC"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Voucher Functions
3
+ *
4
+ * Handles discount vouchers and promo codes creation, validation, and application.
5
+ */
6
+ /**
7
+ * Get all vouchers (admin only)
8
+ */
9
+ export declare const getAll: import("convex/server").RegisteredQuery<"public", {
10
+ includeInactive?: boolean | undefined;
11
+ cursor?: string | undefined;
12
+ numItems?: number | undefined;
13
+ }, Promise<{
14
+ page: {
15
+ _id: import("convex/values").GenericId<"vouchers">;
16
+ _creationTime: number;
17
+ name?: string | undefined;
18
+ description?: string | undefined;
19
+ maxUsesPerCustomer?: number | undefined;
20
+ validFrom?: number | undefined;
21
+ validUntil?: number | undefined;
22
+ minOrderValue?: number | undefined;
23
+ applicableBranches?: import("convex/values").GenericId<"branches">[] | undefined;
24
+ applicableServiceTypes?: ("wash_only" | "wash_and_dry" | "dry_only")[] | undefined;
25
+ createdAt: number;
26
+ isDeleted: boolean;
27
+ isActive: boolean;
28
+ code: string;
29
+ createdBy: import("convex/values").GenericId<"admins">;
30
+ discountType: "percentage" | "fixed" | "free_wash";
31
+ discountValue: number;
32
+ usageLimit: number;
33
+ usedCount: number;
34
+ }[];
35
+ isDone: boolean;
36
+ continueCursor: string;
37
+ }>>;
38
+ /**
39
+ * Get active vouchers (public - for customers/attendants)
40
+ */
41
+ export declare const getActive: import("convex/server").RegisteredQuery<"public", {
42
+ branchId?: import("convex/values").GenericId<"branches"> | undefined;
43
+ }, Promise<{
44
+ _id: import("convex/values").GenericId<"vouchers">;
45
+ _creationTime: number;
46
+ name?: string | undefined;
47
+ description?: string | undefined;
48
+ maxUsesPerCustomer?: number | undefined;
49
+ validFrom?: number | undefined;
50
+ validUntil?: number | undefined;
51
+ minOrderValue?: number | undefined;
52
+ applicableBranches?: import("convex/values").GenericId<"branches">[] | undefined;
53
+ applicableServiceTypes?: ("wash_only" | "wash_and_dry" | "dry_only")[] | undefined;
54
+ createdAt: number;
55
+ isDeleted: boolean;
56
+ isActive: boolean;
57
+ code: string;
58
+ createdBy: import("convex/values").GenericId<"admins">;
59
+ discountType: "percentage" | "fixed" | "free_wash";
60
+ discountValue: number;
61
+ usageLimit: number;
62
+ usedCount: number;
63
+ }[]>>;
64
+ /**
65
+ * Get voucher by code
66
+ */
67
+ export declare const getByCode: import("convex/server").RegisteredQuery<"public", {
68
+ code: string;
69
+ }, Promise<{
70
+ _id: import("convex/values").GenericId<"vouchers">;
71
+ _creationTime: number;
72
+ name?: string | undefined;
73
+ description?: string | undefined;
74
+ maxUsesPerCustomer?: number | undefined;
75
+ validFrom?: number | undefined;
76
+ validUntil?: number | undefined;
77
+ minOrderValue?: number | undefined;
78
+ applicableBranches?: import("convex/values").GenericId<"branches">[] | undefined;
79
+ applicableServiceTypes?: ("wash_only" | "wash_and_dry" | "dry_only")[] | undefined;
80
+ createdAt: number;
81
+ isDeleted: boolean;
82
+ isActive: boolean;
83
+ code: string;
84
+ createdBy: import("convex/values").GenericId<"admins">;
85
+ discountType: "percentage" | "fixed" | "free_wash";
86
+ discountValue: number;
87
+ usageLimit: number;
88
+ usedCount: number;
89
+ } | null>>;
90
+ /**
91
+ * Validate voucher for order
92
+ */
93
+ export declare const validate: import("convex/server").RegisteredQuery<"public", {
94
+ serviceType?: "wash_only" | "wash_and_dry" | "dry_only" | undefined;
95
+ branchId: import("convex/values").GenericId<"branches">;
96
+ code: string;
97
+ orderTotal: number;
98
+ }, Promise<{
99
+ valid: boolean;
100
+ error: string;
101
+ voucher?: undefined;
102
+ discountAmount?: undefined;
103
+ finalPrice?: undefined;
104
+ } | {
105
+ valid: boolean;
106
+ voucher: {
107
+ _id: import("convex/values").GenericId<"vouchers">;
108
+ code: string;
109
+ name: string | undefined;
110
+ discountType: "percentage" | "fixed" | "free_wash";
111
+ discountValue: number;
112
+ };
113
+ discountAmount: number;
114
+ finalPrice: number;
115
+ error?: undefined;
116
+ }>>;
117
+ /**
118
+ * Create voucher (admin only)
119
+ */
120
+ export declare const create: import("convex/server").RegisteredMutation<"public", {
121
+ name?: string | undefined;
122
+ description?: string | undefined;
123
+ maxUsesPerCustomer?: number | undefined;
124
+ validFrom?: number | undefined;
125
+ validUntil?: number | undefined;
126
+ minOrderValue?: number | undefined;
127
+ applicableBranches?: import("convex/values").GenericId<"branches">[] | undefined;
128
+ applicableServiceTypes?: ("wash_only" | "wash_and_dry" | "dry_only")[] | undefined;
129
+ code: string;
130
+ discountType: "percentage" | "fixed" | "free_wash";
131
+ discountValue: number;
132
+ usageLimit: number;
133
+ }, Promise<import("convex/values").GenericId<"vouchers">>>;
134
+ /**
135
+ * Update voucher (admin only)
136
+ */
137
+ export declare const update: import("convex/server").RegisteredMutation<"public", {
138
+ name?: string | undefined;
139
+ isActive?: boolean | undefined;
140
+ description?: string | undefined;
141
+ discountType?: "percentage" | "fixed" | "free_wash" | undefined;
142
+ discountValue?: number | undefined;
143
+ usageLimit?: number | undefined;
144
+ maxUsesPerCustomer?: number | undefined;
145
+ validFrom?: number | undefined;
146
+ validUntil?: number | undefined;
147
+ minOrderValue?: number | undefined;
148
+ applicableBranches?: import("convex/values").GenericId<"branches">[] | undefined;
149
+ applicableServiceTypes?: ("wash_only" | "wash_and_dry" | "dry_only")[] | undefined;
150
+ voucherId: import("convex/values").GenericId<"vouchers">;
151
+ }, Promise<import("convex/values").GenericId<"vouchers">>>;
152
+ /**
153
+ * Apply voucher to order
154
+ */
155
+ export declare const applyToOrder: import("convex/server").RegisteredMutation<"public", {
156
+ orderId: import("convex/values").GenericId<"orders">;
157
+ voucherCode: string;
158
+ }, Promise<{
159
+ voucherId: import("convex/values").GenericId<"vouchers">;
160
+ discountAmount: number;
161
+ finalPrice: number;
162
+ }>>;
163
+ /**
164
+ * Get voucher usage history (admin only)
165
+ */
166
+ export declare const getUsageHistory: import("convex/server").RegisteredQuery<"public", {
167
+ voucherId?: import("convex/values").GenericId<"vouchers"> | undefined;
168
+ cursor?: string | undefined;
169
+ numItems?: number | undefined;
170
+ }, Promise<{
171
+ page: {
172
+ _id: import("convex/values").GenericId<"voucherUsages">;
173
+ _creationTime: number;
174
+ usedBy?: import("convex/values").GenericId<"attendants"> | undefined;
175
+ isDeleted: boolean;
176
+ customerId: import("convex/values").GenericId<"users">;
177
+ orderId: import("convex/values").GenericId<"orders">;
178
+ voucherId: import("convex/values").GenericId<"vouchers">;
179
+ discountAmount: number;
180
+ orderTotalBefore: number;
181
+ orderTotalAfter: number;
182
+ usedAt: number;
183
+ }[];
184
+ isDone: boolean;
185
+ continueCursor: string;
186
+ }>>;
187
+ //# sourceMappingURL=vouchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vouchers.d.ts","sourceRoot":"","sources":["../../convex/vouchers.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BjB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;KAsCpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;UA0BpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;GAwGnB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;0DA2EjB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;0DAwDjB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;GAwJvB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;GAkC1B,CAAC"}