set order status as paid after wallet payment

This commit is contained in:
2025-12-18 19:14:09 +03:30
parent 0362540875
commit add2127998
5 changed files with 28 additions and 41 deletions
@@ -18,15 +18,13 @@ export class PaymentsService {
private readonly em: EntityManager,
private readonly gatewayManager: GatewayManager,
private readonly inventoryService: InventoryService,
) { }
) {}
async payOrder(
orderId: string,
): Promise<{ paymentUrl: string | null }> {
async payOrder(orderId: string): Promise<{ paymentUrl: string | null }> {
const ctx = await this.loadAndValidateOrder(orderId);
// Idempotency: avoid creating/charging again for already-paid orders
if (ctx.order.paymentStatus === PaymentStatusEnum.Paid) {
if (ctx.order.status === OrderStatus.PAID) {
return { paymentUrl: null };
}
@@ -47,9 +45,7 @@ export class PaymentsService {
}
}
private async loadAndValidateOrder(
orderId: string,
): Promise<OrderPaymentContext> {
private async loadAndValidateOrder(orderId: string): Promise<OrderPaymentContext> {
const order = await this.em.findOne(
Order,
{ id: orderId },
@@ -98,7 +94,7 @@ export class PaymentsService {
const order = await em.findOne(Order, { id: ctx.order.id }, { populate: ['user', 'restaurant'] });
if (!order) throw new NotFoundException('Order not found');
if (order.paymentStatus === PaymentStatusEnum.Paid) {
if (order.status === OrderStatus.PAID) {
return;
}
@@ -126,17 +122,14 @@ export class PaymentsService {
payment.status = PaymentStatusEnum.Paid;
payment.paidAt = new Date();
order.paymentStatus = PaymentStatusEnum.Paid;
order.status = OrderStatus.PAID;
em.persist([wallet, payment, order]);
await em.flush();
});
}
private async handleOnlinePayment(
ctx: OrderPaymentContext,
): Promise<{ paymentUrl: string }> {
private async handleOnlinePayment(ctx: OrderPaymentContext): Promise<{ paymentUrl: string }> {
const gateway = this.gatewayManager.get(ctx.gateway!);
const payment = await this.getOrCreateLatestPendingPayment(ctx.order.id, {
@@ -168,11 +161,7 @@ export class PaymentsService {
};
}
async verifyPayment(
transactionId: string,
orderId: string,
): Promise<Payment> {
async verifyPayment(transactionId: string, orderId: string): Promise<Payment> {
return this.em.transactional(async em => {
const payment = await em.findOne(
Payment,
@@ -207,9 +196,9 @@ export class PaymentsService {
this.failPayment(payment);
return payment;
}
this.markPaid(payment);
this.markPaid(payment, result.referenceId);
this.confirmOrder(payment.order);
await em.flush();
return payment;
});
@@ -223,17 +212,16 @@ export class PaymentsService {
);
}
private markPaid(payment: Payment) {
private markPaid(payment: Payment, referenceId: string) {
payment.status = PaymentStatusEnum.Paid;
payment.paidAt = new Date();
payment.referenceId = payment.referenceId;
payment.order.paymentStatus = PaymentStatusEnum.Paid;
payment.referenceId = referenceId;
}
private failPayment(payment: Payment) {
payment.status = PaymentStatusEnum.Failed;
payment.failedAt = new Date();
payment.order.paymentStatus = PaymentStatusEnum.Failed;
payment.order.status = OrderStatus.FAILED;
}
private confirmOrder(order: Order) {