@devlider001/washlab-backend 1.0.2 → 1.0.4
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 +4 -0
- package/convex/admin.d.ts +140 -4
- package/convex/analytics.d.ts +87 -0
- package/convex/attendants.d.ts +40 -0
- package/convex/clerk.d.ts +4 -3
- package/convex/customers.d.ts +69 -1
- package/convex/lib/auth.d.ts +4 -0
- package/convex/loyalty.d.ts +1 -1
- package/convex/orders.d.ts +80 -4
- package/convex/payments.d.ts +47 -2
- package/convex/resources.d.ts +31 -0
- package/convex/schema.d.ts +90 -9
- package/convex/vouchers.d.ts +187 -0
- package/package.json +2 -1
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import type * as admin from "../admin.js";
|
|
12
|
+
import type * as analytics from "../analytics.js";
|
|
12
13
|
import type * as attendants from "../attendants.js";
|
|
13
14
|
import type * as audit from "../audit.js";
|
|
14
15
|
import type * as clerk from "../clerk.js";
|
|
@@ -21,6 +22,7 @@ import type * as loyalty from "../loyalty.js";
|
|
|
21
22
|
import type * as orders from "../orders.js";
|
|
22
23
|
import type * as payments from "../payments.js";
|
|
23
24
|
import type * as resources from "../resources.js";
|
|
25
|
+
import type * as vouchers from "../vouchers.js";
|
|
24
26
|
|
|
25
27
|
import type {
|
|
26
28
|
ApiFromModules,
|
|
@@ -30,6 +32,7 @@ import type {
|
|
|
30
32
|
|
|
31
33
|
declare const fullApi: ApiFromModules<{
|
|
32
34
|
admin: typeof admin;
|
|
35
|
+
analytics: typeof analytics;
|
|
33
36
|
attendants: typeof attendants;
|
|
34
37
|
audit: typeof audit;
|
|
35
38
|
clerk: typeof clerk;
|
|
@@ -42,6 +45,7 @@ declare const fullApi: ApiFromModules<{
|
|
|
42
45
|
orders: typeof orders;
|
|
43
46
|
payments: typeof payments;
|
|
44
47
|
resources: typeof resources;
|
|
48
|
+
vouchers: typeof vouchers;
|
|
45
49
|
}>;
|
|
46
50
|
|
|
47
51
|
/**
|
package/convex/admin.d.ts
CHANGED
|
@@ -37,6 +37,7 @@ export declare const getBranches: import("convex/server").RegisteredQuery<"publi
|
|
|
37
37
|
createdAt: number;
|
|
38
38
|
isDeleted: boolean;
|
|
39
39
|
isActive: boolean;
|
|
40
|
+
code: string;
|
|
40
41
|
address: string;
|
|
41
42
|
city: string;
|
|
42
43
|
country: string;
|
|
@@ -47,6 +48,50 @@ export declare const getBranches: import("convex/server").RegisteredQuery<"publi
|
|
|
47
48
|
isDone: boolean;
|
|
48
49
|
continueCursor: string;
|
|
49
50
|
}>>;
|
|
51
|
+
/**
|
|
52
|
+
* Get branch by code
|
|
53
|
+
*/
|
|
54
|
+
export declare const getBranchByCode: import("convex/server").RegisteredQuery<"public", {
|
|
55
|
+
code: string;
|
|
56
|
+
}, Promise<{
|
|
57
|
+
_id: import("convex/values").GenericId<"branches">;
|
|
58
|
+
_creationTime: number;
|
|
59
|
+
email?: string | undefined;
|
|
60
|
+
phoneNumber: string;
|
|
61
|
+
name: string;
|
|
62
|
+
createdAt: number;
|
|
63
|
+
isDeleted: boolean;
|
|
64
|
+
isActive: boolean;
|
|
65
|
+
code: string;
|
|
66
|
+
address: string;
|
|
67
|
+
city: string;
|
|
68
|
+
country: string;
|
|
69
|
+
pricingPerKg: number;
|
|
70
|
+
deliveryFee: number;
|
|
71
|
+
createdBy: import("convex/values").GenericId<"admins">;
|
|
72
|
+
} | null>>;
|
|
73
|
+
/**
|
|
74
|
+
* Get single branch by ID
|
|
75
|
+
*/
|
|
76
|
+
export declare const getBranch: import("convex/server").RegisteredQuery<"public", {
|
|
77
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
78
|
+
}, Promise<{
|
|
79
|
+
_id: import("convex/values").GenericId<"branches">;
|
|
80
|
+
_creationTime: number;
|
|
81
|
+
email?: string | undefined;
|
|
82
|
+
phoneNumber: string;
|
|
83
|
+
name: string;
|
|
84
|
+
createdAt: number;
|
|
85
|
+
isDeleted: boolean;
|
|
86
|
+
isActive: boolean;
|
|
87
|
+
code: string;
|
|
88
|
+
address: string;
|
|
89
|
+
city: string;
|
|
90
|
+
country: string;
|
|
91
|
+
pricingPerKg: number;
|
|
92
|
+
deliveryFee: number;
|
|
93
|
+
createdBy: import("convex/values").GenericId<"admins">;
|
|
94
|
+
} | null>>;
|
|
50
95
|
/**
|
|
51
96
|
* Get all attendants - Paginated
|
|
52
97
|
* Supports usePaginatedQuery for infinite scroll
|
|
@@ -79,8 +124,8 @@ export declare const getAttendants: import("convex/server").RegisteredQuery<"pub
|
|
|
79
124
|
* Supports usePaginatedQuery for infinite scroll
|
|
80
125
|
*/
|
|
81
126
|
export declare const getOrders: import("convex/server").RegisteredQuery<"public", {
|
|
82
|
-
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
83
127
|
status?: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled" | undefined;
|
|
128
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
84
129
|
cursor?: string | undefined;
|
|
85
130
|
numItems?: number | undefined;
|
|
86
131
|
startDate?: number | undefined;
|
|
@@ -95,6 +140,7 @@ export declare const getOrders: import("convex/server").RegisteredQuery<"public"
|
|
|
95
140
|
itemCount?: number | undefined;
|
|
96
141
|
estimatedLoads?: number | undefined;
|
|
97
142
|
whitesSeparate?: boolean | undefined;
|
|
143
|
+
bagCardNumber?: string | undefined;
|
|
98
144
|
notes?: string | undefined;
|
|
99
145
|
deliveryAddress?: string | undefined;
|
|
100
146
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -103,6 +149,7 @@ export declare const getOrders: import("convex/server").RegisteredQuery<"public"
|
|
|
103
149
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
104
150
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
105
151
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
152
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
106
153
|
createdAt: number;
|
|
107
154
|
isDeleted: boolean;
|
|
108
155
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -116,7 +163,6 @@ export declare const getOrders: import("convex/server").RegisteredQuery<"public"
|
|
|
116
163
|
basePrice: number;
|
|
117
164
|
totalPrice: number;
|
|
118
165
|
finalPrice: number;
|
|
119
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
120
166
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
121
167
|
updatedAt: number;
|
|
122
168
|
statusHistory: {
|
|
@@ -158,27 +204,73 @@ export declare const getAnalytics: import("convex/server").RegisteredQuery<"publ
|
|
|
158
204
|
* Supports usePaginatedQuery for infinite scroll
|
|
159
205
|
*/
|
|
160
206
|
export declare const getCustomers: import("convex/server").RegisteredQuery<"public", {
|
|
207
|
+
isRegistered?: boolean | undefined;
|
|
208
|
+
status?: "active" | "blocked" | "suspended" | "restricted" | undefined;
|
|
161
209
|
search?: string | undefined;
|
|
162
|
-
|
|
163
|
-
|
|
210
|
+
paginationOpts: {
|
|
211
|
+
id?: number;
|
|
212
|
+
endCursor?: string | null;
|
|
213
|
+
maximumRowsRead?: number;
|
|
214
|
+
maximumBytesRead?: number;
|
|
215
|
+
numItems: number;
|
|
216
|
+
cursor: string | null;
|
|
217
|
+
};
|
|
164
218
|
}, Promise<{
|
|
165
219
|
page: {
|
|
220
|
+
orderCount: number;
|
|
221
|
+
completedOrderCount: number;
|
|
222
|
+
totalSpent: number;
|
|
223
|
+
lastOrderDate: number;
|
|
224
|
+
lastOrderNumber: string;
|
|
166
225
|
_id: import("convex/values").GenericId<"users">;
|
|
167
226
|
_creationTime: number;
|
|
168
227
|
email?: string | undefined;
|
|
169
228
|
clerkUserId?: string | undefined;
|
|
229
|
+
statusNote?: string | undefined;
|
|
230
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
231
|
+
statusChangedAt?: number | undefined;
|
|
170
232
|
lastLoginAt?: number | undefined;
|
|
171
233
|
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
172
234
|
phoneNumber: string;
|
|
173
235
|
name: string;
|
|
174
236
|
isRegistered: boolean;
|
|
175
237
|
isVerified: boolean;
|
|
238
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
176
239
|
createdAt: number;
|
|
177
240
|
isDeleted: boolean;
|
|
178
241
|
}[];
|
|
179
242
|
isDone: boolean;
|
|
180
243
|
continueCursor: string;
|
|
181
244
|
}>>;
|
|
245
|
+
/**
|
|
246
|
+
* Get customer statistics/aggregations
|
|
247
|
+
*/
|
|
248
|
+
export declare const getCustomerStats: import("convex/server").RegisteredQuery<"public", {}, Promise<{
|
|
249
|
+
totalCustomers: number;
|
|
250
|
+
registeredCustomers: number;
|
|
251
|
+
walkInCustomers: number;
|
|
252
|
+
activeCustomers: number;
|
|
253
|
+
blockedCustomers: number;
|
|
254
|
+
suspendedCustomers: number;
|
|
255
|
+
restrictedCustomers: number;
|
|
256
|
+
verifiedCustomers: number;
|
|
257
|
+
customersWithActiveOrders: number;
|
|
258
|
+
totalRevenue: number;
|
|
259
|
+
}>>;
|
|
260
|
+
/**
|
|
261
|
+
* Change customer status (with required note)
|
|
262
|
+
*/
|
|
263
|
+
export declare const changeCustomerStatus: import("convex/server").RegisteredMutation<"public", {
|
|
264
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
265
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
266
|
+
note: string;
|
|
267
|
+
}, Promise<import("convex/values").GenericId<"users">>>;
|
|
268
|
+
/**
|
|
269
|
+
* Delete a customer (soft delete)
|
|
270
|
+
*/
|
|
271
|
+
export declare const deleteCustomer: import("convex/server").RegisteredMutation<"public", {
|
|
272
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
273
|
+
}, Promise<import("convex/values").GenericId<"users">>>;
|
|
182
274
|
/**
|
|
183
275
|
* Create new branch
|
|
184
276
|
*/
|
|
@@ -186,6 +278,7 @@ export declare const createBranch: import("convex/server").RegisteredMutation<"p
|
|
|
186
278
|
email?: string | undefined;
|
|
187
279
|
phoneNumber: string;
|
|
188
280
|
name: string;
|
|
281
|
+
code: string;
|
|
189
282
|
address: string;
|
|
190
283
|
city: string;
|
|
191
284
|
country: string;
|
|
@@ -200,6 +293,7 @@ export declare const updateBranch: import("convex/server").RegisteredMutation<"p
|
|
|
200
293
|
email?: string | undefined;
|
|
201
294
|
name?: string | undefined;
|
|
202
295
|
isActive?: boolean | undefined;
|
|
296
|
+
code?: string | undefined;
|
|
203
297
|
address?: string | undefined;
|
|
204
298
|
city?: string | undefined;
|
|
205
299
|
country?: string | undefined;
|
|
@@ -207,6 +301,21 @@ export declare const updateBranch: import("convex/server").RegisteredMutation<"p
|
|
|
207
301
|
deliveryFee?: number | undefined;
|
|
208
302
|
branchId: import("convex/values").GenericId<"branches">;
|
|
209
303
|
}, Promise<import("convex/values").GenericId<"branches">>>;
|
|
304
|
+
/**
|
|
305
|
+
* Toggle branch active status (enable/disable)
|
|
306
|
+
*/
|
|
307
|
+
export declare const toggleBranchStatus: import("convex/server").RegisteredMutation<"public", {
|
|
308
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
309
|
+
}, Promise<{
|
|
310
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
311
|
+
isActive: boolean;
|
|
312
|
+
}>>;
|
|
313
|
+
/**
|
|
314
|
+
* Delete branch (soft delete)
|
|
315
|
+
*/
|
|
316
|
+
export declare const deleteBranch: import("convex/server").RegisteredMutation<"public", {
|
|
317
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
318
|
+
}, Promise<import("convex/values").GenericId<"branches">>>;
|
|
210
319
|
/**
|
|
211
320
|
* Create attendant account
|
|
212
321
|
* Note: Clerk user must be created separately, then link clerkUserId
|
|
@@ -238,4 +347,31 @@ export declare const assignAttendantToBranch: import("convex/server").Registered
|
|
|
238
347
|
branchId: import("convex/values").GenericId<"branches">;
|
|
239
348
|
attendantId: import("convex/values").GenericId<"attendants">;
|
|
240
349
|
}, Promise<import("convex/values").GenericId<"attendants">>>;
|
|
350
|
+
/**
|
|
351
|
+
* Delete attendant (soft delete)
|
|
352
|
+
*/
|
|
353
|
+
export declare const deleteAttendant: import("convex/server").RegisteredMutation<"public", {
|
|
354
|
+
attendantId: import("convex/values").GenericId<"attendants">;
|
|
355
|
+
}, Promise<import("convex/values").GenericId<"attendants">>>;
|
|
356
|
+
/**
|
|
357
|
+
* Create admin account
|
|
358
|
+
* Only super admins can create other admins
|
|
359
|
+
* Note: Clerk user must be created separately, then link clerkUserId
|
|
360
|
+
*/
|
|
361
|
+
export declare const createAdmin: import("convex/server").RegisteredMutation<"public", {
|
|
362
|
+
email: string;
|
|
363
|
+
name: string;
|
|
364
|
+
clerkUserId: string;
|
|
365
|
+
role: "super_admin" | "admin";
|
|
366
|
+
}, Promise<import("convex/values").GenericId<"admins">>>;
|
|
367
|
+
/**
|
|
368
|
+
* Create the first super admin (one-time setup)
|
|
369
|
+
* This function can only be used when no super admins exist in the database
|
|
370
|
+
* After the first super admin is created, use createAdmin instead
|
|
371
|
+
*/
|
|
372
|
+
export declare const createFirstSuperAdmin: import("convex/server").RegisteredMutation<"public", {
|
|
373
|
+
email: string;
|
|
374
|
+
name: string;
|
|
375
|
+
clerkUserId: string;
|
|
376
|
+
}, Promise<import("convex/values").GenericId<"admins">>>;
|
|
241
377
|
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Id } from "./_generated/dataModel";
|
|
2
|
+
/**
|
|
3
|
+
* Analytics Functions
|
|
4
|
+
*
|
|
5
|
+
* Comprehensive analytics and aggregations for dashboard, reports, and insights.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get dashboard overview statistics
|
|
9
|
+
*/
|
|
10
|
+
export declare const getDashboardStats: import("convex/server").RegisteredQuery<"public", {
|
|
11
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
12
|
+
startDate?: number | undefined;
|
|
13
|
+
endDate?: number | undefined;
|
|
14
|
+
}, Promise<{
|
|
15
|
+
totalOrders: number;
|
|
16
|
+
totalRevenue: number;
|
|
17
|
+
completedOrders: number;
|
|
18
|
+
pendingOrders: number;
|
|
19
|
+
walkInOrders: number;
|
|
20
|
+
onlineOrders: number;
|
|
21
|
+
averageOrderValue: number;
|
|
22
|
+
ordersByStatus: Record<string, number>;
|
|
23
|
+
ordersByDay: Record<string, number>;
|
|
24
|
+
revenueByDay: Record<string, number>;
|
|
25
|
+
ordersByServiceType: Record<string, number>;
|
|
26
|
+
ordersByPaymentMethod: Record<string, number>;
|
|
27
|
+
dateRange: {
|
|
28
|
+
start: number;
|
|
29
|
+
end: number;
|
|
30
|
+
};
|
|
31
|
+
}>>;
|
|
32
|
+
/**
|
|
33
|
+
* Get today's statistics
|
|
34
|
+
*/
|
|
35
|
+
export declare const getTodayStats: import("convex/server").RegisteredQuery<"public", {
|
|
36
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
37
|
+
}, Promise<{
|
|
38
|
+
totalOrders: number;
|
|
39
|
+
totalRevenue: number;
|
|
40
|
+
completedOrders: number;
|
|
41
|
+
pendingOrders: number;
|
|
42
|
+
walkInOrders: number;
|
|
43
|
+
onlineOrders: number;
|
|
44
|
+
}>>;
|
|
45
|
+
/**
|
|
46
|
+
* Get top customers by order count
|
|
47
|
+
*/
|
|
48
|
+
export declare const getTopCustomers: import("convex/server").RegisteredQuery<"public", {
|
|
49
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
50
|
+
startDate?: number | undefined;
|
|
51
|
+
endDate?: number | undefined;
|
|
52
|
+
limit?: number | undefined;
|
|
53
|
+
}, Promise<{
|
|
54
|
+
customerId: Id<"users">;
|
|
55
|
+
name: string;
|
|
56
|
+
phoneNumber: string;
|
|
57
|
+
orderCount: number;
|
|
58
|
+
totalRevenue: number;
|
|
59
|
+
averageOrderValue: number;
|
|
60
|
+
}[]>>;
|
|
61
|
+
/**
|
|
62
|
+
* Get revenue trends (daily/weekly/monthly)
|
|
63
|
+
*/
|
|
64
|
+
export declare const getRevenueTrends: import("convex/server").RegisteredQuery<"public", {
|
|
65
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
66
|
+
days?: number | undefined;
|
|
67
|
+
period: "daily" | "weekly" | "monthly";
|
|
68
|
+
}, Promise<{
|
|
69
|
+
period: string;
|
|
70
|
+
revenue: number;
|
|
71
|
+
orders: number;
|
|
72
|
+
}[]>>;
|
|
73
|
+
/**
|
|
74
|
+
* Get branch performance comparison
|
|
75
|
+
*/
|
|
76
|
+
export declare const getBranchPerformance: import("convex/server").RegisteredQuery<"public", {
|
|
77
|
+
startDate?: number | undefined;
|
|
78
|
+
endDate?: number | undefined;
|
|
79
|
+
}, Promise<{
|
|
80
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
81
|
+
branchName: string;
|
|
82
|
+
totalOrders: number;
|
|
83
|
+
totalRevenue: number;
|
|
84
|
+
completedOrders: number;
|
|
85
|
+
averageOrderValue: number;
|
|
86
|
+
}[]>>;
|
|
87
|
+
//# sourceMappingURL=analytics.d.ts.map
|
package/convex/attendants.d.ts
CHANGED
|
@@ -97,4 +97,44 @@ export declare const clockIn: import("convex/server").RegisteredMutation<"public
|
|
|
97
97
|
export declare const clockOut: import("convex/server").RegisteredMutation<"public", {
|
|
98
98
|
attendanceLogId?: import("convex/values").GenericId<"attendanceLogs"> | undefined;
|
|
99
99
|
}, Promise<import("convex/values").GenericId<"attendanceLogs">>>;
|
|
100
|
+
/**
|
|
101
|
+
* Get attendance statistics for a branch
|
|
102
|
+
*/
|
|
103
|
+
export declare const getBranchAttendanceStats: import("convex/server").RegisteredQuery<"public", {
|
|
104
|
+
date?: string | undefined;
|
|
105
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
106
|
+
}, Promise<{
|
|
107
|
+
date: string;
|
|
108
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
109
|
+
clockIns: number;
|
|
110
|
+
clockOuts: number;
|
|
111
|
+
activeSessions: number;
|
|
112
|
+
uniqueAttendants: number;
|
|
113
|
+
totalHoursWorked: number;
|
|
114
|
+
averageHoursPerAttendant: number;
|
|
115
|
+
}>>;
|
|
116
|
+
/**
|
|
117
|
+
* Get attendance summary for date range
|
|
118
|
+
*/
|
|
119
|
+
export declare const getAttendanceSummary: import("convex/server").RegisteredQuery<"public", {
|
|
120
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
121
|
+
startDate?: number | undefined;
|
|
122
|
+
endDate?: number | undefined;
|
|
123
|
+
}, Promise<{
|
|
124
|
+
totalSessions: number;
|
|
125
|
+
completedSessions: number;
|
|
126
|
+
activeSessions: number;
|
|
127
|
+
uniqueAttendants: number;
|
|
128
|
+
totalHoursWorked: number;
|
|
129
|
+
averageHoursPerSession: number;
|
|
130
|
+
attendanceByDay: Record<string, {
|
|
131
|
+
clockIns: number;
|
|
132
|
+
clockOuts: number;
|
|
133
|
+
hours: number;
|
|
134
|
+
}>;
|
|
135
|
+
dateRange: {
|
|
136
|
+
start: number;
|
|
137
|
+
end: number;
|
|
138
|
+
};
|
|
139
|
+
}>>;
|
|
100
140
|
//# sourceMappingURL=attendants.d.ts.map
|
package/convex/clerk.d.ts
CHANGED
|
@@ -21,18 +21,19 @@ export declare const syncUserCreated: import("convex/server").RegisteredMutation
|
|
|
21
21
|
export declare const syncUserUpdated: import("convex/server").RegisteredMutation<"internal", {
|
|
22
22
|
phoneNumber?: string | undefined;
|
|
23
23
|
email?: string | undefined;
|
|
24
|
+
userType?: "admin" | "customer" | "attendant" | undefined;
|
|
24
25
|
name: string;
|
|
25
26
|
clerkUserId: string;
|
|
26
27
|
emailVerified: boolean;
|
|
27
28
|
}, Promise<{
|
|
28
29
|
type: string;
|
|
29
|
-
id: import("convex/values").GenericId<"
|
|
30
|
+
id: import("convex/values").GenericId<"admins">;
|
|
30
31
|
} | {
|
|
31
32
|
type: string;
|
|
32
|
-
id: import("convex/values").GenericId<"
|
|
33
|
+
id: import("convex/values").GenericId<"users">;
|
|
33
34
|
} | {
|
|
34
35
|
type: string;
|
|
35
|
-
id: import("convex/values").GenericId<"
|
|
36
|
+
id: import("convex/values").GenericId<"attendants">;
|
|
36
37
|
} | null>>;
|
|
37
38
|
/**
|
|
38
39
|
* Sync user deleted event from Clerk
|
package/convex/customers.d.ts
CHANGED
|
@@ -16,12 +16,16 @@ export declare const getByPhone: import("convex/server").RegisteredQuery<"public
|
|
|
16
16
|
_creationTime: number;
|
|
17
17
|
email?: string | undefined;
|
|
18
18
|
clerkUserId?: string | undefined;
|
|
19
|
+
statusNote?: string | undefined;
|
|
20
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
21
|
+
statusChangedAt?: number | undefined;
|
|
19
22
|
lastLoginAt?: number | undefined;
|
|
20
23
|
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
21
24
|
phoneNumber: string;
|
|
22
25
|
name: string;
|
|
23
26
|
isRegistered: boolean;
|
|
24
27
|
isVerified: boolean;
|
|
28
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
25
29
|
createdAt: number;
|
|
26
30
|
isDeleted: boolean;
|
|
27
31
|
} | null>>;
|
|
@@ -35,12 +39,16 @@ export declare const getProfile: import("convex/server").RegisteredQuery<"public
|
|
|
35
39
|
_creationTime: number;
|
|
36
40
|
email?: string | undefined;
|
|
37
41
|
clerkUserId?: string | undefined;
|
|
42
|
+
statusNote?: string | undefined;
|
|
43
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
44
|
+
statusChangedAt?: number | undefined;
|
|
38
45
|
lastLoginAt?: number | undefined;
|
|
39
46
|
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
40
47
|
phoneNumber: string;
|
|
41
48
|
name: string;
|
|
42
49
|
isRegistered: boolean;
|
|
43
50
|
isVerified: boolean;
|
|
51
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
44
52
|
createdAt: number;
|
|
45
53
|
isDeleted: boolean;
|
|
46
54
|
}>>;
|
|
@@ -61,6 +69,7 @@ export declare const getOrders: import("convex/server").RegisteredQuery<"public"
|
|
|
61
69
|
itemCount?: number | undefined;
|
|
62
70
|
estimatedLoads?: number | undefined;
|
|
63
71
|
whitesSeparate?: boolean | undefined;
|
|
72
|
+
bagCardNumber?: string | undefined;
|
|
64
73
|
notes?: string | undefined;
|
|
65
74
|
deliveryAddress?: string | undefined;
|
|
66
75
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -69,6 +78,7 @@ export declare const getOrders: import("convex/server").RegisteredQuery<"public"
|
|
|
69
78
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
70
79
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
71
80
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
81
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
72
82
|
createdAt: number;
|
|
73
83
|
isDeleted: boolean;
|
|
74
84
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -82,7 +92,6 @@ export declare const getOrders: import("convex/server").RegisteredQuery<"public"
|
|
|
82
92
|
basePrice: number;
|
|
83
93
|
totalPrice: number;
|
|
84
94
|
finalPrice: number;
|
|
85
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
86
95
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
87
96
|
updatedAt: number;
|
|
88
97
|
statusHistory: {
|
|
@@ -153,4 +162,63 @@ export declare const createTestUser: import("convex/server").RegisteredMutation<
|
|
|
153
162
|
phoneNumber: string;
|
|
154
163
|
name: string;
|
|
155
164
|
}, Promise<import("convex/values").GenericId<"users">>>;
|
|
165
|
+
/**
|
|
166
|
+
* Search customers by name or phone number
|
|
167
|
+
* Used by POS for customer lookup
|
|
168
|
+
*/
|
|
169
|
+
export declare const search: import("convex/server").RegisteredQuery<"public", {
|
|
170
|
+
limit?: number | undefined;
|
|
171
|
+
query: string;
|
|
172
|
+
}, Promise<{
|
|
173
|
+
orderCount: number;
|
|
174
|
+
completedOrderCount: number;
|
|
175
|
+
totalSpent: number;
|
|
176
|
+
lastOrderDate: number;
|
|
177
|
+
_id: import("convex/values").GenericId<"users">;
|
|
178
|
+
_creationTime: number;
|
|
179
|
+
email?: string | undefined;
|
|
180
|
+
clerkUserId?: string | undefined;
|
|
181
|
+
statusNote?: string | undefined;
|
|
182
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
183
|
+
statusChangedAt?: number | undefined;
|
|
184
|
+
lastLoginAt?: number | undefined;
|
|
185
|
+
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
186
|
+
phoneNumber: string;
|
|
187
|
+
name: string;
|
|
188
|
+
isRegistered: boolean;
|
|
189
|
+
isVerified: boolean;
|
|
190
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
191
|
+
createdAt: number;
|
|
192
|
+
isDeleted: boolean;
|
|
193
|
+
}[]>>;
|
|
194
|
+
/**
|
|
195
|
+
* Get customer details with full order history
|
|
196
|
+
*/
|
|
197
|
+
export declare const getDetails: import("convex/server").RegisteredQuery<"public", {
|
|
198
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
199
|
+
}, Promise<{
|
|
200
|
+
orderCount: number;
|
|
201
|
+
completedOrderCount: number;
|
|
202
|
+
totalSpent: number;
|
|
203
|
+
averageOrderValue: number;
|
|
204
|
+
loyaltyPoints: number;
|
|
205
|
+
lastOrderDate: number;
|
|
206
|
+
lastOrderNumber: string;
|
|
207
|
+
_id: import("convex/values").GenericId<"users">;
|
|
208
|
+
_creationTime: number;
|
|
209
|
+
email?: string | undefined;
|
|
210
|
+
clerkUserId?: string | undefined;
|
|
211
|
+
statusNote?: string | undefined;
|
|
212
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
213
|
+
statusChangedAt?: number | undefined;
|
|
214
|
+
lastLoginAt?: number | undefined;
|
|
215
|
+
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
216
|
+
phoneNumber: string;
|
|
217
|
+
name: string;
|
|
218
|
+
isRegistered: boolean;
|
|
219
|
+
isVerified: boolean;
|
|
220
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
221
|
+
createdAt: number;
|
|
222
|
+
isDeleted: boolean;
|
|
223
|
+
}>>;
|
|
156
224
|
//# sourceMappingURL=customers.d.ts.map
|
package/convex/lib/auth.d.ts
CHANGED
|
@@ -14,12 +14,16 @@ export declare function getCurrentCustomer(ctx: QueryCtx | MutationCtx): Promise
|
|
|
14
14
|
_creationTime: number;
|
|
15
15
|
email?: string | undefined;
|
|
16
16
|
clerkUserId?: string | undefined;
|
|
17
|
+
statusNote?: string | undefined;
|
|
18
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
19
|
+
statusChangedAt?: number | undefined;
|
|
17
20
|
lastLoginAt?: number | undefined;
|
|
18
21
|
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
19
22
|
phoneNumber: string;
|
|
20
23
|
name: string;
|
|
21
24
|
isRegistered: boolean;
|
|
22
25
|
isVerified: boolean;
|
|
26
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
23
27
|
createdAt: number;
|
|
24
28
|
isDeleted: boolean;
|
|
25
29
|
}>;
|
package/convex/loyalty.d.ts
CHANGED
|
@@ -31,9 +31,9 @@ export declare const getTransactions: import("convex/server").RegisteredQuery<"p
|
|
|
31
31
|
createdBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
32
32
|
orderId?: import("convex/values").GenericId<"orders"> | undefined;
|
|
33
33
|
description?: string | undefined;
|
|
34
|
+
type: "earned" | "redeemed" | "expired" | "adjusted";
|
|
34
35
|
createdAt: number;
|
|
35
36
|
isDeleted: boolean;
|
|
36
|
-
type: "earned" | "redeemed" | "expired" | "adjusted";
|
|
37
37
|
customerId: import("convex/values").GenericId<"users">;
|
|
38
38
|
points: number;
|
|
39
39
|
balanceAfter: number;
|
package/convex/orders.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export declare const getByOrderNumber: import("convex/server").RegisteredQuery<"
|
|
|
17
17
|
itemCount?: number | undefined;
|
|
18
18
|
estimatedLoads?: number | undefined;
|
|
19
19
|
whitesSeparate?: boolean | undefined;
|
|
20
|
+
bagCardNumber?: string | undefined;
|
|
20
21
|
notes?: string | undefined;
|
|
21
22
|
deliveryAddress?: string | undefined;
|
|
22
23
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -25,6 +26,7 @@ export declare const getByOrderNumber: import("convex/server").RegisteredQuery<"
|
|
|
25
26
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
26
27
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
27
28
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
29
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
28
30
|
createdAt: number;
|
|
29
31
|
isDeleted: boolean;
|
|
30
32
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -38,7 +40,6 @@ export declare const getByOrderNumber: import("convex/server").RegisteredQuery<"
|
|
|
38
40
|
basePrice: number;
|
|
39
41
|
totalPrice: number;
|
|
40
42
|
finalPrice: number;
|
|
41
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
42
43
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
43
44
|
updatedAt: number;
|
|
44
45
|
statusHistory: {
|
|
@@ -63,6 +64,7 @@ export declare const getByCustomer: import("convex/server").RegisteredQuery<"pub
|
|
|
63
64
|
itemCount?: number | undefined;
|
|
64
65
|
estimatedLoads?: number | undefined;
|
|
65
66
|
whitesSeparate?: boolean | undefined;
|
|
67
|
+
bagCardNumber?: string | undefined;
|
|
66
68
|
notes?: string | undefined;
|
|
67
69
|
deliveryAddress?: string | undefined;
|
|
68
70
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -71,6 +73,7 @@ export declare const getByCustomer: import("convex/server").RegisteredQuery<"pub
|
|
|
71
73
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
72
74
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
73
75
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
76
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
74
77
|
createdAt: number;
|
|
75
78
|
isDeleted: boolean;
|
|
76
79
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -84,7 +87,6 @@ export declare const getByCustomer: import("convex/server").RegisteredQuery<"pub
|
|
|
84
87
|
basePrice: number;
|
|
85
88
|
totalPrice: number;
|
|
86
89
|
finalPrice: number;
|
|
87
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
88
90
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
89
91
|
updatedAt: number;
|
|
90
92
|
statusHistory: {
|
|
@@ -110,6 +112,7 @@ export declare const getByBranch: import("convex/server").RegisteredQuery<"publi
|
|
|
110
112
|
itemCount?: number | undefined;
|
|
111
113
|
estimatedLoads?: number | undefined;
|
|
112
114
|
whitesSeparate?: boolean | undefined;
|
|
115
|
+
bagCardNumber?: string | undefined;
|
|
113
116
|
notes?: string | undefined;
|
|
114
117
|
deliveryAddress?: string | undefined;
|
|
115
118
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -118,6 +121,7 @@ export declare const getByBranch: import("convex/server").RegisteredQuery<"publi
|
|
|
118
121
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
119
122
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
120
123
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
124
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
121
125
|
createdAt: number;
|
|
122
126
|
isDeleted: boolean;
|
|
123
127
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -131,7 +135,6 @@ export declare const getByBranch: import("convex/server").RegisteredQuery<"publi
|
|
|
131
135
|
basePrice: number;
|
|
132
136
|
totalPrice: number;
|
|
133
137
|
finalPrice: number;
|
|
134
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
135
138
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
136
139
|
updatedAt: number;
|
|
137
140
|
statusHistory: {
|
|
@@ -155,6 +158,7 @@ export declare const getPending: import("convex/server").RegisteredQuery<"public
|
|
|
155
158
|
itemCount?: number | undefined;
|
|
156
159
|
estimatedLoads?: number | undefined;
|
|
157
160
|
whitesSeparate?: boolean | undefined;
|
|
161
|
+
bagCardNumber?: string | undefined;
|
|
158
162
|
notes?: string | undefined;
|
|
159
163
|
deliveryAddress?: string | undefined;
|
|
160
164
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -163,6 +167,7 @@ export declare const getPending: import("convex/server").RegisteredQuery<"public
|
|
|
163
167
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
164
168
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
165
169
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
170
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
166
171
|
createdAt: number;
|
|
167
172
|
isDeleted: boolean;
|
|
168
173
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -176,7 +181,6 @@ export declare const getPending: import("convex/server").RegisteredQuery<"public
|
|
|
176
181
|
basePrice: number;
|
|
177
182
|
totalPrice: number;
|
|
178
183
|
finalPrice: number;
|
|
179
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
180
184
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
181
185
|
updatedAt: number;
|
|
182
186
|
statusHistory: {
|
|
@@ -190,6 +194,7 @@ export declare const getPending: import("convex/server").RegisteredQuery<"public
|
|
|
190
194
|
* Create walk-in order (attendant creates at POS)
|
|
191
195
|
*/
|
|
192
196
|
export declare const createWalkIn: import("convex/server").RegisteredMutation<"public", {
|
|
197
|
+
bagCardNumber?: string | undefined;
|
|
193
198
|
notes?: string | undefined;
|
|
194
199
|
deliveryAddress?: string | undefined;
|
|
195
200
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -207,6 +212,7 @@ export declare const createWalkIn: import("convex/server").RegisteredMutation<"p
|
|
|
207
212
|
export declare const createOnline: import("convex/server").RegisteredMutation<"public", {
|
|
208
213
|
estimatedLoads?: number | undefined;
|
|
209
214
|
whitesSeparate?: boolean | undefined;
|
|
215
|
+
bagCardNumber?: string | undefined;
|
|
210
216
|
notes?: string | undefined;
|
|
211
217
|
deliveryAddress?: string | undefined;
|
|
212
218
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -228,6 +234,7 @@ export declare const createOnline: import("convex/server").RegisteredMutation<"p
|
|
|
228
234
|
* Update order weight (when customer drops off online order)
|
|
229
235
|
*/
|
|
230
236
|
export declare const updateWeight: import("convex/server").RegisteredMutation<"public", {
|
|
237
|
+
bagCardNumber?: string | undefined;
|
|
231
238
|
actualWeight: number;
|
|
232
239
|
itemCount: number;
|
|
233
240
|
orderId: import("convex/values").GenericId<"orders">;
|
|
@@ -247,4 +254,73 @@ export declare const cancel: import("convex/server").RegisteredMutation<"public"
|
|
|
247
254
|
reason?: string | undefined;
|
|
248
255
|
orderId: import("convex/values").GenericId<"orders">;
|
|
249
256
|
}, Promise<import("convex/values").GenericId<"orders">>>;
|
|
257
|
+
/**
|
|
258
|
+
* Get order statistics summary
|
|
259
|
+
*/
|
|
260
|
+
export declare const getStats: import("convex/server").RegisteredQuery<"public", {
|
|
261
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
262
|
+
startDate?: number | undefined;
|
|
263
|
+
endDate?: number | undefined;
|
|
264
|
+
}, Promise<{
|
|
265
|
+
total: number;
|
|
266
|
+
byStatus: Record<string, number>;
|
|
267
|
+
byType: Record<string, number>;
|
|
268
|
+
byServiceType: Record<string, number>;
|
|
269
|
+
totalRevenue: number;
|
|
270
|
+
averageOrderValue: number;
|
|
271
|
+
totalWeight: number;
|
|
272
|
+
averageWeight: number;
|
|
273
|
+
}>>;
|
|
274
|
+
/**
|
|
275
|
+
* Get orders by date range with detailed filtering
|
|
276
|
+
*/
|
|
277
|
+
export declare const getByDateRange: import("convex/server").RegisteredQuery<"public", {
|
|
278
|
+
status?: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled" | undefined;
|
|
279
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
280
|
+
orderType?: "walk_in" | "online" | undefined;
|
|
281
|
+
serviceType?: "wash_only" | "wash_and_dry" | "dry_only" | undefined;
|
|
282
|
+
limit?: number | undefined;
|
|
283
|
+
startDate: number;
|
|
284
|
+
endDate: number;
|
|
285
|
+
}, Promise<{
|
|
286
|
+
_id: import("convex/values").GenericId<"orders">;
|
|
287
|
+
_creationTime: number;
|
|
288
|
+
createdBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
289
|
+
estimatedWeight?: number | undefined;
|
|
290
|
+
actualWeight?: number | undefined;
|
|
291
|
+
itemCount?: number | undefined;
|
|
292
|
+
estimatedLoads?: number | undefined;
|
|
293
|
+
whitesSeparate?: boolean | undefined;
|
|
294
|
+
bagCardNumber?: string | undefined;
|
|
295
|
+
notes?: string | undefined;
|
|
296
|
+
deliveryAddress?: string | undefined;
|
|
297
|
+
deliveryPhoneNumber?: string | undefined;
|
|
298
|
+
deliveryHall?: string | undefined;
|
|
299
|
+
deliveryRoom?: string | undefined;
|
|
300
|
+
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
301
|
+
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
302
|
+
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
303
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
304
|
+
createdAt: number;
|
|
305
|
+
isDeleted: boolean;
|
|
306
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
307
|
+
deliveryFee: number;
|
|
308
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
309
|
+
customerPhoneNumber: string;
|
|
310
|
+
orderNumber: string;
|
|
311
|
+
orderType: "walk_in" | "online";
|
|
312
|
+
serviceType: "wash_only" | "wash_and_dry" | "dry_only";
|
|
313
|
+
isDelivery: boolean;
|
|
314
|
+
basePrice: number;
|
|
315
|
+
totalPrice: number;
|
|
316
|
+
finalPrice: number;
|
|
317
|
+
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
318
|
+
updatedAt: number;
|
|
319
|
+
statusHistory: {
|
|
320
|
+
notes?: string | undefined;
|
|
321
|
+
status: string;
|
|
322
|
+
changedAt: number;
|
|
323
|
+
changedBy: import("convex/values").GenericId<"attendants">;
|
|
324
|
+
}[];
|
|
325
|
+
}[]>>;
|
|
250
326
|
//# sourceMappingURL=orders.d.ts.map
|
package/convex/payments.d.ts
CHANGED
|
@@ -15,10 +15,10 @@ export declare const getByOrder: import("convex/server").RegisteredQuery<"public
|
|
|
15
15
|
gatewayResponse?: string | undefined;
|
|
16
16
|
completedAt?: number | undefined;
|
|
17
17
|
processedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
18
|
+
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
18
19
|
createdAt: number;
|
|
19
20
|
isDeleted: boolean;
|
|
20
21
|
customerId: import("convex/values").GenericId<"users">;
|
|
21
|
-
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
22
22
|
paymentMethod: "mobile_money" | "card" | "cash";
|
|
23
23
|
orderId: import("convex/values").GenericId<"orders">;
|
|
24
24
|
amount: number;
|
|
@@ -36,10 +36,10 @@ export declare const getByCustomer: import("convex/server").RegisteredQuery<"pub
|
|
|
36
36
|
gatewayResponse?: string | undefined;
|
|
37
37
|
completedAt?: number | undefined;
|
|
38
38
|
processedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
39
|
+
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
39
40
|
createdAt: number;
|
|
40
41
|
isDeleted: boolean;
|
|
41
42
|
customerId: import("convex/values").GenericId<"users">;
|
|
42
|
-
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
43
43
|
paymentMethod: "mobile_money" | "card" | "cash";
|
|
44
44
|
orderId: import("convex/values").GenericId<"orders">;
|
|
45
45
|
amount: number;
|
|
@@ -86,4 +86,49 @@ export declare const refund: import("convex/server").RegisteredMutation<"public"
|
|
|
86
86
|
reason?: string | undefined;
|
|
87
87
|
paymentId: import("convex/values").GenericId<"payments">;
|
|
88
88
|
}, Promise<import("convex/values").GenericId<"payments">>>;
|
|
89
|
+
/**
|
|
90
|
+
* Get transaction history - Paginated
|
|
91
|
+
* Supports usePaginatedQuery for infinite scroll
|
|
92
|
+
*/
|
|
93
|
+
export declare const getTransactionHistory: import("convex/server").RegisteredQuery<"public", {
|
|
94
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
95
|
+
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
96
|
+
cursor?: string | undefined;
|
|
97
|
+
numItems?: number | undefined;
|
|
98
|
+
startDate?: number | undefined;
|
|
99
|
+
endDate?: number | undefined;
|
|
100
|
+
}, Promise<{
|
|
101
|
+
page: {
|
|
102
|
+
_id: import("convex/values").GenericId<"payments">;
|
|
103
|
+
_creationTime: number;
|
|
104
|
+
gatewayTransactionId?: string | undefined;
|
|
105
|
+
gatewayResponse?: string | undefined;
|
|
106
|
+
completedAt?: number | undefined;
|
|
107
|
+
processedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
108
|
+
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
109
|
+
createdAt: number;
|
|
110
|
+
isDeleted: boolean;
|
|
111
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
112
|
+
paymentMethod: "mobile_money" | "card" | "cash";
|
|
113
|
+
orderId: import("convex/values").GenericId<"orders">;
|
|
114
|
+
amount: number;
|
|
115
|
+
currency: string;
|
|
116
|
+
}[];
|
|
117
|
+
isDone: boolean;
|
|
118
|
+
continueCursor: string;
|
|
119
|
+
}>>;
|
|
120
|
+
/**
|
|
121
|
+
* Get transaction summary statistics
|
|
122
|
+
*/
|
|
123
|
+
export declare const getTransactionSummary: import("convex/server").RegisteredQuery<"public", {
|
|
124
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
125
|
+
startDate?: number | undefined;
|
|
126
|
+
endDate?: number | undefined;
|
|
127
|
+
}, Promise<{
|
|
128
|
+
totalTransactions: number;
|
|
129
|
+
totalAmount: number;
|
|
130
|
+
averageTransaction: number;
|
|
131
|
+
byMethod: Record<string, number>;
|
|
132
|
+
byStatus: Record<string, number>;
|
|
133
|
+
}>>;
|
|
89
134
|
//# sourceMappingURL=payments.d.ts.map
|
package/convex/resources.d.ts
CHANGED
|
@@ -85,4 +85,35 @@ export declare const logUsage: import("convex/server").RegisteredMutation<"publi
|
|
|
85
85
|
detergentUnits: number;
|
|
86
86
|
tokensUsed: number;
|
|
87
87
|
}, Promise<Id<"resourceUsageLogs">>>;
|
|
88
|
+
/**
|
|
89
|
+
* Get resource usage summary for date range
|
|
90
|
+
*/
|
|
91
|
+
export declare const getUsageSummary: import("convex/server").RegisteredQuery<"public", {
|
|
92
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
93
|
+
startDate?: string | undefined;
|
|
94
|
+
endDate?: string | undefined;
|
|
95
|
+
}, Promise<{
|
|
96
|
+
totals: {
|
|
97
|
+
detergentUnits: number;
|
|
98
|
+
tokensUsed: number;
|
|
99
|
+
waterCycles: number;
|
|
100
|
+
};
|
|
101
|
+
averagePerDay: {
|
|
102
|
+
detergentUnits: number;
|
|
103
|
+
tokensUsed: number;
|
|
104
|
+
waterCycles: number;
|
|
105
|
+
};
|
|
106
|
+
usageByDay: Record<string, {
|
|
107
|
+
detergentUnits: number;
|
|
108
|
+
tokensUsed: number;
|
|
109
|
+
waterCycles: number;
|
|
110
|
+
logCount: number;
|
|
111
|
+
}>;
|
|
112
|
+
totalLogs: number;
|
|
113
|
+
uniqueDays: number;
|
|
114
|
+
dateRange: {
|
|
115
|
+
start: string | undefined;
|
|
116
|
+
end: string | undefined;
|
|
117
|
+
};
|
|
118
|
+
}>>;
|
|
88
119
|
//# sourceMappingURL=resources.d.ts.map
|
package/convex/schema.d.ts
CHANGED
|
@@ -8,12 +8,16 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
8
8
|
users: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
9
9
|
email?: string | undefined;
|
|
10
10
|
clerkUserId?: string | undefined;
|
|
11
|
+
statusNote?: string | undefined;
|
|
12
|
+
statusChangedBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
13
|
+
statusChangedAt?: number | undefined;
|
|
11
14
|
lastLoginAt?: number | undefined;
|
|
12
15
|
preferredBranchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
13
16
|
phoneNumber: string;
|
|
14
17
|
name: string;
|
|
15
18
|
isRegistered: boolean;
|
|
16
19
|
isVerified: boolean;
|
|
20
|
+
status: "active" | "blocked" | "suspended" | "restricted";
|
|
17
21
|
createdAt: number;
|
|
18
22
|
isDeleted: boolean;
|
|
19
23
|
}, {
|
|
@@ -23,14 +27,19 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
23
27
|
clerkUserId: import("convex/values").VString<string | undefined, "optional">;
|
|
24
28
|
isRegistered: import("convex/values").VBoolean<boolean, "required">;
|
|
25
29
|
isVerified: import("convex/values").VBoolean<boolean, "required">;
|
|
30
|
+
status: import("convex/values").VUnion<"active" | "blocked" | "suspended" | "restricted", [import("convex/values").VLiteral<"active", "required">, import("convex/values").VLiteral<"blocked", "required">, import("convex/values").VLiteral<"suspended", "required">, import("convex/values").VLiteral<"restricted", "required">], "required", never>;
|
|
31
|
+
statusNote: import("convex/values").VString<string | undefined, "optional">;
|
|
32
|
+
statusChangedBy: import("convex/values").VId<import("convex/values").GenericId<"admins"> | undefined, "optional">;
|
|
33
|
+
statusChangedAt: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
26
34
|
createdAt: import("convex/values").VFloat64<number, "required">;
|
|
27
35
|
lastLoginAt: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
28
36
|
preferredBranchId: import("convex/values").VId<import("convex/values").GenericId<"branches"> | undefined, "optional">;
|
|
29
37
|
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
30
|
-
}, "required", "phoneNumber" | "email" | "name" | "clerkUserId" | "isRegistered" | "isVerified" | "createdAt" | "lastLoginAt" | "preferredBranchId" | "isDeleted">, {
|
|
38
|
+
}, "required", "phoneNumber" | "email" | "name" | "clerkUserId" | "isRegistered" | "isVerified" | "status" | "statusNote" | "statusChangedBy" | "statusChangedAt" | "createdAt" | "lastLoginAt" | "preferredBranchId" | "isDeleted">, {
|
|
31
39
|
by_phone: ["phoneNumber", "_creationTime"];
|
|
32
40
|
by_email: ["email", "_creationTime"];
|
|
33
41
|
by_clerk_user: ["clerkUserId", "_creationTime"];
|
|
42
|
+
by_status: ["status", "_creationTime"];
|
|
34
43
|
}, {}, {}>;
|
|
35
44
|
attendants: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
36
45
|
lastLoginAt?: number | undefined;
|
|
@@ -87,6 +96,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
87
96
|
createdAt: number;
|
|
88
97
|
isDeleted: boolean;
|
|
89
98
|
isActive: boolean;
|
|
99
|
+
code: string;
|
|
90
100
|
address: string;
|
|
91
101
|
city: string;
|
|
92
102
|
country: string;
|
|
@@ -95,6 +105,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
95
105
|
createdBy: import("convex/values").GenericId<"admins">;
|
|
96
106
|
}, {
|
|
97
107
|
name: import("convex/values").VString<string, "required">;
|
|
108
|
+
code: import("convex/values").VString<string, "required">;
|
|
98
109
|
address: import("convex/values").VString<string, "required">;
|
|
99
110
|
city: import("convex/values").VString<string, "required">;
|
|
100
111
|
country: import("convex/values").VString<string, "required">;
|
|
@@ -106,9 +117,10 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
106
117
|
createdAt: import("convex/values").VFloat64<number, "required">;
|
|
107
118
|
createdBy: import("convex/values").VId<import("convex/values").GenericId<"admins">, "required">;
|
|
108
119
|
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
109
|
-
}, "required", "phoneNumber" | "email" | "name" | "createdAt" | "isDeleted" | "isActive" | "address" | "city" | "country" | "pricingPerKg" | "deliveryFee" | "createdBy">, {
|
|
120
|
+
}, "required", "phoneNumber" | "email" | "name" | "createdAt" | "isDeleted" | "isActive" | "code" | "address" | "city" | "country" | "pricingPerKg" | "deliveryFee" | "createdBy">, {
|
|
110
121
|
by_city: ["city", "_creationTime"];
|
|
111
122
|
by_active: ["isActive", "_creationTime"];
|
|
123
|
+
by_code: ["code", "_creationTime"];
|
|
112
124
|
}, {}, {}>;
|
|
113
125
|
orders: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
114
126
|
createdBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
@@ -117,6 +129,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
117
129
|
itemCount?: number | undefined;
|
|
118
130
|
estimatedLoads?: number | undefined;
|
|
119
131
|
whitesSeparate?: boolean | undefined;
|
|
132
|
+
bagCardNumber?: string | undefined;
|
|
120
133
|
notes?: string | undefined;
|
|
121
134
|
deliveryAddress?: string | undefined;
|
|
122
135
|
deliveryPhoneNumber?: string | undefined;
|
|
@@ -125,6 +138,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
125
138
|
paymentMethod?: "mobile_money" | "card" | "cash" | undefined;
|
|
126
139
|
paymentId?: import("convex/values").GenericId<"payments"> | undefined;
|
|
127
140
|
fulfilledBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
141
|
+
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
128
142
|
createdAt: number;
|
|
129
143
|
isDeleted: boolean;
|
|
130
144
|
branchId: import("convex/values").GenericId<"branches">;
|
|
@@ -138,7 +152,6 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
138
152
|
basePrice: number;
|
|
139
153
|
totalPrice: number;
|
|
140
154
|
finalPrice: number;
|
|
141
|
-
status: "pending" | "in_progress" | "ready_for_pickup" | "delivered" | "completed" | "cancelled";
|
|
142
155
|
paymentStatus: "pending" | "paid" | "failed" | "refunded";
|
|
143
156
|
updatedAt: number;
|
|
144
157
|
statusHistory: {
|
|
@@ -159,6 +172,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
159
172
|
itemCount: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
160
173
|
estimatedLoads: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
161
174
|
whitesSeparate: import("convex/values").VBoolean<boolean | undefined, "optional">;
|
|
175
|
+
bagCardNumber: import("convex/values").VString<string | undefined, "optional">;
|
|
162
176
|
notes: import("convex/values").VString<string | undefined, "optional">;
|
|
163
177
|
isDelivery: import("convex/values").VBoolean<boolean, "required">;
|
|
164
178
|
deliveryAddress: import("convex/values").VString<string | undefined, "optional">;
|
|
@@ -192,9 +206,9 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
192
206
|
changedAt: import("convex/values").VFloat64<number, "required">;
|
|
193
207
|
changedBy: import("convex/values").VId<import("convex/values").GenericId<"attendants">, "required">;
|
|
194
208
|
notes: import("convex/values").VString<string | undefined, "optional">;
|
|
195
|
-
}, "required", "
|
|
209
|
+
}, "required", "status" | "notes" | "changedAt" | "changedBy">, "required">;
|
|
196
210
|
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
197
|
-
}, "required", "createdAt" | "isDeleted" | "branchId" | "deliveryFee" | "createdBy" | "customerId" | "customerPhoneNumber" | "orderNumber" | "orderType" | "serviceType" | "estimatedWeight" | "actualWeight" | "itemCount" | "estimatedLoads" | "whitesSeparate" | "notes" | "isDelivery" | "deliveryAddress" | "deliveryPhoneNumber" | "deliveryHall" | "deliveryRoom" | "basePrice" | "totalPrice" | "finalPrice" | "
|
|
211
|
+
}, "required", "status" | "createdAt" | "isDeleted" | "branchId" | "deliveryFee" | "createdBy" | "customerId" | "customerPhoneNumber" | "orderNumber" | "orderType" | "serviceType" | "estimatedWeight" | "actualWeight" | "itemCount" | "estimatedLoads" | "whitesSeparate" | "bagCardNumber" | "notes" | "isDelivery" | "deliveryAddress" | "deliveryPhoneNumber" | "deliveryHall" | "deliveryRoom" | "basePrice" | "totalPrice" | "finalPrice" | "paymentStatus" | "paymentMethod" | "paymentId" | "updatedAt" | "fulfilledBy" | "statusHistory">, {
|
|
198
212
|
by_customer: ["customerId", "_creationTime"];
|
|
199
213
|
by_branch: ["branchId", "_creationTime"];
|
|
200
214
|
by_status: ["status", "_creationTime"];
|
|
@@ -208,10 +222,10 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
208
222
|
gatewayResponse?: string | undefined;
|
|
209
223
|
completedAt?: number | undefined;
|
|
210
224
|
processedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
225
|
+
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
211
226
|
createdAt: number;
|
|
212
227
|
isDeleted: boolean;
|
|
213
228
|
customerId: import("convex/values").GenericId<"users">;
|
|
214
|
-
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
215
229
|
paymentMethod: "mobile_money" | "card" | "cash";
|
|
216
230
|
orderId: import("convex/values").GenericId<"orders">;
|
|
217
231
|
amount: number;
|
|
@@ -229,7 +243,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
229
243
|
completedAt: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
230
244
|
processedBy: import("convex/values").VId<import("convex/values").GenericId<"attendants"> | undefined, "optional">;
|
|
231
245
|
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
232
|
-
}, "required", "
|
|
246
|
+
}, "required", "status" | "createdAt" | "isDeleted" | "customerId" | "paymentMethod" | "orderId" | "amount" | "currency" | "gatewayTransactionId" | "gatewayResponse" | "completedAt" | "processedBy">, {
|
|
233
247
|
by_order: ["orderId", "_creationTime"];
|
|
234
248
|
by_customer: ["customerId", "_creationTime"];
|
|
235
249
|
by_status: ["status", "_creationTime"];
|
|
@@ -258,9 +272,9 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
258
272
|
createdBy?: import("convex/values").GenericId<"admins"> | undefined;
|
|
259
273
|
orderId?: import("convex/values").GenericId<"orders"> | undefined;
|
|
260
274
|
description?: string | undefined;
|
|
275
|
+
type: "earned" | "redeemed" | "expired" | "adjusted";
|
|
261
276
|
createdAt: number;
|
|
262
277
|
isDeleted: boolean;
|
|
263
|
-
type: "earned" | "redeemed" | "expired" | "adjusted";
|
|
264
278
|
customerId: import("convex/values").GenericId<"users">;
|
|
265
279
|
points: number;
|
|
266
280
|
balanceAfter: number;
|
|
@@ -274,7 +288,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
274
288
|
createdAt: import("convex/values").VFloat64<number, "required">;
|
|
275
289
|
createdBy: import("convex/values").VId<import("convex/values").GenericId<"admins"> | undefined, "optional">;
|
|
276
290
|
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
277
|
-
}, "required", "
|
|
291
|
+
}, "required", "type" | "createdAt" | "isDeleted" | "createdBy" | "customerId" | "orderId" | "points" | "balanceAfter" | "description">, {
|
|
278
292
|
by_customer: ["customerId", "_creationTime"];
|
|
279
293
|
by_order: ["orderId", "_creationTime"];
|
|
280
294
|
by_created: ["createdAt", "_creationTime"];
|
|
@@ -364,6 +378,73 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
364
378
|
by_timestamp: ["timestamp", "_creationTime"];
|
|
365
379
|
by_branch: ["branchId", "_creationTime"];
|
|
366
380
|
}, {}, {}>;
|
|
381
|
+
vouchers: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
382
|
+
name?: string | undefined;
|
|
383
|
+
description?: string | undefined;
|
|
384
|
+
maxUsesPerCustomer?: number | undefined;
|
|
385
|
+
validFrom?: number | undefined;
|
|
386
|
+
validUntil?: number | undefined;
|
|
387
|
+
minOrderValue?: number | undefined;
|
|
388
|
+
applicableBranches?: import("convex/values").GenericId<"branches">[] | undefined;
|
|
389
|
+
applicableServiceTypes?: ("wash_only" | "wash_and_dry" | "dry_only")[] | undefined;
|
|
390
|
+
createdAt: number;
|
|
391
|
+
isDeleted: boolean;
|
|
392
|
+
isActive: boolean;
|
|
393
|
+
code: string;
|
|
394
|
+
createdBy: import("convex/values").GenericId<"admins">;
|
|
395
|
+
discountType: "percentage" | "fixed" | "free_wash";
|
|
396
|
+
discountValue: number;
|
|
397
|
+
usageLimit: number;
|
|
398
|
+
usedCount: number;
|
|
399
|
+
}, {
|
|
400
|
+
code: import("convex/values").VString<string, "required">;
|
|
401
|
+
name: import("convex/values").VString<string | undefined, "optional">;
|
|
402
|
+
discountType: import("convex/values").VUnion<"percentage" | "fixed" | "free_wash", [import("convex/values").VLiteral<"percentage", "required">, import("convex/values").VLiteral<"fixed", "required">, import("convex/values").VLiteral<"free_wash", "required">], "required", never>;
|
|
403
|
+
discountValue: import("convex/values").VFloat64<number, "required">;
|
|
404
|
+
usageLimit: import("convex/values").VFloat64<number, "required">;
|
|
405
|
+
usedCount: import("convex/values").VFloat64<number, "required">;
|
|
406
|
+
maxUsesPerCustomer: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
407
|
+
isActive: import("convex/values").VBoolean<boolean, "required">;
|
|
408
|
+
validFrom: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
409
|
+
validUntil: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
410
|
+
minOrderValue: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
411
|
+
applicableBranches: import("convex/values").VArray<import("convex/values").GenericId<"branches">[] | undefined, import("convex/values").VId<import("convex/values").GenericId<"branches">, "required">, "optional">;
|
|
412
|
+
applicableServiceTypes: import("convex/values").VArray<("wash_only" | "wash_and_dry" | "dry_only")[] | undefined, import("convex/values").VUnion<"wash_only" | "wash_and_dry" | "dry_only", [import("convex/values").VLiteral<"wash_only", "required">, import("convex/values").VLiteral<"wash_and_dry", "required">, import("convex/values").VLiteral<"dry_only", "required">], "required", never>, "optional">;
|
|
413
|
+
createdAt: import("convex/values").VFloat64<number, "required">;
|
|
414
|
+
createdBy: import("convex/values").VId<import("convex/values").GenericId<"admins">, "required">;
|
|
415
|
+
description: import("convex/values").VString<string | undefined, "optional">;
|
|
416
|
+
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
417
|
+
}, "required", "name" | "createdAt" | "isDeleted" | "isActive" | "code" | "createdBy" | "description" | "discountType" | "discountValue" | "usageLimit" | "usedCount" | "maxUsesPerCustomer" | "validFrom" | "validUntil" | "minOrderValue" | "applicableBranches" | "applicableServiceTypes">, {
|
|
418
|
+
by_code: ["code", "_creationTime"];
|
|
419
|
+
by_active: ["isActive", "_creationTime"];
|
|
420
|
+
by_created: ["createdAt", "_creationTime"];
|
|
421
|
+
}, {}, {}>;
|
|
422
|
+
voucherUsages: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
423
|
+
usedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
424
|
+
isDeleted: boolean;
|
|
425
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
426
|
+
orderId: import("convex/values").GenericId<"orders">;
|
|
427
|
+
voucherId: import("convex/values").GenericId<"vouchers">;
|
|
428
|
+
discountAmount: number;
|
|
429
|
+
orderTotalBefore: number;
|
|
430
|
+
orderTotalAfter: number;
|
|
431
|
+
usedAt: number;
|
|
432
|
+
}, {
|
|
433
|
+
voucherId: import("convex/values").VId<import("convex/values").GenericId<"vouchers">, "required">;
|
|
434
|
+
orderId: import("convex/values").VId<import("convex/values").GenericId<"orders">, "required">;
|
|
435
|
+
customerId: import("convex/values").VId<import("convex/values").GenericId<"users">, "required">;
|
|
436
|
+
discountAmount: import("convex/values").VFloat64<number, "required">;
|
|
437
|
+
orderTotalBefore: import("convex/values").VFloat64<number, "required">;
|
|
438
|
+
orderTotalAfter: import("convex/values").VFloat64<number, "required">;
|
|
439
|
+
usedAt: import("convex/values").VFloat64<number, "required">;
|
|
440
|
+
usedBy: import("convex/values").VId<import("convex/values").GenericId<"attendants"> | undefined, "optional">;
|
|
441
|
+
isDeleted: import("convex/values").VBoolean<boolean, "required">;
|
|
442
|
+
}, "required", "isDeleted" | "customerId" | "orderId" | "voucherId" | "discountAmount" | "orderTotalBefore" | "orderTotalAfter" | "usedAt" | "usedBy">, {
|
|
443
|
+
by_voucher: ["voucherId", "_creationTime"];
|
|
444
|
+
by_order: ["orderId", "_creationTime"];
|
|
445
|
+
by_customer: ["customerId", "_creationTime"];
|
|
446
|
+
by_used_at: ["usedAt", "_creationTime"];
|
|
447
|
+
}, {}, {}>;
|
|
367
448
|
}, true>;
|
|
368
449
|
export default _default;
|
|
369
450
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devlider001/washlab-backend",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Washlab backend - Convex API package for Lider Technology Ltd",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"license": "ISC",
|
|
50
50
|
"type": "module",
|
|
51
51
|
"dependencies": {
|
|
52
|
+
"@clerk/clerk-sdk-node": "^4.13.23",
|
|
52
53
|
"convex": "^1.31.2"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|