@devlider001/washlab-backend 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/convex/_generated/api.d.ts +2 -0
  2. package/convex/admin.d.ts +1 -1
  3. package/convex/audit.d.ts +39 -0
  4. package/convex/customers.d.ts +12 -5
  5. package/convex/lib/auth.d.ts +24 -1
  6. package/convex/notifications.d.ts +170 -0
  7. package/convex/schema.d.ts +53 -2
  8. package/dist/convex/admin.d.ts +377 -0
  9. package/dist/convex/admin.d.ts.map +1 -0
  10. package/dist/convex/admin.js +959 -0
  11. package/dist/convex/admin.js.map +1 -0
  12. package/dist/convex/analytics.d.ts +87 -0
  13. package/dist/convex/analytics.d.ts.map +1 -0
  14. package/dist/convex/analytics.js +361 -0
  15. package/dist/convex/analytics.js.map +1 -0
  16. package/dist/convex/attendants.d.ts +140 -0
  17. package/dist/convex/attendants.d.ts.map +1 -0
  18. package/dist/convex/attendants.js +337 -0
  19. package/dist/convex/attendants.js.map +1 -0
  20. package/dist/convex/audit.d.ts +158 -0
  21. package/dist/convex/audit.d.ts.map +1 -0
  22. package/dist/convex/audit.js +184 -0
  23. package/dist/convex/audit.js.map +1 -0
  24. package/dist/convex/clerk.d.ts +53 -0
  25. package/dist/convex/clerk.d.ts.map +1 -0
  26. package/dist/convex/clerk.js +316 -0
  27. package/dist/convex/clerk.js.map +1 -0
  28. package/dist/convex/customers.d.ts +224 -0
  29. package/dist/convex/customers.d.ts.map +1 -0
  30. package/dist/convex/customers.js +504 -0
  31. package/dist/convex/customers.js.map +1 -0
  32. package/dist/convex/http.d.ts +3 -0
  33. package/dist/convex/http.d.ts.map +1 -0
  34. package/dist/convex/http.js +115 -0
  35. package/dist/convex/http.js.map +1 -0
  36. package/dist/convex/lib/audit.d.ts +36 -0
  37. package/dist/convex/lib/audit.d.ts.map +1 -0
  38. package/dist/convex/lib/audit.js +59 -0
  39. package/dist/convex/lib/audit.js.map +1 -0
  40. package/dist/convex/lib/auth.d.ts +96 -0
  41. package/dist/convex/lib/auth.d.ts.map +1 -0
  42. package/dist/convex/lib/auth.js +94 -0
  43. package/dist/convex/lib/auth.js.map +1 -0
  44. package/dist/convex/lib/utils.d.ts +38 -0
  45. package/dist/convex/lib/utils.d.ts.map +1 -0
  46. package/dist/convex/lib/utils.js +71 -0
  47. package/dist/convex/lib/utils.js.map +1 -0
  48. package/dist/convex/loyalty.d.ts +82 -0
  49. package/dist/convex/loyalty.d.ts.map +1 -0
  50. package/dist/convex/loyalty.js +286 -0
  51. package/dist/convex/loyalty.js.map +1 -0
  52. package/dist/convex/orders.d.ts +326 -0
  53. package/dist/convex/orders.d.ts.map +1 -0
  54. package/dist/convex/orders.js +570 -0
  55. package/dist/convex/orders.js.map +1 -0
  56. package/dist/convex/payments.d.ts +134 -0
  57. package/dist/convex/payments.d.ts.map +1 -0
  58. package/dist/convex/payments.js +360 -0
  59. package/dist/convex/payments.js.map +1 -0
  60. package/dist/convex/resources.d.ts +119 -0
  61. package/dist/convex/resources.d.ts.map +1 -0
  62. package/dist/convex/resources.js +283 -0
  63. package/dist/convex/resources.js.map +1 -0
  64. package/dist/convex/schema.d.ts +450 -0
  65. package/dist/convex/schema.d.ts.map +1 -0
  66. package/dist/convex/schema.js +347 -0
  67. package/dist/convex/schema.js.map +1 -0
  68. package/dist/convex/vouchers.d.ts +187 -0
  69. package/dist/convex/vouchers.d.ts.map +1 -0
  70. package/dist/convex/vouchers.js +464 -0
  71. package/dist/convex/vouchers.js.map +1 -0
  72. package/dist/src/index.d.ts +9 -0
  73. package/dist/src/index.d.ts.map +1 -0
  74. package/dist/src/index.js +9 -0
  75. package/dist/src/index.js.map +1 -0
  76. package/package.json +5 -3
  77. package/convex/_generated/api.js +0 -23
  78. package/convex/_generated/server.js +0 -93
