set order status as paid after wallet payment
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user