Skip to content

Commit 9c88752

Browse files
committed
Update returned payment handling:
- when admin resets return payment, make sure datePaid is set to null - do not handle processed events after payment was marked as "Returned" - add errors to failed payments
1 parent 963ccc1 commit 9c88752

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

src/api/admin/admin.service.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,12 @@ export class AdminService {
348348
currentVersion: number,
349349
) {
350350
let setDatePaidNull = false;
351-
if (
352-
(oldPaymentStatus === PaymentStatus.PAID ||
353-
oldPaymentStatus === PaymentStatus.PROCESSING) &&
351+
if ([
352+
PaymentStatus.PAID,
353+
PaymentStatus.PROCESSING,
354+
PaymentStatus.RETURNED,
355+
PaymentStatus.FAILED,
356+
].includes(oldPaymentStatus as PaymentStatus) &&
354357
newPaymentStatus === PaymentStatus.OWED
355358
) {
356359
setDatePaidNull = true;

src/api/webhooks/trolley/handlers/payment.handler.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ export class PaymentHandler {
3434
paymentId,
3535
payload.status.toUpperCase() as payment_status,
3636
payload.status.toUpperCase(),
37-
{ failureMessage: payload.failureMessage },
37+
{
38+
failureMessage: payload.failureMessage,
39+
returnedNote: payload.returnedNote,
40+
errors: payload.errors?.join(', '),
41+
},
3842
);
3943

4044
return;
@@ -56,6 +60,7 @@ export class PaymentHandler {
5660
INNER JOIN public.payment_release_associations pra
5761
ON pra.payment_id = p.payment_id
5862
WHERE pra.payment_release_id::text = ${paymentId}
63+
FOR UPDATE
5964
`
6065
).map((w) => w.id);
6166

src/api/webhooks/trolley/handlers/payment.types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export interface PaymentProcessedEventData {
2323
fees: string;
2424
targetAmount: string; // net amount
2525
failureMessage: string | null;
26+
errors?: string[];
27+
returnedNote?: string;
2628
memo: string | null;
2729
batch: {
2830
id: string;

src/shared/payments/payments.service.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,20 @@ export class PaymentsService {
138138
metadata?: JsonObject,
139139
) {
140140
const prismaClient = transaction || this.prisma;
141+
142+
const failedOrReturnedRelease = await prismaClient.payment_releases.findFirst({
143+
where: {
144+
payment_release_id: paymentId,
145+
status: { in: [payment_status.RETURNED, payment_status.FAILED] },
146+
}
147+
});
148+
149+
if (failedOrReturnedRelease) {
150+
throw new Error(
151+
`Not processing payment release ${paymentId} because it was already marked as '${failedOrReturnedRelease.status}'.`,
152+
);
153+
}
154+
141155
try {
142156
const r = await prismaClient.payment_releases.updateMany({
143157
where: {

0 commit comments

Comments
 (0)