@devlider001/washlab-backend 1.0.4 → 1.0.6
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.
- package/convex/_generated/api.d.ts +2 -0
- package/convex/admin.d.ts +1 -1
- package/convex/audit.d.ts +39 -0
- package/convex/customers.d.ts +12 -5
- package/convex/lib/auth.d.ts +24 -1
- package/convex/notifications.d.ts +170 -0
- package/convex/schema.d.ts +53 -2
- package/dist/convex/admin.d.ts +377 -0
- package/dist/convex/admin.d.ts.map +1 -0
- package/dist/convex/admin.js +959 -0
- package/dist/convex/admin.js.map +1 -0
- package/dist/convex/analytics.d.ts +87 -0
- package/dist/convex/analytics.d.ts.map +1 -0
- package/dist/convex/analytics.js +361 -0
- package/dist/convex/analytics.js.map +1 -0
- package/dist/convex/attendants.d.ts +140 -0
- package/dist/convex/attendants.d.ts.map +1 -0
- package/dist/convex/attendants.js +337 -0
- package/dist/convex/attendants.js.map +1 -0
- package/dist/convex/audit.d.ts +158 -0
- package/dist/convex/audit.d.ts.map +1 -0
- package/dist/convex/audit.js +184 -0
- package/dist/convex/audit.js.map +1 -0
- package/dist/convex/clerk.d.ts +53 -0
- package/dist/convex/clerk.d.ts.map +1 -0
- package/dist/convex/clerk.js +316 -0
- package/dist/convex/clerk.js.map +1 -0
- package/dist/convex/customers.d.ts +224 -0
- package/dist/convex/customers.d.ts.map +1 -0
- package/dist/convex/customers.js +504 -0
- package/dist/convex/customers.js.map +1 -0
- package/dist/convex/http.d.ts +3 -0
- package/dist/convex/http.d.ts.map +1 -0
- package/dist/convex/http.js +115 -0
- package/dist/convex/http.js.map +1 -0
- package/dist/convex/lib/audit.d.ts +36 -0
- package/dist/convex/lib/audit.d.ts.map +1 -0
- package/dist/convex/lib/audit.js +59 -0
- package/dist/convex/lib/audit.js.map +1 -0
- package/dist/convex/lib/auth.d.ts +96 -0
- package/dist/convex/lib/auth.d.ts.map +1 -0
- package/dist/convex/lib/auth.js +94 -0
- package/dist/convex/lib/auth.js.map +1 -0
- package/dist/convex/lib/utils.d.ts +38 -0
- package/dist/convex/lib/utils.d.ts.map +1 -0
- package/dist/convex/lib/utils.js +71 -0
- package/dist/convex/lib/utils.js.map +1 -0
- package/dist/convex/loyalty.d.ts +82 -0
- package/dist/convex/loyalty.d.ts.map +1 -0
- package/dist/convex/loyalty.js +286 -0
- package/dist/convex/loyalty.js.map +1 -0
- package/dist/convex/orders.d.ts +326 -0
- package/dist/convex/orders.d.ts.map +1 -0
- package/dist/convex/orders.js +570 -0
- package/dist/convex/orders.js.map +1 -0
- package/dist/convex/payments.d.ts +134 -0
- package/dist/convex/payments.d.ts.map +1 -0
- package/dist/convex/payments.js +360 -0
- package/dist/convex/payments.js.map +1 -0
- package/dist/convex/resources.d.ts +119 -0
- package/dist/convex/resources.d.ts.map +1 -0
- package/dist/convex/resources.js +283 -0
- package/dist/convex/resources.js.map +1 -0
- package/dist/convex/schema.d.ts +450 -0
- package/dist/convex/schema.d.ts.map +1 -0
- package/dist/convex/schema.js +347 -0
- package/dist/convex/schema.js.map +1 -0
- package/dist/convex/vouchers.d.ts +187 -0
- package/dist/convex/vouchers.d.ts.map +1 -0
- package/dist/convex/vouchers.js +464 -0
- package/dist/convex/vouchers.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +5 -3
- package/convex/_generated/api.js +0 -23
- package/convex/_generated/server.js +0 -93
|
@@ -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":"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"}
|
|
@@ -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"}
|