From ee4ee7d8422c036146d7bdea3662b1f42dc1048d Mon Sep 17 00:00:00 2001
From: parsa aghaei
Date: Sun, 23 Aug 2026 13:44:18 +0330
Subject: [PATCH] feat: add POST payment/admin/inquiry endpoint for instant
zibal inquiry
---
backend/src/payment/payment.controller.ts | 21 +++++++++++++++++++
backend/src/payment/payment.service.ts | 25 +++++++++++++++++++++++
2 files changed, 46 insertions(+)
diff --git a/backend/src/payment/payment.controller.ts b/backend/src/payment/payment.controller.ts
index c9a90d6..161461f 100644
--- a/backend/src/payment/payment.controller.ts
+++ b/backend/src/payment/payment.controller.ts
@@ -546,6 +546,26 @@ export class PaymentController {
return this.paymentService.reconcilePendingTransactions();
}
+ @UseGuards(JwtAuthGuard, RolesGuard)
+ @Roles('Admin')
+ @ApiBearerAuth()
+ @Post('admin/inquiry')
+ @ApiOperation({ summary: 'استعلام زنده وضعیت تراکنش با trackId یا transactionId' })
+ async liveInquiryPost(@Body() body: { trackId?: string | number; transactionId?: string }) {
+ if (body.transactionId) {
+ return this.paymentService.adminLiveInquiry(body.transactionId);
+ }
+ if (body.trackId) {
+ const tx = await this.paymentService.getTransactionByTrackId(String(body.trackId));
+ if (tx) {
+ return this.paymentService.adminLiveInquiry(tx.id);
+ }
+ // Direct Zibal inquiry fallback if transaction record not found
+ return this.paymentService.inquiryDirectZibal(String(body.trackId));
+ }
+ throw new BadRequestException('trackId یا transactionId الزامی است');
+ }
+
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('Admin')
@ApiBearerAuth()
@@ -555,6 +575,7 @@ export class PaymentController {
return this.paymentService.adminLiveInquiry(id);
}
+
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('Admin')
@ApiBearerAuth()
diff --git a/backend/src/payment/payment.service.ts b/backend/src/payment/payment.service.ts
index a25cfdb..94e9884 100644
--- a/backend/src/payment/payment.service.ts
+++ b/backend/src/payment/payment.service.ts
@@ -893,6 +893,31 @@ export class PaymentService {
};
}
+ async getTransactionByTrackId(trackId: string) {
+ return this.prisma.paymentTransaction.findFirst({
+ where: { trackId },
+ });
+ }
+
+ async inquiryDirectZibal(trackId: string) {
+ const inquiryRes = await this.zibalService.inquiryPayment(trackId);
+ const statusMsg = this.zibalService.getStatusMessage(inquiryRes.status ?? 3);
+ const resultMsg = this.zibalService.getResultMessage(inquiryRes.result);
+ return {
+ trackId,
+ status: inquiryRes.status,
+ statusMessage: statusMsg,
+ result: inquiryRes.result,
+ resultMessage: resultMsg,
+ amount: inquiryRes.amount,
+ refNumber: inquiryRes.refNumber,
+ cardNumber: inquiryRes.cardNumber,
+ paidAt: inquiryRes.paidAt,
+ rawInquiryResponse: inquiryRes,
+ };
+ }
+
+
/**
* 9. Admin: Manually Approve / Verify a Transaction (e.g. Card-to-Card receipt or bank transfer)
*/