order confirm after pay

This commit is contained in:
2025-12-17 20:07:54 +03:30
parent bfb7441a0c
commit 7f72d7d70f
16 changed files with 102 additions and 42 deletions
@@ -1,12 +1,14 @@
import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common';
import { PaymentGatewayEnum, PaymentMethodEnum, PaymentStatusEnum } from '../interface/payment';
import { Payment } from '../entities/payment.entity';
import { EntityManager } from '@mikro-orm/core';
import { EntityManager } from '@mikro-orm/postgresql';
import { Order } from '../../orders/entities/order.entity';
import { Logger } from '@nestjs/common';
import { GatewayManager } from './gateway.manager';
import { UserWallet } from 'src/modules/users/entities/user-wallet.entity';
import { OrderPaymentContext } from '../interface/payment';
import { InventoryService } from 'src/modules/inventory/inventory.service';
import { OrderStatus } from 'src/modules/orders/interface/order.interface';
@Injectable()
export class PaymentsService {
@@ -15,6 +17,7 @@ export class PaymentsService {
constructor(
private readonly em: EntityManager,
private readonly gatewayManager: GatewayManager,
private readonly inventoryService: InventoryService,
) { }
async payOrder(
@@ -201,16 +204,12 @@ export class PaymentsService {
payment.verifyResponse = result.raw;
if (!result.success) {
payment.status = PaymentStatusEnum.Failed;
payment.failedAt = new Date();
payment.order.paymentStatus = PaymentStatusEnum.Failed;
} else {
payment.status = PaymentStatusEnum.Paid;
payment.referenceId = result.referenceId;
payment.cardPan = result.cardPan;
payment.paidAt = new Date();
payment.order.paymentStatus = PaymentStatusEnum.Paid;
this.failPayment(payment);
return payment;
}
this.markPaid(payment);
this.confirmOrder(payment.order);
await this.confirmStock(orderId, em);
await em.flush();
return payment;
@@ -225,6 +224,28 @@ export class PaymentsService {
);
}
private markPaid(payment: Payment) {
payment.status = PaymentStatusEnum.Paid;
payment.paidAt = new Date();
payment.referenceId = payment.referenceId;
payment.order.paymentStatus = PaymentStatusEnum.Paid;
}
private failPayment(payment: Payment) {
payment.status = PaymentStatusEnum.Failed;
payment.failedAt = new Date();
payment.order.paymentStatus = PaymentStatusEnum.Failed;
}
private confirmOrder(order: Order) {
order.status = OrderStatus.PAID;
}
private async confirmStock(orderId: string, em: EntityManager) {
await this.inventoryService.confirmReservationByOrderId(em, orderId);
}
private async getOrCreateLatestPendingPayment(
orderId: string,
params: {