@devlider001/washlab-backend 1.0.4 → 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.
- package/convex/_generated/api.d.ts +2 -0
- package/convex/audit.d.ts +39 -0
- package/convex/notifications.d.ts +170 -0
- package/convex/schema.d.ts +51 -0
- package/dist/convex/admin.d.ts +377 -0
- package/dist/convex/admin.d.ts.map +1 -0
- package/dist/convex/admin.js +959 -0
- package/dist/convex/admin.js.map +1 -0
- package/dist/convex/analytics.d.ts +87 -0
- package/dist/convex/analytics.d.ts.map +1 -0
- package/dist/convex/analytics.js +361 -0
- package/dist/convex/analytics.js.map +1 -0
- package/dist/convex/attendants.d.ts +140 -0
- package/dist/convex/attendants.d.ts.map +1 -0
- package/dist/convex/attendants.js +337 -0
- package/dist/convex/attendants.js.map +1 -0
- package/dist/convex/audit.d.ts +158 -0
- package/dist/convex/audit.d.ts.map +1 -0
- package/dist/convex/audit.js +184 -0
- package/dist/convex/audit.js.map +1 -0
- package/dist/convex/clerk.d.ts +53 -0
- package/dist/convex/clerk.d.ts.map +1 -0
- package/dist/convex/clerk.js +316 -0
- package/dist/convex/clerk.js.map +1 -0
- package/dist/convex/customers.d.ts +224 -0
- package/dist/convex/customers.d.ts.map +1 -0
- package/dist/convex/customers.js +504 -0
- package/dist/convex/customers.js.map +1 -0
- package/dist/convex/http.d.ts +3 -0
- package/dist/convex/http.d.ts.map +1 -0
- package/dist/convex/http.js +115 -0
- package/dist/convex/http.js.map +1 -0
- package/dist/convex/lib/audit.d.ts +36 -0
- package/dist/convex/lib/audit.d.ts.map +1 -0
- package/dist/convex/lib/audit.js +59 -0
- package/dist/convex/lib/audit.js.map +1 -0
- package/dist/convex/lib/auth.d.ts +96 -0
- package/dist/convex/lib/auth.d.ts.map +1 -0
- package/dist/convex/lib/auth.js +94 -0
- package/dist/convex/lib/auth.js.map +1 -0
- package/dist/convex/lib/utils.d.ts +38 -0
- package/dist/convex/lib/utils.d.ts.map +1 -0
- package/dist/convex/lib/utils.js +71 -0
- package/dist/convex/lib/utils.js.map +1 -0
- package/dist/convex/loyalty.d.ts +82 -0
- package/dist/convex/loyalty.d.ts.map +1 -0
- package/dist/convex/loyalty.js +286 -0
- package/dist/convex/loyalty.js.map +1 -0
- package/dist/convex/orders.d.ts +326 -0
- package/dist/convex/orders.d.ts.map +1 -0
- package/dist/convex/orders.js +570 -0
- package/dist/convex/orders.js.map +1 -0
- package/dist/convex/payments.d.ts +134 -0
- package/dist/convex/payments.d.ts.map +1 -0
- package/dist/convex/payments.js +360 -0
- package/dist/convex/payments.js.map +1 -0
- package/dist/convex/resources.d.ts +119 -0
- package/dist/convex/resources.d.ts.map +1 -0
- package/dist/convex/resources.js +283 -0
- package/dist/convex/resources.js.map +1 -0
- package/dist/convex/schema.d.ts +450 -0
- package/dist/convex/schema.d.ts.map +1 -0
- package/dist/convex/schema.js +347 -0
- package/dist/convex/schema.js.map +1 -0
- package/dist/convex/vouchers.d.ts +187 -0
- package/dist/convex/vouchers.d.ts.map +1 -0
- package/dist/convex/vouchers.js +464 -0
- package/dist/convex/vouchers.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment Functions
|
|
3
|
+
*
|
|
4
|
+
* Handles payment creation, confirmation, and refunds.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Get payment by order ID
|
|
8
|
+
*/
|
|
9
|
+
export declare const getByOrder: import("convex/server").RegisteredQuery<"public", {
|
|
10
|
+
orderId: import("convex/values").GenericId<"orders">;
|
|
11
|
+
}, Promise<{
|
|
12
|
+
_id: import("convex/values").GenericId<"payments">;
|
|
13
|
+
_creationTime: number;
|
|
14
|
+
gatewayTransactionId?: string | undefined;
|
|
15
|
+
gatewayResponse?: string | undefined;
|
|
16
|
+
completedAt?: number | undefined;
|
|
17
|
+
processedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
18
|
+
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
19
|
+
createdAt: number;
|
|
20
|
+
isDeleted: boolean;
|
|
21
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
22
|
+
paymentMethod: "mobile_money" | "card" | "cash";
|
|
23
|
+
orderId: import("convex/values").GenericId<"orders">;
|
|
24
|
+
amount: number;
|
|
25
|
+
currency: string;
|
|
26
|
+
} | null>>;
|
|
27
|
+
/**
|
|
28
|
+
* Get payment history by customer
|
|
29
|
+
*/
|
|
30
|
+
export declare const getByCustomer: import("convex/server").RegisteredQuery<"public", {
|
|
31
|
+
limit?: number | undefined;
|
|
32
|
+
}, Promise<{
|
|
33
|
+
_id: import("convex/values").GenericId<"payments">;
|
|
34
|
+
_creationTime: number;
|
|
35
|
+
gatewayTransactionId?: string | undefined;
|
|
36
|
+
gatewayResponse?: string | undefined;
|
|
37
|
+
completedAt?: number | undefined;
|
|
38
|
+
processedBy?: import("convex/values").GenericId<"attendants"> | undefined;
|
|
39
|
+
status: "pending" | "completed" | "failed" | "refunded" | "processing";
|
|
40
|
+
createdAt: number;
|
|
41
|
+
isDeleted: boolean;
|
|
42
|
+
customerId: import("convex/values").GenericId<"users">;
|
|
43
|
+
paymentMethod: "mobile_money" | "card" | "cash";
|
|
44
|
+
orderId: import("convex/values").GenericId<"orders">;
|
|
45
|
+
amount: number;
|
|
46
|
+
currency: string;
|
|
47
|
+
}[]>>;
|
|
48
|
+
/**
|
|
49
|
+
* Create payment record
|
|
50
|
+
*/
|
|
51
|
+
export declare const create: import("convex/server").RegisteredMutation<"public", {
|
|
52
|
+
currency?: string | undefined;
|
|
53
|
+
paymentMethod: "mobile_money" | "card" | "cash";
|
|
54
|
+
orderId: import("convex/values").GenericId<"orders">;
|
|
55
|
+
amount: number;
|
|
56
|
+
}, Promise<import("convex/values").GenericId<"payments">>>;
|
|
57
|
+
/**
|
|
58
|
+
* Initiate payment (for gateway integration)
|
|
59
|
+
* This would typically call an external payment gateway API
|
|
60
|
+
*/
|
|
61
|
+
export declare const initiate: import("convex/server").RegisteredMutation<"public", {
|
|
62
|
+
paymentId: import("convex/values").GenericId<"payments">;
|
|
63
|
+
}, Promise<{
|
|
64
|
+
paymentId: import("convex/values").GenericId<"payments">;
|
|
65
|
+
status: string;
|
|
66
|
+
}>>;
|
|
67
|
+
/**
|
|
68
|
+
* Confirm payment completion
|
|
69
|
+
*/
|
|
70
|
+
export declare const confirm: import("convex/server").RegisteredMutation<"public", {
|
|
71
|
+
gatewayTransactionId?: string | undefined;
|
|
72
|
+
gatewayResponse?: string | undefined;
|
|
73
|
+
paymentId: import("convex/values").GenericId<"payments">;
|
|
74
|
+
}, Promise<import("convex/values").GenericId<"payments">>>;
|
|
75
|
+
/**
|
|
76
|
+
* Mark payment as failed
|
|
77
|
+
*/
|
|
78
|
+
export declare const fail: import("convex/server").RegisteredMutation<"public", {
|
|
79
|
+
reason?: string | undefined;
|
|
80
|
+
paymentId: import("convex/values").GenericId<"payments">;
|
|
81
|
+
}, Promise<import("convex/values").GenericId<"payments">>>;
|
|
82
|
+
/**
|
|
83
|
+
* Process refund
|
|
84
|
+
*/
|
|
85
|
+
export declare const refund: import("convex/server").RegisteredMutation<"public", {
|
|
86
|
+
reason?: string | undefined;
|
|
87
|
+
paymentId: import("convex/values").GenericId<"payments">;
|
|
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
|
+
}>>;
|
|
134
|
+
//# sourceMappingURL=payments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payments.d.ts","sourceRoot":"","sources":["../../convex/payments.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;UAgBrB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;KAgBxB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;;;;;0DAmEjB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,QAAQ;;;;;GA8BnB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,OAAO;;;;0DAmDlB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,IAAI;;;0DA6Cf,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;;;0DAoDjB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;GAwEhC,CAAC"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { query, mutation } from "./_generated/server";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
import { getCurrentCustomer, getCurrentAttendant } from "./lib/auth";
|
|
4
|
+
import { logPayment } from "./lib/audit";
|
|
5
|
+
import { getCurrentTimestamp } from "./lib/utils";
|
|
6
|
+
/**
|
|
7
|
+
* Payment Functions
|
|
8
|
+
*
|
|
9
|
+
* Handles payment creation, confirmation, and refunds.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Get payment by order ID
|
|
13
|
+
*/
|
|
14
|
+
export const getByOrder = query({
|
|
15
|
+
args: {
|
|
16
|
+
orderId: v.id("orders"),
|
|
17
|
+
},
|
|
18
|
+
handler: async (ctx, args) => {
|
|
19
|
+
const payment = await ctx.db
|
|
20
|
+
.query("payments")
|
|
21
|
+
.withIndex("by_order", (q) => q.eq("orderId", args.orderId))
|
|
22
|
+
.first();
|
|
23
|
+
if (!payment || payment.isDeleted) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
return payment;
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Get payment history by customer
|
|
31
|
+
*/
|
|
32
|
+
export const getByCustomer = query({
|
|
33
|
+
args: {
|
|
34
|
+
limit: v.optional(v.number()),
|
|
35
|
+
},
|
|
36
|
+
handler: async (ctx, args) => {
|
|
37
|
+
const customer = await getCurrentCustomer(ctx);
|
|
38
|
+
const limit = args.limit ?? 50;
|
|
39
|
+
const payments = await ctx.db
|
|
40
|
+
.query("payments")
|
|
41
|
+
.withIndex("by_customer", (q) => q.eq("customerId", customer._id))
|
|
42
|
+
.order("desc")
|
|
43
|
+
.take(limit);
|
|
44
|
+
return payments.filter((p) => !p.isDeleted);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Create payment record
|
|
49
|
+
*/
|
|
50
|
+
export const create = mutation({
|
|
51
|
+
args: {
|
|
52
|
+
orderId: v.id("orders"),
|
|
53
|
+
amount: v.number(),
|
|
54
|
+
paymentMethod: v.union(v.literal("mobile_money"), v.literal("card"), v.literal("cash")),
|
|
55
|
+
currency: v.optional(v.string()), // Defaults to "GHS"
|
|
56
|
+
},
|
|
57
|
+
handler: async (ctx, args) => {
|
|
58
|
+
// Get order
|
|
59
|
+
const order = await ctx.db.get(args.orderId);
|
|
60
|
+
if (!order || order.isDeleted) {
|
|
61
|
+
throw new Error("Order not found");
|
|
62
|
+
}
|
|
63
|
+
// Verify amount matches order total
|
|
64
|
+
if (Math.abs(args.amount - order.finalPrice) > 0.01) {
|
|
65
|
+
throw new Error("Payment amount does not match order total");
|
|
66
|
+
}
|
|
67
|
+
// Check if payment already exists
|
|
68
|
+
const existing = await ctx.db
|
|
69
|
+
.query("payments")
|
|
70
|
+
.withIndex("by_order", (q) => q.eq("orderId", args.orderId))
|
|
71
|
+
.first();
|
|
72
|
+
if (existing && !existing.isDeleted) {
|
|
73
|
+
throw new Error("Payment already exists for this order");
|
|
74
|
+
}
|
|
75
|
+
const currency = args.currency ?? "GHS";
|
|
76
|
+
const now = getCurrentTimestamp();
|
|
77
|
+
// Create payment record
|
|
78
|
+
const paymentId = await ctx.db.insert("payments", {
|
|
79
|
+
orderId: args.orderId,
|
|
80
|
+
customerId: order.customerId,
|
|
81
|
+
amount: args.amount,
|
|
82
|
+
currency,
|
|
83
|
+
paymentMethod: args.paymentMethod,
|
|
84
|
+
status: "pending",
|
|
85
|
+
createdAt: now,
|
|
86
|
+
isDeleted: false,
|
|
87
|
+
});
|
|
88
|
+
// Update order with payment reference
|
|
89
|
+
await ctx.db.patch(args.orderId, {
|
|
90
|
+
paymentId,
|
|
91
|
+
paymentMethod: args.paymentMethod,
|
|
92
|
+
});
|
|
93
|
+
// Get branch for audit log
|
|
94
|
+
const branch = await ctx.db.get(order.branchId);
|
|
95
|
+
const branchId = branch?._id;
|
|
96
|
+
await logPayment(ctx, paymentId, args.orderId, order.customerId, "payment.created", args.amount, args.paymentMethod, branchId);
|
|
97
|
+
return paymentId;
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
/**
|
|
101
|
+
* Initiate payment (for gateway integration)
|
|
102
|
+
* This would typically call an external payment gateway API
|
|
103
|
+
*/
|
|
104
|
+
export const initiate = mutation({
|
|
105
|
+
args: {
|
|
106
|
+
paymentId: v.id("payments"),
|
|
107
|
+
},
|
|
108
|
+
handler: async (ctx, args) => {
|
|
109
|
+
const payment = await ctx.db.get(args.paymentId);
|
|
110
|
+
if (!payment || payment.isDeleted) {
|
|
111
|
+
throw new Error("Payment not found");
|
|
112
|
+
}
|
|
113
|
+
if (payment.status !== "pending") {
|
|
114
|
+
throw new Error("Payment already processed");
|
|
115
|
+
}
|
|
116
|
+
// Update payment status to processing
|
|
117
|
+
await ctx.db.patch(args.paymentId, {
|
|
118
|
+
status: "processing",
|
|
119
|
+
});
|
|
120
|
+
// In a real implementation, this would:
|
|
121
|
+
// 1. Call payment gateway API
|
|
122
|
+
// 2. Store gateway transaction ID
|
|
123
|
+
// 3. Return payment URL or instructions
|
|
124
|
+
return {
|
|
125
|
+
paymentId: args.paymentId,
|
|
126
|
+
status: "processing",
|
|
127
|
+
// gatewayUrl: "...", // URL to redirect user for payment
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
/**
|
|
132
|
+
* Confirm payment completion
|
|
133
|
+
*/
|
|
134
|
+
export const confirm = mutation({
|
|
135
|
+
args: {
|
|
136
|
+
paymentId: v.id("payments"),
|
|
137
|
+
gatewayTransactionId: v.optional(v.string()),
|
|
138
|
+
gatewayResponse: v.optional(v.string()),
|
|
139
|
+
},
|
|
140
|
+
handler: async (ctx, args) => {
|
|
141
|
+
const payment = await ctx.db.get(args.paymentId);
|
|
142
|
+
if (!payment || payment.isDeleted) {
|
|
143
|
+
throw new Error("Payment not found");
|
|
144
|
+
}
|
|
145
|
+
if (payment.status === "completed") {
|
|
146
|
+
throw new Error("Payment already completed");
|
|
147
|
+
}
|
|
148
|
+
const now = getCurrentTimestamp();
|
|
149
|
+
// Update payment
|
|
150
|
+
await ctx.db.patch(args.paymentId, {
|
|
151
|
+
status: "completed",
|
|
152
|
+
completedAt: now,
|
|
153
|
+
gatewayTransactionId: args.gatewayTransactionId,
|
|
154
|
+
gatewayResponse: args.gatewayResponse,
|
|
155
|
+
});
|
|
156
|
+
// Update order payment status
|
|
157
|
+
const order = await ctx.db.get(payment.orderId);
|
|
158
|
+
if (order && !order.isDeleted) {
|
|
159
|
+
await ctx.db.patch(payment.orderId, {
|
|
160
|
+
paymentStatus: "paid",
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
// Get branch for audit log
|
|
164
|
+
const orderForAudit = await ctx.db.get(payment.orderId);
|
|
165
|
+
const branchId = orderForAudit?.branchId;
|
|
166
|
+
await logPayment(ctx, args.paymentId, payment.orderId, payment.customerId, "payment.completed", payment.amount, payment.paymentMethod, branchId);
|
|
167
|
+
return args.paymentId;
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
/**
|
|
171
|
+
* Mark payment as failed
|
|
172
|
+
*/
|
|
173
|
+
export const fail = mutation({
|
|
174
|
+
args: {
|
|
175
|
+
paymentId: v.id("payments"),
|
|
176
|
+
reason: v.optional(v.string()),
|
|
177
|
+
},
|
|
178
|
+
handler: async (ctx, args) => {
|
|
179
|
+
const payment = await ctx.db.get(args.paymentId);
|
|
180
|
+
if (!payment || payment.isDeleted) {
|
|
181
|
+
throw new Error("Payment not found");
|
|
182
|
+
}
|
|
183
|
+
if (payment.status === "completed") {
|
|
184
|
+
throw new Error("Cannot fail completed payment");
|
|
185
|
+
}
|
|
186
|
+
// Update payment
|
|
187
|
+
await ctx.db.patch(args.paymentId, {
|
|
188
|
+
status: "failed",
|
|
189
|
+
});
|
|
190
|
+
// Update order payment status
|
|
191
|
+
const order = await ctx.db.get(payment.orderId);
|
|
192
|
+
if (order && !order.isDeleted) {
|
|
193
|
+
await ctx.db.patch(payment.orderId, {
|
|
194
|
+
paymentStatus: "failed",
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Get branch for audit log
|
|
198
|
+
const branchId = order?.branchId;
|
|
199
|
+
await logPayment(ctx, args.paymentId, payment.orderId, payment.customerId, "payment.failed", payment.amount, payment.paymentMethod, branchId, undefined);
|
|
200
|
+
return args.paymentId;
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
/**
|
|
204
|
+
* Process refund
|
|
205
|
+
*/
|
|
206
|
+
export const refund = mutation({
|
|
207
|
+
args: {
|
|
208
|
+
paymentId: v.id("payments"),
|
|
209
|
+
reason: v.optional(v.string()),
|
|
210
|
+
},
|
|
211
|
+
handler: async (ctx, args) => {
|
|
212
|
+
const payment = await ctx.db.get(args.paymentId);
|
|
213
|
+
if (!payment || payment.isDeleted) {
|
|
214
|
+
throw new Error("Payment not found");
|
|
215
|
+
}
|
|
216
|
+
if (payment.status !== "completed") {
|
|
217
|
+
throw new Error("Can only refund completed payments");
|
|
218
|
+
}
|
|
219
|
+
const now = getCurrentTimestamp();
|
|
220
|
+
// Update payment
|
|
221
|
+
await ctx.db.patch(args.paymentId, {
|
|
222
|
+
status: "refunded",
|
|
223
|
+
});
|
|
224
|
+
// Update order payment status
|
|
225
|
+
const order = await ctx.db.get(payment.orderId);
|
|
226
|
+
if (order && !order.isDeleted) {
|
|
227
|
+
await ctx.db.patch(payment.orderId, {
|
|
228
|
+
paymentStatus: "refunded",
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
// Get branch for audit log
|
|
232
|
+
const branchId = order?.branchId;
|
|
233
|
+
await logPayment(ctx, args.paymentId, payment.orderId, payment.customerId, "payment.refunded", payment.amount, payment.paymentMethod, branchId, undefined, args.reason);
|
|
234
|
+
// In a real implementation, this would:
|
|
235
|
+
// 1. Call payment gateway refund API
|
|
236
|
+
// 2. Store refund transaction ID
|
|
237
|
+
return args.paymentId;
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
/**
|
|
241
|
+
* Get transaction history - Paginated
|
|
242
|
+
* Supports usePaginatedQuery for infinite scroll
|
|
243
|
+
*/
|
|
244
|
+
export const getTransactionHistory = query({
|
|
245
|
+
args: {
|
|
246
|
+
branchId: v.optional(v.id("branches")),
|
|
247
|
+
startDate: v.optional(v.number()),
|
|
248
|
+
endDate: v.optional(v.number()),
|
|
249
|
+
paymentMethod: v.optional(v.union(v.literal("mobile_money"), v.literal("card"), v.literal("cash"))),
|
|
250
|
+
cursor: v.optional(v.string()),
|
|
251
|
+
numItems: v.optional(v.number()),
|
|
252
|
+
},
|
|
253
|
+
handler: async (ctx, args) => {
|
|
254
|
+
// Allow both attendants and admins
|
|
255
|
+
try {
|
|
256
|
+
await getCurrentAttendant(ctx);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
const { getCurrentAdmin } = await import("./lib/auth");
|
|
260
|
+
await getCurrentAdmin(ctx);
|
|
261
|
+
}
|
|
262
|
+
const numItems = args.numItems ?? 20;
|
|
263
|
+
// Get all payments
|
|
264
|
+
const result = await ctx.db
|
|
265
|
+
.query("payments")
|
|
266
|
+
.withIndex("by_created")
|
|
267
|
+
.order("desc")
|
|
268
|
+
.filter((q) => q.eq(q.field("isDeleted"), false))
|
|
269
|
+
.paginate({
|
|
270
|
+
cursor: args.cursor ?? null,
|
|
271
|
+
numItems,
|
|
272
|
+
});
|
|
273
|
+
let filtered = result.page;
|
|
274
|
+
// Apply filters
|
|
275
|
+
if (args.startDate) {
|
|
276
|
+
filtered = filtered.filter((p) => p.createdAt >= args.startDate);
|
|
277
|
+
}
|
|
278
|
+
if (args.endDate) {
|
|
279
|
+
filtered = filtered.filter((p) => p.createdAt <= args.endDate);
|
|
280
|
+
}
|
|
281
|
+
if (args.paymentMethod) {
|
|
282
|
+
filtered = filtered.filter((p) => p.paymentMethod === args.paymentMethod);
|
|
283
|
+
}
|
|
284
|
+
// Filter by branch if specified
|
|
285
|
+
if (args.branchId) {
|
|
286
|
+
const filteredWithOrders = await Promise.all(filtered.map(async (payment) => {
|
|
287
|
+
const order = await ctx.db.get(payment.orderId);
|
|
288
|
+
return { payment, order };
|
|
289
|
+
}));
|
|
290
|
+
filtered = filteredWithOrders
|
|
291
|
+
.filter(({ order }) => order && !order.isDeleted && order.branchId === args.branchId)
|
|
292
|
+
.map(({ payment }) => payment);
|
|
293
|
+
}
|
|
294
|
+
return {
|
|
295
|
+
page: filtered,
|
|
296
|
+
isDone: result.isDone,
|
|
297
|
+
continueCursor: result.continueCursor,
|
|
298
|
+
};
|
|
299
|
+
},
|
|
300
|
+
});
|
|
301
|
+
/**
|
|
302
|
+
* Get transaction summary statistics
|
|
303
|
+
*/
|
|
304
|
+
export const getTransactionSummary = query({
|
|
305
|
+
args: {
|
|
306
|
+
branchId: v.optional(v.id("branches")),
|
|
307
|
+
startDate: v.optional(v.number()),
|
|
308
|
+
endDate: v.optional(v.number()),
|
|
309
|
+
},
|
|
310
|
+
handler: async (ctx, args) => {
|
|
311
|
+
// Allow both attendants and admins
|
|
312
|
+
try {
|
|
313
|
+
await getCurrentAttendant(ctx);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
const { getCurrentAdmin } = await import("./lib/auth");
|
|
317
|
+
await getCurrentAdmin(ctx);
|
|
318
|
+
}
|
|
319
|
+
const now = Date.now();
|
|
320
|
+
const startDate = args.startDate || (now - 30 * 24 * 60 * 60 * 1000);
|
|
321
|
+
const endDate = args.endDate || now;
|
|
322
|
+
// Get all payments
|
|
323
|
+
let payments = await ctx.db
|
|
324
|
+
.query("payments")
|
|
325
|
+
.withIndex("by_created")
|
|
326
|
+
.filter((q) => q.and(q.eq(q.field("isDeleted"), false), q.eq(q.field("status"), "completed")))
|
|
327
|
+
.collect();
|
|
328
|
+
// Filter by date
|
|
329
|
+
payments = payments.filter((p) => p.createdAt >= startDate && p.createdAt <= endDate);
|
|
330
|
+
// Filter by branch if specified
|
|
331
|
+
if (args.branchId) {
|
|
332
|
+
const paymentsWithOrders = await Promise.all(payments.map(async (payment) => {
|
|
333
|
+
const order = await ctx.db.get(payment.orderId);
|
|
334
|
+
return { payment, order };
|
|
335
|
+
}));
|
|
336
|
+
payments = paymentsWithOrders
|
|
337
|
+
.filter(({ order }) => order && !order.isDeleted && order.branchId === args.branchId)
|
|
338
|
+
.map(({ payment }) => payment);
|
|
339
|
+
}
|
|
340
|
+
const totalAmount = payments.reduce((sum, p) => sum + p.amount, 0);
|
|
341
|
+
const byMethod = payments.reduce((acc, p) => {
|
|
342
|
+
acc[p.paymentMethod] = (acc[p.paymentMethod] || 0) + p.amount;
|
|
343
|
+
return acc;
|
|
344
|
+
}, {});
|
|
345
|
+
const byStatus = payments.reduce((acc, p) => {
|
|
346
|
+
acc[p.status] = (acc[p.status] || 0) + 1;
|
|
347
|
+
return acc;
|
|
348
|
+
}, {});
|
|
349
|
+
return {
|
|
350
|
+
totalTransactions: payments.length,
|
|
351
|
+
totalAmount: Math.round(totalAmount * 100) / 100,
|
|
352
|
+
averageTransaction: payments.length > 0
|
|
353
|
+
? Math.round((totalAmount / payments.length) * 100) / 100
|
|
354
|
+
: 0,
|
|
355
|
+
byMethod,
|
|
356
|
+
byStatus,
|
|
357
|
+
};
|
|
358
|
+
},
|
|
359
|
+
});
|
|
360
|
+
//# sourceMappingURL=payments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../convex/payments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Id } from "./_generated/dataModel";
|
|
2
|
+
/**
|
|
3
|
+
* Resource Usage Functions
|
|
4
|
+
*
|
|
5
|
+
* Handles daily resource consumption tracking (detergent, tokens, water cycles).
|
|
6
|
+
* Used by attendants to log daily resource usage at branches.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Get resource usage by branch
|
|
10
|
+
*/
|
|
11
|
+
export declare const getByBranch: import("convex/server").RegisteredQuery<"public", {
|
|
12
|
+
startDate?: string | undefined;
|
|
13
|
+
endDate?: string | undefined;
|
|
14
|
+
limit?: number | undefined;
|
|
15
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
16
|
+
}, Promise<{
|
|
17
|
+
_id: import("convex/values").GenericId<"resourceUsageLogs">;
|
|
18
|
+
_creationTime: number;
|
|
19
|
+
notes?: string | undefined;
|
|
20
|
+
waterCycles?: number | undefined;
|
|
21
|
+
isDeleted: boolean;
|
|
22
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
23
|
+
attendantId: import("convex/values").GenericId<"attendants">;
|
|
24
|
+
date: string;
|
|
25
|
+
detergentUnits: number;
|
|
26
|
+
tokensUsed: number;
|
|
27
|
+
loggedAt: number;
|
|
28
|
+
}[]>>;
|
|
29
|
+
/**
|
|
30
|
+
* Get resource usage by date
|
|
31
|
+
*/
|
|
32
|
+
export declare const getByDate: import("convex/server").RegisteredQuery<"public", {
|
|
33
|
+
branchId?: import("convex/values").GenericId<"branches"> | undefined;
|
|
34
|
+
date: string;
|
|
35
|
+
}, Promise<{
|
|
36
|
+
_id: import("convex/values").GenericId<"resourceUsageLogs">;
|
|
37
|
+
_creationTime: number;
|
|
38
|
+
notes?: string | undefined;
|
|
39
|
+
waterCycles?: number | undefined;
|
|
40
|
+
isDeleted: boolean;
|
|
41
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
42
|
+
attendantId: import("convex/values").GenericId<"attendants">;
|
|
43
|
+
date: string;
|
|
44
|
+
detergentUnits: number;
|
|
45
|
+
tokensUsed: number;
|
|
46
|
+
loggedAt: number;
|
|
47
|
+
}[]>>;
|
|
48
|
+
/**
|
|
49
|
+
* Get daily resource report for a branch
|
|
50
|
+
*/
|
|
51
|
+
export declare const getDailyReport: import("convex/server").RegisteredQuery<"public", {
|
|
52
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
53
|
+
date: string;
|
|
54
|
+
}, Promise<{
|
|
55
|
+
date: string;
|
|
56
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
57
|
+
logs: {
|
|
58
|
+
_id: import("convex/values").GenericId<"resourceUsageLogs">;
|
|
59
|
+
_creationTime: number;
|
|
60
|
+
notes?: string | undefined;
|
|
61
|
+
waterCycles?: number | undefined;
|
|
62
|
+
isDeleted: boolean;
|
|
63
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
64
|
+
attendantId: import("convex/values").GenericId<"attendants">;
|
|
65
|
+
date: string;
|
|
66
|
+
detergentUnits: number;
|
|
67
|
+
tokensUsed: number;
|
|
68
|
+
loggedAt: number;
|
|
69
|
+
}[];
|
|
70
|
+
totals: {
|
|
71
|
+
detergentUnits: number;
|
|
72
|
+
tokensUsed: number;
|
|
73
|
+
waterCycles: number;
|
|
74
|
+
};
|
|
75
|
+
logCount: number;
|
|
76
|
+
}>>;
|
|
77
|
+
/**
|
|
78
|
+
* Log daily resource usage
|
|
79
|
+
*/
|
|
80
|
+
export declare const logUsage: import("convex/server").RegisteredMutation<"public", {
|
|
81
|
+
notes?: string | undefined;
|
|
82
|
+
date?: string | undefined;
|
|
83
|
+
waterCycles?: number | undefined;
|
|
84
|
+
branchId: import("convex/values").GenericId<"branches">;
|
|
85
|
+
detergentUnits: number;
|
|
86
|
+
tokensUsed: number;
|
|
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
|
+
}>>;
|
|
119
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../convex/resources.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAC;AAE5C;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;KAsCtB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;KAqCpB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;GA2CzB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;oCAuEnB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;wBAkEkB,MAAM;oBAAc,MAAM;qBAAe,MAAM;kBAAY,MAAM;;;;;;;;GAwB7G,CAAC"}
|