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
+5 -2
View File
@@ -12,11 +12,14 @@ import { Payment } from './entities/payment.entity';
import { ZarinpalGateway } from './gateways/zarinpal.gateway';
import { GatewayManager } from './services/gateway.manager';
import { PaymentRepository } from './repositories/payment.repository';
import { InventoryModule } from '../inventory/inventory.module';
@Module({
imports: [MikroOrmModule.forFeature([PaymentMethod, Payment, Restaurant]), AuthModule, JwtModule],
imports: [MikroOrmModule.forFeature([PaymentMethod, Payment, Restaurant]),
AuthModule, JwtModule, InventoryModule],
controllers: [PaymentsController],
providers: [PaymentsService, PaymentMethodService, PaymentMethodRepository, PaymentRepository, ZarinpalGateway, GatewayManager],
providers: [PaymentsService, PaymentMethodService, PaymentMethodRepository,
PaymentRepository, ZarinpalGateway, GatewayManager],
exports: [
PaymentMethodRepository,
PaymentRepository,
@@ -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: {