+ {/* Top Header */}
+
+
+
+
+ پرتال و داشبورد خدمات مالی زیبال
+
+
+ مشاهده گزارشات استرداد وجه (Refund/Reverse)، تسویهها و واریزها، صف تسویه و تراکنشهای رسمی شاپرک
+
+
+
+
+
+
+
+
+ {/* Main Feature Tabs (Matching Zibal Panel layout) */}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* ======================================================== */}
+ {/* 1. TAB CONTENT: REFUNDS (استرداد وجه) */}
+ {/* ======================================================== */}
+ {activeMainTab === 'refunds' && (
+
+ {/* Top Bar with Filter & Search Controls */}
+
+
+
+
+
+
+
+ {/* Filter Inputs Bar */}
+
+ {/* Date Filter */}
+
+
+ تاریخ از:
+ setRefundFilters({ ...refundFilters, fromDate: e.target.value })}
+ className="bg-transparent outline-none font-mono text-[11px]"
+ />
+ تا:
+ setRefundFilters({ ...refundFilters, toDate: e.target.value })}
+ className="bg-transparent outline-none font-mono text-[11px]"
+ />
+
+
+ {/* Status Selector */}
+
+
+ {/* Advanced Search Popup Toggle */}
+
+
+
+ {/* Advanced Search Dropdown Window (Matching Exact User Screenshot) */}
+ {refundSearchOpen && (
+
+
+
+
+
+
+
+
+
+ )}
+
+
+
+
+ {/* Refund Table */}
+ {loadingRefunds ? (
+
+
+
+ ) : refunds.length === 0 ? (
+
+
+
+
+
نتیجهای یافت نشد.
+
+ ) : (
+
+
+
+
+ | شناسه استرداد |
+ شماره تراکنش |
+ شناسه سفارش |
+ شماره مرجع |
+ نام / دارنده |
+ مقصد |
+ مبلغ استرداد |
+ نوع / کارمزد |
+ وضعیت |
+ تاریخ ایجاد |
+ عملیات |
+
+
+
+ {refunds.map((rf: any, i: number) => (
+
+ | {rf.id || rf.refundId || '-'} |
+ {rf.trackId || rf.transactionTrackId || '-'} |
+ {rf.orderId || '-'} |
+ {rf.refNumber || '-'} |
+ {rf.name || rf.cardHolder || '-'} |
+ {rf.cardNumber || rf.bankAccount || '-'} |
+
+ {(Number(rf.amount || 0) / 10).toLocaleString()} تومان
+ |
+
+
+ {rf.tryReverse ? 'Reverse' : 'Refund'}
+
+ |
+
+
+ {rf.status === 1 || rf.status === 'SUCCESS' ? 'موفق' : rf.status === 0 || rf.status === 'PENDING' ? 'در صف' : 'ناموفق'}
+
+ |
+
+ {rf.createdAt ? new Date(rf.createdAt).toLocaleDateString('fa-IR') : '-'}
+ |
+
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ )}
+
+ {/* ======================================================== */}
+ {/* 2. TAB CONTENT: CHECKOUTS / PAYOUTS (گزارش واریز) */}
+ {/* ======================================================== */}
+ {activeMainTab === 'checkouts' && (
+
+
+
+
+
+
+
+
+ {/* Filter Inputs Bar */}
+
+
+
+ از:
+ setCheckoutFilters({ ...checkoutFilters, fromDate: e.target.value })}
+ className="bg-transparent outline-none font-mono text-[11px]"
+ />
+ تا:
+ setCheckoutFilters({ ...checkoutFilters, toDate: e.target.value })}
+ className="bg-transparent outline-none font-mono text-[11px]"
+ />
+
+
+ {/* Advanced Checkout Search Popup */}
+
+
+
+ {checkoutSearchOpen && (
+
+ )}
+
+
+
+
+ {/* Table */}
+ {loadingCheckouts ? (
+
+
+
+ ) : checkouts.length === 0 ? (
+
+
+
+
+
نتیجهای یافت نشد.
+
+ ) : (
+
+
+
+
+ | حساب مقصد |
+ نام صاحب حساب |
+ مبلغ کل (تومان) |
+ نوع تسویه |
+ تاریخ واریز |
+ شناسه مرجع |
+ وضعیت |
+
+
+
+ {checkouts.map((chk: any, i: number) => (
+
+ | {chk.accountIban || chk.iban || chk.destination || '-'} |
+ {chk.accountName || chk.name || '-'} |
+
+ {(Number(chk.amount || 0) / 10).toLocaleString()} تومان
+ |
+ {chk.type || 'پایا شاپرکی'} |
+
+ {chk.paidAt || chk.createdAt ? new Date(chk.paidAt || chk.createdAt).toLocaleDateString('fa-IR') : '-'}
+ |
+ {chk.refNumber || chk.referenceId || '-'} |
+
+
+ واریز شده
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ )}
+
+ {/* ======================================================== */}
+ {/* 3. TAB CONTENT: QUEUE (صف تسویه) */}
+ {/* ======================================================== */}
+ {activeMainTab === 'queue' && (
+
+
+
+
+ لیست تسویهها و واریزیهای در انتظار تایید شاپرک
+
+
+
+
+ {loadingQueue ? (
+
+
+
+ ) : queueItems.length === 0 ? (
+
+
+
صف تسویه خالی است. کلیه مبالغ تسویه شدهاند.
+
+ ) : (
+
+
+
+
+ | شناسه درخواست |
+ حساب مقصد (شبا) |
+ مبلغ در صف |
+ زمان ثبت در صف |
+ وضعیت |
+
+
+
+ {queueItems.map((q: any, i: number) => (
+
+ | {q.id || q.requestId || '-'} |
+ {q.iban || q.accountIban || '-'} |
+
+ {(Number(q.amount || 0) / 10).toLocaleString()} تومان
+ |
+
+ {q.createdAt ? new Date(q.createdAt).toLocaleDateString('fa-IR') : '-'}
+ |
+
+
+ در انتظار سیکل پایا
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ )}
+
+ {/* ======================================================== */}
+ {/* 4. TAB CONTENT: GATEWAY TRANSACTIONS (تراکنشهای درگاه) */}
+ {/* ======================================================== */}
+ {activeMainTab === 'gateway_transactions' && (
+
+
+
+
+
+
+
+
+ {/* Filter Inputs */}
+
+
+
+ از:
+ setGatewayFilters({ ...gatewayFilters, fromDate: e.target.value })}
+ className="bg-transparent outline-none font-mono text-[11px]"
+ />
+ تا:
+ setGatewayFilters({ ...gatewayFilters, toDate: e.target.value })}
+ className="bg-transparent outline-none font-mono text-[11px]"
+ />
+
+
+ {/* Advanced Gateway Search Popup */}
+
+
+
+ {gatewaySearchOpen && (
+
+ )}
+
+
+
+
+ {/* Table */}
+ {loadingGatewayTx ? (
+
+
+
+ ) : gatewayTxList.length === 0 ? (
+
+
+
+
+
تراکنشی در درگاه پرداخت اینترنتی یافت نشد.
+
+ ) : (
+
+
+
+
+ | شماره تراکنش (Track ID) |
+ شناسه سفارش |
+ شماره کارت |
+ مبلغ پرداخت |
+ شماره موبایل |
+ تاریخ پرداخت |
+ وضعیت تراکنش |
+
+
+
+ {gatewayTxList.map((tx: any, i: number) => (
+
+ | {tx.trackId || '-'} |
+ {tx.orderId || '-'} |
+ {tx.cardNumber || '-'} |
+
+ {(Number(tx.amount || 0) / 10).toLocaleString()} تومان
+ |
+ {tx.mobile || '-'} |
+
+ {tx.paidAt ? new Date(tx.paidAt).toLocaleDateString('fa-IR') : '-'}
+ |
+
+
+ {tx.status === 1 || tx.status === 2 ? 'پرداخت موفق' : 'ناموفق'}
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ )}
+
+ {/* ======================================================== */}
+ {/* MODAL: SUBMIT NEW REFUND / REVERSE */}
+ {/* ======================================================== */}
+ {newRefundModal && (
+
+
+
+
+
+ ثبت درخواست استرداد وجه (Refund / Reverse)
+
+
+
+
+
+
+
+ )}
+
+ {/* ======================================================== */}
+ {/* MODAL: DETAIL / INQUIRY VIEWER */}
+ {/* ======================================================== */}
+ {detailModalItem && (
+
+
+
+
{detailModalItem.title}
+
+
+
+ {JSON.stringify(detailModalItem.data, null, 2)}
+
+
+
+ )}
+
+ );
+}
diff --git a/frontend/admin-panel/src/routes/adminRoutes.tsx b/frontend/admin-panel/src/routes/adminRoutes.tsx
index a863bce..9aaeb3f 100644
--- a/frontend/admin-panel/src/routes/adminRoutes.tsx
+++ b/frontend/admin-panel/src/routes/adminRoutes.tsx
@@ -33,6 +33,7 @@ const B2BManager = lazyWithRetry(() => import('../pages/B2BManager'));
const SeoSettingsPage = lazyWithRetry(() => import('../pages/SeoSettingsPage'));
const FinancialSettingsPage = lazyWithRetry(() => import('../pages/FinancialSettingsPage'));
const PaymentGatewaysPage = lazyWithRetry(() => import('../pages/PaymentGatewaysPage'));
+const ZibalPortalPage = lazyWithRetry(() => import('../pages/ZibalPortalPage'));
const ShippingSettingsPage = lazyWithRetry(() => import('../pages/ShippingSettingsPage'));
const SystemSettingsPage = lazyWithRetry(() => import('../pages/SystemSettingsPage'));
const SmsSettingsPage = lazyWithRetry(() => import('../pages/SmsSettingsPage'));
@@ -70,6 +71,7 @@ export const router = createBrowserRouter([
{ path: 'products/*', element: