@devlider001/washlab-backend 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/convex/_generated/api.d.ts +6 -0
  2. package/convex/admin.d.ts +129 -4
  3. package/convex/analytics.d.ts +87 -0
  4. package/convex/attendants.d.ts +40 -0
  5. package/convex/audit.d.ts +39 -0
  6. package/convex/customers.d.ts +69 -1
  7. package/convex/lib/auth.d.ts +4 -0
  8. package/convex/loyalty.d.ts +1 -1
  9. package/convex/notifications.d.ts +170 -0
  10. package/convex/orders.d.ts +80 -4
  11. package/convex/payments.d.ts +47 -2
  12. package/convex/resources.d.ts +31 -0
  13. package/convex/schema.d.ts +141 -9
  14. package/convex/vouchers.d.ts +187 -0
  15. package/dist/convex/admin.d.ts +377 -0
  16. package/dist/convex/admin.d.ts.map +1 -0
  17. package/dist/convex/admin.js +959 -0
  18. package/dist/convex/admin.js.map +1 -0
  19. package/dist/convex/analytics.d.ts +87 -0
  20. package/dist/convex/analytics.d.ts.map +1 -0
  21. package/dist/convex/analytics.js +361 -0
  22. package/dist/convex/analytics.js.map +1 -0
  23. package/dist/convex/attendants.d.ts +140 -0
  24. package/dist/convex/attendants.d.ts.map +1 -0
  25. package/dist/convex/attendants.js +337 -0
  26. package/dist/convex/attendants.js.map +1 -0
  27. package/dist/convex/audit.d.ts +158 -0
  28. package/dist/convex/audit.d.ts.map +1 -0
  29. package/dist/convex/audit.js +184 -0
  30. package/dist/convex/audit.js.map +1 -0
  31. package/dist/convex/clerk.d.ts +53 -0
  32. package/dist/convex/clerk.d.ts.map +1 -0
  33. package/dist/convex/clerk.js +316 -0
  34. package/dist/convex/clerk.js.map +1 -0
  35. package/dist/convex/customers.d.ts +224 -0
  36. package/dist/convex/customers.d.ts.map +1 -0
  37. package/dist/convex/customers.js +504 -0
  38. package/dist/convex/customers.js.map +1 -0
  39. package/dist/convex/http.d.ts +3 -0
  40. package/dist/convex/http.d.ts.map +1 -0
  41. package/dist/convex/http.js +115 -0
  42. package/dist/convex/http.js.map +1 -0
  43. package/dist/convex/lib/audit.d.ts +36 -0
  44. package/dist/convex/lib/audit.d.ts.map +1 -0
  45. package/dist/convex/lib/audit.js +59 -0
  46. package/dist/convex/lib/audit.js.map +1 -0
  47. package/dist/convex/lib/auth.d.ts +96 -0
  48. package/dist/convex/lib/auth.d.ts.map +1 -0
  49. package/dist/convex/lib/auth.js +94 -0
  50. package/dist/convex/lib/auth.js.map +1 -0
  51. package/dist/convex/lib/utils.d.ts +38 -0
  52. package/dist/convex/lib/utils.d.ts.map +1 -0
  53. package/dist/convex/lib/utils.js +71 -0
  54. package/dist/convex/lib/utils.js.map +1 -0
  55. package/dist/convex/loyalty.d.ts +82 -0
  56. package/dist/convex/loyalty.d.ts.map +1 -0
  57. package/dist/convex/loyalty.js +286 -0
  58. package/dist/convex/loyalty.js.map +1 -0
  59. package/dist/convex/orders.d.ts +326 -0
  60. package/dist/convex/orders.d.ts.map +1 -0
  61. package/dist/convex/orders.js +570 -0
  62. package/dist/convex/orders.js.map +1 -0
  63. package/dist/convex/payments.d.ts +134 -0
  64. package/dist/convex/payments.d.ts.map +1 -0
  65. package/dist/convex/payments.js +360 -0
  66. package/dist/convex/payments.js.map +1 -0
  67. package/dist/convex/resources.d.ts +119 -0
  68. package/dist/convex/resources.d.ts.map +1 -0
  69. package/dist/convex/resources.js +283 -0
  70. package/dist/convex/resources.js.map +1 -0
  71. package/dist/convex/schema.d.ts +450 -0
  72. package/dist/convex/schema.d.ts.map +1 -0
  73. package/dist/convex/schema.js +347 -0
  74. package/dist/convex/schema.js.map +1 -0
  75. package/dist/convex/vouchers.d.ts +187 -0
  76. package/dist/convex/vouchers.d.ts.map +1 -0
  77. package/dist/convex/vouchers.js +464 -0
  78. package/dist/convex/vouchers.js.map +1 -0
  79. package/dist/src/index.d.ts +9 -0
  80. package/dist/src/index.d.ts.map +1 -0
  81. package/dist/src/index.js +9 -0
  82. package/dist/src/index.js.map +1 -0
  83. package/package.json +4 -3
@@ -0,0 +1,570 @@
1
+ import { query, mutation } from "./_generated/server";
2
+ import { v } from "convex/values";
3
+ import { getCurrentCustomer, getCurrentAttendant, verifyAttendantBranch, } from "./lib/auth";
4
+ import { generateOrderNumber, calculateOrderPrice, calculateServicePrice, getCurrentTimestamp } from "./lib/utils";
5
+ import { logOrderStatusChange } from "./lib/audit";
6
+ import { internal } from "./_generated/api";
7
+ /**
8
+ * Order Functions
9
+ *
10
+ * Handles order creation (walk-in and online), status updates, and queries.
11
+ */
12
+ /**
13
+ * Get order by order number
14
+ */
15
+ export const getByOrderNumber = query({
16
+ args: {
17
+ orderNumber: v.string(),
18
+ },
19
+ handler: async (ctx, args) => {
20
+ const order = await ctx.db
21
+ .query("orders")
22
+ .withIndex("by_order_number", (q) => q.eq("orderNumber", args.orderNumber))
23
+ .first();
24
+ if (!order || order.isDeleted) {
25
+ return null;
26
+ }
27
+ return order;
28
+ },
29
+ });
30
+ /**
31
+ * Get orders by customer (from authenticated session)
32
+ */
33
+ export const getByCustomer = query({
34
+ args: {
35
+ limit: v.optional(v.number()),
36
+ status: v.optional(v.union(v.literal("pending"), v.literal("in_progress"), v.literal("ready_for_pickup"), v.literal("delivered"), v.literal("completed"), v.literal("cancelled"))),
37
+ },
38
+ handler: async (ctx, args) => {
39
+ const customer = await getCurrentCustomer(ctx);
40
+ const limit = args.limit ?? 50;
41
+ let query = ctx.db
42
+ .query("orders")
43
+ .withIndex("by_customer", (q) => q.eq("customerId", customer._id))
44
+ .order("desc");
45
+ const orders = await query.take(limit);
46
+ let filtered = orders.filter((o) => !o.isDeleted);
47
+ if (args.status) {
48
+ filtered = filtered.filter((o) => o.status === args.status);
49
+ }
50
+ return filtered;
51
+ },
52
+ });
53
+ /**
54
+ * Get orders by branch (for POS)
55
+ */
56
+ export const getByBranch = query({
57
+ args: {
58
+ branchId: v.id("branches"),
59
+ status: v.optional(v.union(v.literal("pending"), v.literal("in_progress"), v.literal("ready_for_pickup"), v.literal("delivered"), v.literal("completed"), v.literal("cancelled"))),
60
+ limit: v.optional(v.number()),
61
+ },
62
+ handler: async (ctx, args) => {
63
+ const attendant = await getCurrentAttendant(ctx);
64
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
65
+ const limit = args.limit ?? 100;
66
+ let query = ctx.db
67
+ .query("orders")
68
+ .withIndex("by_branch", (q) => q.eq("branchId", args.branchId))
69
+ .order("desc");
70
+ const orders = await query.take(limit);
71
+ let filtered = orders.filter((o) => !o.isDeleted);
72
+ if (args.status) {
73
+ filtered = filtered.filter((o) => o.status === args.status);
74
+ }
75
+ return filtered;
76
+ },
77
+ });
78
+ /**
79
+ * Get pending online orders (awaiting drop-off at POS)
80
+ */
81
+ export const getPending = query({
82
+ args: {
83
+ branchId: v.id("branches"),
84
+ },
85
+ handler: async (ctx, args) => {
86
+ const attendant = await getCurrentAttendant(ctx);
87
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
88
+ const orders = await ctx.db
89
+ .query("orders")
90
+ .withIndex("by_branch", (q) => q.eq("branchId", args.branchId))
91
+ .filter((q) => q.eq(q.field("status"), "pending"))
92
+ .collect();
93
+ return orders.filter((o) => !o.isDeleted && o.orderType === "online");
94
+ },
95
+ });
96
+ /**
97
+ * Create walk-in order (attendant creates at POS)
98
+ */
99
+ export const createWalkIn = mutation({
100
+ args: {
101
+ customerName: v.string(),
102
+ customerPhoneNumber: v.string(),
103
+ branchId: v.id("branches"),
104
+ serviceType: v.union(v.literal("wash_only"), v.literal("wash_and_dry"), v.literal("dry_only")),
105
+ actualWeight: v.number(),
106
+ itemCount: v.number(),
107
+ bagCardNumber: v.optional(v.string()), // Physical bag card number
108
+ isDelivery: v.boolean(),
109
+ deliveryAddress: v.optional(v.string()),
110
+ notes: v.optional(v.string()),
111
+ },
112
+ handler: async (ctx, args) => {
113
+ const attendant = await getCurrentAttendant(ctx);
114
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
115
+ // Get or create customer
116
+ let customer = await ctx.db
117
+ .query("users")
118
+ .withIndex("by_phone", (q) => q.eq("phoneNumber", args.customerPhoneNumber))
119
+ .first();
120
+ if (!customer || customer.isDeleted) {
121
+ // Create guest customer inline
122
+ const customerId = await ctx.db.insert("users", {
123
+ name: args.customerName,
124
+ phoneNumber: args.customerPhoneNumber,
125
+ clerkUserId: undefined,
126
+ isRegistered: false,
127
+ isVerified: false,
128
+ status: "active",
129
+ createdAt: getCurrentTimestamp(),
130
+ isDeleted: false,
131
+ });
132
+ customer = await ctx.db.get(customerId);
133
+ if (!customer)
134
+ throw new Error("Failed to create customer");
135
+ }
136
+ // Check customer status
137
+ if (customer.status === "blocked" || customer.status === "suspended") {
138
+ throw new Error(`Customer account is ${customer.status}. Cannot place orders.`);
139
+ }
140
+ // Get branch for pricing
141
+ const branch = await ctx.db.get(args.branchId);
142
+ if (!branch || branch.isDeleted || !branch.isActive) {
143
+ throw new Error("Branch not found or inactive");
144
+ }
145
+ // Calculate pricing based on service type
146
+ // Estimate loads: assume ~3kg per load
147
+ const estimatedLoads = Math.ceil(args.actualWeight / 3);
148
+ const pricing = calculateServicePrice(args.serviceType, args.actualWeight, estimatedLoads, branch.pricingPerKg, branch.deliveryFee, args.isDelivery);
149
+ // Generate order number
150
+ const orderNumber = generateOrderNumber();
151
+ const now = getCurrentTimestamp();
152
+ // Create order
153
+ const orderId = await ctx.db.insert("orders", {
154
+ customerId: customer._id,
155
+ customerPhoneNumber: args.customerPhoneNumber,
156
+ branchId: args.branchId,
157
+ orderNumber,
158
+ orderType: "walk_in",
159
+ serviceType: args.serviceType,
160
+ actualWeight: args.actualWeight,
161
+ itemCount: args.itemCount,
162
+ estimatedLoads,
163
+ bagCardNumber: args.bagCardNumber,
164
+ notes: args.notes,
165
+ isDelivery: args.isDelivery,
166
+ deliveryAddress: args.isDelivery ? args.deliveryAddress : undefined,
167
+ basePrice: pricing.basePrice,
168
+ deliveryFee: pricing.deliveryFee,
169
+ totalPrice: pricing.totalPrice,
170
+ finalPrice: pricing.totalPrice, // No discounts initially
171
+ status: "in_progress",
172
+ paymentStatus: "pending",
173
+ createdAt: now,
174
+ updatedAt: now,
175
+ createdBy: attendant._id,
176
+ fulfilledBy: attendant._id,
177
+ statusHistory: [
178
+ {
179
+ status: "in_progress",
180
+ changedAt: now,
181
+ changedBy: attendant._id,
182
+ },
183
+ ],
184
+ isDeleted: false,
185
+ });
186
+ await logOrderStatusChange(ctx, orderId, attendant._id, "new", "in_progress", args.branchId);
187
+ return orderId;
188
+ },
189
+ });
190
+ /**
191
+ * Create online order (customer creates from website)
192
+ * Supports both guest checkout and authenticated users
193
+ */
194
+ export const createOnline = mutation({
195
+ args: {
196
+ // Customer info (required for guest checkout)
197
+ customerName: v.string(),
198
+ customerPhoneNumber: v.string(),
199
+ // Order details
200
+ branchId: v.id("branches"),
201
+ serviceType: v.union(v.literal("wash_only"), v.literal("wash_and_dry"), v.literal("dry_only")),
202
+ estimatedWeight: v.number(),
203
+ itemCount: v.number(),
204
+ estimatedLoads: v.optional(v.number()),
205
+ whitesSeparate: v.optional(v.boolean()),
206
+ bagCardNumber: v.optional(v.string()), // Physical bag card number (assigned when dropped off)
207
+ // Delivery details
208
+ isDelivery: v.boolean(),
209
+ deliveryAddress: v.optional(v.string()),
210
+ deliveryPhoneNumber: v.optional(v.string()),
211
+ deliveryHall: v.optional(v.string()), // Hall/Hostel name
212
+ deliveryRoom: v.optional(v.string()), // Room number
213
+ notes: v.optional(v.string()),
214
+ },
215
+ handler: async (ctx, args) => {
216
+ // Try to get authenticated customer, otherwise use guest checkout
217
+ let customer;
218
+ let isGuest = false;
219
+ try {
220
+ customer = await getCurrentCustomer(ctx);
221
+ // Verify phone number matches if authenticated
222
+ if (customer.phoneNumber !== args.customerPhoneNumber) {
223
+ throw new Error("Phone number does not match your account");
224
+ }
225
+ }
226
+ catch {
227
+ // Guest checkout - get or create guest customer
228
+ isGuest = true;
229
+ customer = await ctx.db
230
+ .query("users")
231
+ .withIndex("by_phone", (q) => q.eq("phoneNumber", args.customerPhoneNumber))
232
+ .first();
233
+ if (!customer || customer.isDeleted) {
234
+ // Create guest customer
235
+ const customerId = await ctx.db.insert("users", {
236
+ name: args.customerName,
237
+ phoneNumber: args.customerPhoneNumber,
238
+ clerkUserId: undefined,
239
+ isRegistered: false,
240
+ isVerified: false,
241
+ status: "active",
242
+ createdAt: getCurrentTimestamp(),
243
+ isDeleted: false,
244
+ });
245
+ customer = await ctx.db.get(customerId);
246
+ if (!customer)
247
+ throw new Error("Failed to create customer");
248
+ }
249
+ else {
250
+ // Update existing guest customer name if different
251
+ if (customer.name !== args.customerName) {
252
+ await ctx.db.patch(customer._id, { name: args.customerName });
253
+ }
254
+ }
255
+ }
256
+ // Check customer status
257
+ if (customer.status === "blocked" || customer.status === "suspended") {
258
+ throw new Error(`Customer account is ${customer.status}. Cannot place orders.`);
259
+ }
260
+ // Get branch for pricing
261
+ const branch = await ctx.db.get(args.branchId);
262
+ if (!branch || branch.isDeleted || !branch.isActive) {
263
+ throw new Error("Branch not found or inactive");
264
+ }
265
+ // Calculate pricing based on service type
266
+ const pricing = calculateServicePrice(args.serviceType, args.estimatedWeight, args.estimatedLoads ?? 1, branch.pricingPerKg, branch.deliveryFee, args.isDelivery);
267
+ // Generate order number
268
+ const orderNumber = generateOrderNumber();
269
+ const now = getCurrentTimestamp();
270
+ // Create order
271
+ const orderId = await ctx.db.insert("orders", {
272
+ customerId: customer._id,
273
+ customerPhoneNumber: args.customerPhoneNumber,
274
+ branchId: args.branchId,
275
+ orderNumber,
276
+ orderType: "online",
277
+ serviceType: args.serviceType,
278
+ estimatedWeight: args.estimatedWeight,
279
+ itemCount: args.itemCount,
280
+ estimatedLoads: args.estimatedLoads ?? 1,
281
+ whitesSeparate: args.whitesSeparate ?? false,
282
+ bagCardNumber: args.bagCardNumber,
283
+ notes: args.notes,
284
+ isDelivery: args.isDelivery,
285
+ deliveryAddress: args.isDelivery ? args.deliveryAddress : undefined,
286
+ deliveryPhoneNumber: args.isDelivery ? args.deliveryPhoneNumber : undefined,
287
+ deliveryHall: args.isDelivery ? args.deliveryHall : undefined,
288
+ deliveryRoom: args.isDelivery ? args.deliveryRoom : undefined,
289
+ basePrice: pricing.basePrice,
290
+ deliveryFee: pricing.deliveryFee,
291
+ totalPrice: pricing.totalPrice,
292
+ finalPrice: pricing.totalPrice,
293
+ status: "pending",
294
+ paymentStatus: "pending",
295
+ createdAt: now,
296
+ updatedAt: now,
297
+ statusHistory: [],
298
+ isDeleted: false,
299
+ });
300
+ return { orderId, orderNumber, isGuest };
301
+ },
302
+ });
303
+ /**
304
+ * Update order weight (when customer drops off online order)
305
+ */
306
+ export const updateWeight = mutation({
307
+ args: {
308
+ orderId: v.id("orders"),
309
+ actualWeight: v.number(),
310
+ itemCount: v.number(),
311
+ bagCardNumber: v.optional(v.string()), // Physical bag card number
312
+ },
313
+ handler: async (ctx, args) => {
314
+ const attendant = await getCurrentAttendant(ctx);
315
+ const order = await ctx.db.get(args.orderId);
316
+ if (!order || order.isDeleted) {
317
+ throw new Error("Order not found");
318
+ }
319
+ await verifyAttendantBranch(ctx, attendant._id, order.branchId);
320
+ if (order.status !== "pending") {
321
+ throw new Error("Can only update weight for pending orders");
322
+ }
323
+ // Get branch for pricing
324
+ const branch = await ctx.db.get(order.branchId);
325
+ if (!branch || branch.isDeleted) {
326
+ throw new Error("Branch not found");
327
+ }
328
+ // Recalculate pricing
329
+ const pricing = calculateOrderPrice(args.actualWeight, branch.pricingPerKg, branch.deliveryFee, order.isDelivery);
330
+ const now = getCurrentTimestamp();
331
+ // Update order
332
+ const updateData = {
333
+ actualWeight: args.actualWeight,
334
+ itemCount: args.itemCount,
335
+ basePrice: pricing.basePrice,
336
+ totalPrice: pricing.totalPrice,
337
+ finalPrice: pricing.totalPrice,
338
+ updatedAt: now,
339
+ };
340
+ if (args.bagCardNumber !== undefined) {
341
+ updateData.bagCardNumber = args.bagCardNumber;
342
+ }
343
+ await ctx.db.patch(args.orderId, updateData);
344
+ },
345
+ });
346
+ /**
347
+ * Update order status (attendant operation)
348
+ */
349
+ export const updateStatus = mutation({
350
+ args: {
351
+ orderId: v.id("orders"),
352
+ newStatus: v.union(v.literal("in_progress"), v.literal("ready_for_pickup"), v.literal("delivered"), v.literal("completed"), v.literal("cancelled")),
353
+ notes: v.optional(v.string()),
354
+ },
355
+ handler: async (ctx, args) => {
356
+ const attendant = await getCurrentAttendant(ctx);
357
+ const order = await ctx.db.get(args.orderId);
358
+ if (!order || order.isDeleted) {
359
+ throw new Error("Order not found");
360
+ }
361
+ await verifyAttendantBranch(ctx, attendant._id, order.branchId);
362
+ // Validate status transition
363
+ const validTransitions = {
364
+ pending: ["in_progress", "cancelled"],
365
+ in_progress: ["ready_for_pickup", "cancelled"],
366
+ ready_for_pickup: ["delivered", "completed"],
367
+ delivered: ["completed"],
368
+ };
369
+ const allowed = validTransitions[order.status] || [];
370
+ if (!allowed.includes(args.newStatus)) {
371
+ throw new Error(`Invalid status transition from ${order.status} to ${args.newStatus}`);
372
+ }
373
+ const oldStatus = order.status;
374
+ const now = getCurrentTimestamp();
375
+ // Update order
376
+ await ctx.db.patch(args.orderId, {
377
+ status: args.newStatus,
378
+ updatedAt: now,
379
+ fulfilledBy: attendant._id,
380
+ statusHistory: [
381
+ ...order.statusHistory,
382
+ {
383
+ status: args.newStatus,
384
+ changedAt: now,
385
+ changedBy: attendant._id,
386
+ notes: args.notes,
387
+ },
388
+ ],
389
+ });
390
+ await logOrderStatusChange(ctx, args.orderId, attendant._id, oldStatus, args.newStatus, order.branchId, args.notes);
391
+ // If status is completed, trigger loyalty points earning
392
+ if (args.newStatus === "completed") {
393
+ await ctx.runMutation(internal.loyalty.earnPoints, {
394
+ customerId: order.customerId,
395
+ orderId: args.orderId,
396
+ points: 1,
397
+ });
398
+ }
399
+ },
400
+ });
401
+ /**
402
+ * Cancel order
403
+ */
404
+ export const cancel = mutation({
405
+ args: {
406
+ orderId: v.id("orders"),
407
+ reason: v.optional(v.string()),
408
+ },
409
+ handler: async (ctx, args) => {
410
+ // Allow both attendants and admins to cancel
411
+ let attendant;
412
+ try {
413
+ attendant = await getCurrentAttendant(ctx);
414
+ }
415
+ catch {
416
+ // Try admin
417
+ const { getCurrentAdmin } = await import("./lib/auth");
418
+ await getCurrentAdmin(ctx);
419
+ }
420
+ const order = await ctx.db.get(args.orderId);
421
+ if (!order || order.isDeleted) {
422
+ throw new Error("Order not found");
423
+ }
424
+ if (attendant) {
425
+ await verifyAttendantBranch(ctx, attendant._id, order.branchId);
426
+ }
427
+ if (order.status === "completed" || order.status === "cancelled") {
428
+ throw new Error("Cannot cancel completed or already cancelled order");
429
+ }
430
+ const oldStatus = order.status;
431
+ const now = getCurrentTimestamp();
432
+ // Only attendants can cancel orders (schema requires attendant ID)
433
+ if (!attendant) {
434
+ throw new Error("Only attendants or admins can cancel orders");
435
+ }
436
+ await ctx.db.patch(args.orderId, {
437
+ status: "cancelled",
438
+ updatedAt: now,
439
+ statusHistory: [
440
+ ...order.statusHistory,
441
+ {
442
+ status: "cancelled",
443
+ changedAt: now,
444
+ changedBy: attendant._id,
445
+ notes: args.reason,
446
+ },
447
+ ],
448
+ });
449
+ await logOrderStatusChange(ctx, args.orderId, attendant._id, oldStatus, "cancelled", order.branchId, args.reason);
450
+ return args.orderId;
451
+ },
452
+ });
453
+ /**
454
+ * Get order statistics summary
455
+ */
456
+ export const getStats = query({
457
+ args: {
458
+ branchId: v.optional(v.id("branches")),
459
+ startDate: v.optional(v.number()),
460
+ endDate: v.optional(v.number()),
461
+ },
462
+ handler: async (ctx, args) => {
463
+ // Allow both attendants and admins
464
+ try {
465
+ await getCurrentAttendant(ctx);
466
+ }
467
+ catch {
468
+ const { getCurrentAdmin } = await import("./lib/auth");
469
+ await getCurrentAdmin(ctx);
470
+ }
471
+ const now = Date.now();
472
+ const startDate = args.startDate || (now - 30 * 24 * 60 * 60 * 1000);
473
+ const endDate = args.endDate || now;
474
+ // Get all orders
475
+ let orders;
476
+ if (args.branchId) {
477
+ orders = await ctx.db
478
+ .query("orders")
479
+ .withIndex("by_branch", (q) => q.eq("branchId", args.branchId))
480
+ .collect();
481
+ }
482
+ else {
483
+ orders = await ctx.db.query("orders").collect();
484
+ }
485
+ const filtered = orders.filter((o) => !o.isDeleted &&
486
+ o.createdAt >= startDate &&
487
+ o.createdAt <= endDate);
488
+ const stats = {
489
+ total: filtered.length,
490
+ byStatus: filtered.reduce((acc, o) => {
491
+ acc[o.status] = (acc[o.status] || 0) + 1;
492
+ return acc;
493
+ }, {}),
494
+ byType: filtered.reduce((acc, o) => {
495
+ acc[o.orderType] = (acc[o.orderType] || 0) + 1;
496
+ return acc;
497
+ }, {}),
498
+ byServiceType: filtered.reduce((acc, o) => {
499
+ acc[o.serviceType] = (acc[o.serviceType] || 0) + 1;
500
+ return acc;
501
+ }, {}),
502
+ totalRevenue: filtered
503
+ .filter((o) => o.paymentStatus === "paid")
504
+ .reduce((sum, o) => sum + o.finalPrice, 0),
505
+ averageOrderValue: 0,
506
+ totalWeight: filtered.reduce((sum, o) => sum + (o.actualWeight || o.estimatedWeight || 0), 0),
507
+ averageWeight: 0,
508
+ };
509
+ stats.averageOrderValue = stats.total > 0
510
+ ? Math.round((stats.totalRevenue / stats.total) * 100) / 100
511
+ : 0;
512
+ stats.averageWeight = stats.total > 0
513
+ ? Math.round((stats.totalWeight / stats.total) * 100) / 100
514
+ : 0;
515
+ return stats;
516
+ },
517
+ });
518
+ /**
519
+ * Get orders by date range with detailed filtering
520
+ */
521
+ export const getByDateRange = query({
522
+ args: {
523
+ branchId: v.optional(v.id("branches")),
524
+ startDate: v.number(),
525
+ endDate: v.number(),
526
+ status: v.optional(v.union(v.literal("pending"), v.literal("in_progress"), v.literal("ready_for_pickup"), v.literal("delivered"), v.literal("completed"), v.literal("cancelled"))),
527
+ orderType: v.optional(v.union(v.literal("walk_in"), v.literal("online"))),
528
+ serviceType: v.optional(v.union(v.literal("wash_only"), v.literal("wash_and_dry"), v.literal("dry_only"))),
529
+ limit: v.optional(v.number()),
530
+ },
531
+ handler: async (ctx, args) => {
532
+ // Allow both attendants and admins
533
+ try {
534
+ await getCurrentAttendant(ctx);
535
+ }
536
+ catch {
537
+ const { getCurrentAdmin } = await import("./lib/auth");
538
+ await getCurrentAdmin(ctx);
539
+ }
540
+ const limit = args.limit ?? 100;
541
+ // Get all orders
542
+ let orders;
543
+ if (args.branchId) {
544
+ orders = await ctx.db
545
+ .query("orders")
546
+ .withIndex("by_branch", (q) => q.eq("branchId", args.branchId))
547
+ .collect();
548
+ }
549
+ else {
550
+ orders = await ctx.db.query("orders").collect();
551
+ }
552
+ let filtered = orders.filter((o) => !o.isDeleted &&
553
+ o.createdAt >= args.startDate &&
554
+ o.createdAt <= args.endDate);
555
+ // Apply additional filters
556
+ if (args.status) {
557
+ filtered = filtered.filter((o) => o.status === args.status);
558
+ }
559
+ if (args.orderType) {
560
+ filtered = filtered.filter((o) => o.orderType === args.orderType);
561
+ }
562
+ if (args.serviceType) {
563
+ filtered = filtered.filter((o) => o.serviceType === args.serviceType);
564
+ }
565
+ // Sort by creation date (newest first)
566
+ filtered.sort((a, b) => b.createdAt - a.createdAt);
567
+ return filtered.slice(0, limit);
568
+ },
569
+ });
570
+ //# sourceMappingURL=orders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../convex/orders.ts"],"names":[],"mappings":"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"}