"use client"; import { useTranslation } from "react-i18next"; import type { SettlementLedgerRow } from "@/api/admin-agent-settlement"; import { AdminNoResourceState } from "@/components/admin/admin-no-resource-state"; import { AdminLoadingState } from "@/components/admin/admin-loading-state"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { PlayerLedgerSourceBadge } from "@/components/admin/player-funding-badges"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { formatDashboardMoneyMinor } from "@/modules/dashboard/use-dashboard-analytics"; import { SettlementLedgerRowActions } from "@/modules/settlement/settlement-ledger-row-actions"; import { creditLedgerReasonLabel, settlementAdjustmentTypeLabel, settlementBillStatusLabel, } from "@/modules/settlement/settlement-status-label"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; type SettlementCreditLedgerTableProps = { rows: SettlementLedgerRow[]; loading: boolean; currencyCode: string; canManage: boolean; onOpenBill: (billId: number) => void; onRefresh: () => void; showStatusColumn?: boolean; }; function ledgerBizLabel( row: SettlementLedgerRow, t: ReturnType>["t"], ): string { if (row.entry_kind === "payment") { return t("creditLedger.reason.payment_record", { defaultValue: "账单收付" }); } if (row.entry_kind === "adjustment") { return settlementAdjustmentTypeLabel(row.biz_type, t); } return creditLedgerReasonLabel(row.biz_type, t); } function ledgerSourceForBadge(row: SettlementLedgerRow): string | null { if (row.entry_kind === "credit") { return "credit_ledger"; } if (row.entry_kind === "payment") { return "wallet_txn"; } return null; } export function SettlementCreditLedgerTable({ rows, loading, currencyCode, canManage, onOpenBill, onRefresh, showStatusColumn = false, }: SettlementCreditLedgerTableProps): React.ReactElement { const { t } = useTranslation(["settlementCenter", "agents", "common"]); const formatDt = useAdminDateTimeFormatter(); if (loading) { return ; } if (rows.length === 0) { return ; } return (
{t("creditLedger.columns.txn", { defaultValue: "流水号" })} {t("creditLedger.columns.player", { defaultValue: "玩家" })} {t("creditLedger.columns.reason", { defaultValue: "业务类型" })} {t("creditLedger.columns.ref", { defaultValue: "关联" })} {t("creditLedger.columns.amount", { defaultValue: "金额" })} {t("creditLedger.columns.channel", { defaultValue: "渠道" })} {showStatusColumn ? ( {t("creditLedger.columns.status", { defaultValue: "状态" })} ) : null} {t("creditLedger.columns.time", { defaultValue: "时间" })} {t("common:table.actions", { defaultValue: "操作" })} {rows.map((row) => { const signed = row.signed_amount ?? (row.direction === 1 ? row.amount : -row.amount); const playerLabel = row.username?.trim() || row.nickname?.trim() || row.site_player_id?.trim() || `#${row.player_id}`; const badgeSource = ledgerSourceForBadge(row); return ( {row.txn_no} {playerLabel} #{row.player_id} {ledgerBizLabel(row, t)} {row.biz_no ?? (row.settlement_bill_id ? `bill#${row.settlement_bill_id}` : "—")} {signed < 0 ? "−" : "+"} {formatDashboardMoneyMinor(Math.abs(signed), row.currency_code || currencyCode)} {badgeSource ? ( ) : ( t("creditLedger.entryKind.adjustment", { defaultValue: "调账流水" }) )} {showStatusColumn ? ( {row.bill_status ? ( {settlementBillStatusLabel(row.bill_status, t)} ) : ( {t("ledgerPanel.rowPosted", { defaultValue: "已记账" })} )} ) : null} {row.created_at ? formatDt(row.created_at) : "—"} e.stopPropagation()} > ); })}
); }