@devlider001/washlab-backend 1.0.3 → 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.
@@ -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
- cursor?: string | undefined;
163
- numItems?: number | undefined;
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,6 +347,12 @@ 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">>>;
241
356
  /**
242
357
  * Create admin account
243
358
  * Only super admins can create other admins
@@ -249,4 +364,14 @@ export declare const createAdmin: import("convex/server").RegisteredMutation<"pu
249
364
  clerkUserId: string;
250
365
  role: "super_admin" | "admin";
251
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">>>;
252
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
@@ -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
@@ -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
@@ -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
  }>;
@@ -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;
@@ -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
@@ -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
@@ -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
@@ -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", "notes" | "status" | "changedAt" | "changedBy">, "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" | "status" | "paymentStatus" | "paymentMethod" | "paymentId" | "updatedAt" | "fulfilledBy" | "statusHistory">, {
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", "createdAt" | "isDeleted" | "customerId" | "status" | "paymentMethod" | "orderId" | "amount" | "currency" | "gatewayTransactionId" | "gatewayResponse" | "completedAt" | "processedBy">, {
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", "createdAt" | "isDeleted" | "type" | "createdBy" | "customerId" | "orderId" | "points" | "balanceAfter" | "description">, {
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",
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": {