@@ -0,0 +1,283 @@
1
+ import { query, mutation } from "./_generated/server";
2
+ import { v } from "convex/values";
3
+ import { getCurrentAttendant, verifyAttendantBranch } from "./lib/auth";
4
+ import { createAuditLog } from "./lib/audit";
5
+ import { getCurrentTimestamp, formatDate } from "./lib/utils";
6
+ /**
7
+ * Resource Usage Functions
8
+ *
9
+ * Handles daily resource consumption tracking (detergent, tokens, water cycles).
10
+ * Used by attendants to log daily resource usage at branches.
11
+ */
12
+ /**
13
+ * Get resource usage by branch
14
+ */
15
+ export const getByBranch = query({
16
+ args: {
17
+ branchId: v.id("branches"),
18
+ startDate: v.optional(v.string()), // YYYY-MM-DD
19
+ endDate: v.optional(v.string()), // YYYY-MM-DD
20
+ limit: v.optional(v.number()),
21
+ },
22
+ handler: async (ctx, args) => {
23
+ // Allow both attendants and admins to view
24
+ try {
25
+ const attendant = await getCurrentAttendant(ctx);
26
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
27
+ }
28
+ catch {
29
+ // Try admin access
30
+ const { getCurrentAdmin } = await import("./lib/auth");
31
+ await getCurrentAdmin(ctx);
32
+ }
33
+ const limit = args.limit ?? 100;
34
+ const logs = await ctx.db
35
+ .query("resourceUsageLogs")
36
+ .withIndex("by_branch", (q) => q.eq("branchId", args.branchId))
37
+ .order("desc")
38
+ .take(limit);
39
+ let filtered = logs.filter((l) => !l.isDeleted);
40
+ if (args.startDate) {
41
+ filtered = filtered.filter((l) => l.date >= args.startDate);
42
+ }
43
+ if (args.endDate) {
44
+ filtered = filtered.filter((l) => l.date <= args.endDate);
45
+ }
46
+ return filtered;
47
+ },
48
+ });
49
+ /**
50
+ * Get resource usage by date
51
+ */
52
+ export const getByDate = query({
53
+ args: {
54
+ date: v.string(), // YYYY-MM-DD
55
+ branchId: v.optional(v.id("branches")),
56
+ },
57
+ handler: async (ctx, args) => {
58
+ // Allow both attendants and admins to view
59
+ try {
60
+ if (args.branchId) {
61
+ const attendant = await getCurrentAttendant(ctx);
62
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
63
+ }
64
+ else {
65
+ await getCurrentAttendant(ctx);
66
+ }
67
+ }
68
+ catch {
69
+ // Try admin access
70
+ const { getCurrentAdmin } = await import("./lib/auth");
71
+ await getCurrentAdmin(ctx);
72
+ }
73
+ let logs;
74
+ if (args.branchId) {
75
+ logs = await ctx.db
76
+ .query("resourceUsageLogs")
77
+ .withIndex("by_branch_date", (q) => q.eq("branchId", args.branchId).eq("date", args.date))
78
+ .collect();
79
+ }
80
+ else {
81
+ logs = await ctx.db
82
+ .query("resourceUsageLogs")
83
+ .withIndex("by_date", (q) => q.eq("date", args.date))
84
+ .collect();
85
+ }
86
+ return logs.filter((l) => !l.isDeleted);
87
+ },
88
+ });
89
+ /**
90
+ * Get daily resource report for a branch
91
+ */
92
+ export const getDailyReport = query({
93
+ args: {
94
+ branchId: v.id("branches"),
95
+ date: v.string(), // YYYY-MM-DD
96
+ },
97
+ handler: async (ctx, args) => {
98
+ // Allow both attendants and admins to view
99
+ try {
100
+ const attendant = await getCurrentAttendant(ctx);
101
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
102
+ }
103
+ catch {
104
+ // Try admin access
105
+ const { getCurrentAdmin } = await import("./lib/auth");
106
+ await getCurrentAdmin(ctx);
107
+ }
108
+ const logs = await ctx.db
109
+ .query("resourceUsageLogs")
110
+ .withIndex("by_branch_date", (q) => q.eq("branchId", args.branchId).eq("date", args.date))
111
+ .collect();
112
+ const activeLogs = logs.filter((l) => !l.isDeleted);
113
+ // Aggregate totals
114
+ const totals = activeLogs.reduce((acc, log) => ({
115
+ detergentUnits: acc.detergentUnits + log.detergentUnits,
116
+ tokensUsed: acc.tokensUsed + log.tokensUsed,
117
+ waterCycles: acc.waterCycles + (log.waterCycles || 0),
118
+ }), { detergentUnits: 0, tokensUsed: 0, waterCycles: 0 });
119
+ return {
120
+ date: args.date,
121
+ branchId: args.branchId,
122
+ logs: activeLogs,
123
+ totals,
124
+ logCount: activeLogs.length,
125
+ };
126
+ },
127
+ });
128
+ /**
129
+ * Log daily resource usage
130
+ */
131
+ export const logUsage = mutation({
132
+ args: {
133
+ branchId: v.id("branches"),
134
+ date: v.optional(v.string()), // YYYY-MM-DD, defaults to today
135
+ detergentUnits: v.number(),
136
+ tokensUsed: v.number(),
137
+ waterCycles: v.optional(v.number()),
138
+ notes: v.optional(v.string()),
139
+ },
140
+ handler: async (ctx, args) => {
141
+ const attendant = await getCurrentAttendant(ctx);
142
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
143
+ const date = args.date || formatDate(new Date());
144
+ const now = getCurrentTimestamp();
145
+ // Check if log already exists for this date/branch/attendant
146
+ const existing = await ctx.db
147
+ .query("resourceUsageLogs")
148
+ .withIndex("by_branch_date", (q) => q.eq("branchId", args.branchId).eq("date", date))
149
+ .filter((q) => q.eq(q.field("attendantId"), attendant._id))
150
+ .first();
151
+ let logId;
152
+ if (existing && !existing.isDeleted) {
153
+ // Update existing log
154
+ await ctx.db.patch(existing._id, {
155
+ detergentUnits: args.detergentUnits,
156
+ tokensUsed: args.tokensUsed,
157
+ waterCycles: args.waterCycles,
158
+ notes: args.notes,
159
+ loggedAt: now,
160
+ });
161
+ logId = existing._id;
162
+ }
163
+ else {
164
+ // Create new log
165
+ logId = await ctx.db.insert("resourceUsageLogs", {
166
+ branchId: args.branchId,
167
+ attendantId: attendant._id,
168
+ date,
169
+ detergentUnits: args.detergentUnits,
170
+ tokensUsed: args.tokensUsed,
171
+ waterCycles: args.waterCycles,
172
+ notes: args.notes,
173
+ loggedAt: now,
174
+ isDeleted: false,
175
+ });
176
+ }
177
+ await createAuditLog({
178
+ ctx,
179
+ actorId: attendant._id,
180
+ actorType: "attendant",
181
+ actorRole: "attendant",
182
+ action: "resources.logged",
183
+ entityType: "resourceUsageLog",
184
+ entityId: logId,
185
+ branchId: args.branchId,
186
+ details: JSON.stringify({
187
+ date,
188
+ detergentUnits: args.detergentUnits,
189
+ tokensUsed: args.tokensUsed,
190
+ waterCycles: args.waterCycles,
191
+ }),
192
+ });
193
+ return logId;
194
+ },
195
+ });
196
+ /**
197
+ * Get resource usage summary for date range
198
+ */
199
+ export const getUsageSummary = query({
200
+ args: {
201
+ branchId: v.optional(v.id("branches")),
202
+ startDate: v.optional(v.string()), // YYYY-MM-DD
203
+ endDate: v.optional(v.string()), // YYYY-MM-DD
204
+ },
205
+ handler: async (ctx, args) => {
206
+ // Allow both attendants and admins
207
+ try {
208
+ if (args.branchId) {
209
+ const attendant = await getCurrentAttendant(ctx);
210
+ await verifyAttendantBranch(ctx, attendant._id, args.branchId);
211
+ }
212
+ else {
213
+ await getCurrentAttendant(ctx);
214
+ }
215
+ }
216
+ catch {
217
+ const { getCurrentAdmin } = await import("./lib/auth");
218
+ await getCurrentAdmin(ctx);
219
+ }
220
+ // Get all resource logs
221
+ let logs;
222
+ if (args.branchId) {
223
+ logs = await ctx.db
224
+ .query("resourceUsageLogs")
225
+ .withIndex("by_branch", (q) => q.eq("branchId", args.branchId))
226
+ .collect();
227
+ }
228
+ else {
229
+ logs = await ctx.db.query("resourceUsageLogs").collect();
230
+ }
231
+ let filtered = logs.filter((l) => !l.isDeleted);
232
+ // Filter by date range
233
+ if (args.startDate) {
234
+ filtered = filtered.filter((l) => l.date >= args.startDate);
235
+ }
236
+ if (args.endDate) {
237
+ filtered = filtered.filter((l) => l.date <= args.endDate);
238
+ }
239
+ // Aggregate totals
240
+ const totals = filtered.reduce((acc, log) => ({
241
+ detergentUnits: acc.detergentUnits + log.detergentUnits,
242
+ tokensUsed: acc.tokensUsed + log.tokensUsed,
243
+ waterCycles: acc.waterCycles + (log.waterCycles || 0),
244
+ }), { detergentUnits: 0, tokensUsed: 0, waterCycles: 0 });
245
+ // Usage by day
246
+ const usageByDay = filtered.reduce((acc, log) => {
247
+ if (!acc[log.date]) {
248
+ acc[log.date] = {
249
+ detergentUnits: 0,
250
+ tokensUsed: 0,
251
+ waterCycles: 0,
252
+ logCount: 0,
253
+ };
254
+ }
255
+ acc[log.date].detergentUnits += log.detergentUnits;
256
+ acc[log.date].tokensUsed += log.tokensUsed;
257
+ acc[log.date].waterCycles += (log.waterCycles || 0);
258
+ acc[log.date].logCount += 1;
259
+ return acc;
260
+ }, {});
261
+ // Average per day
262
+ const uniqueDays = Object.keys(usageByDay).length;
263
+ const averagePerDay = uniqueDays > 0
264
+ ? {
265
+ detergentUnits: Math.round((totals.detergentUnits / uniqueDays) * 100) / 100,
266
+ tokensUsed: Math.round((totals.tokensUsed / uniqueDays) * 100) / 100,
267
+ waterCycles: Math.round((totals.waterCycles / uniqueDays) * 100) / 100,
268
+ }
269
+ : { detergentUnits: 0, tokensUsed: 0, waterCycles: 0 };
270
+ return {
271
+ totals,
272
+ averagePerDay,
273
+ usageByDay,
274
+ totalLogs: filtered.length,
275
+ uniqueDays,
276
+ dateRange: {
277
+ start: args.startDate,
278
+ end: args.endDate,
279
+ },
280
+ };
281
+ },
282
+ });
283
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../convex/resources.ts"],"names":[],"mappings":"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"}