"use client"; import { ArrowRight, Eye } from "lucide-react"; import { useTranslation } from "react-i18next"; import type { SettlementBillRow } from "@/api/admin-agent-settlement"; import { AdminNoResourceState } from "@/components/admin/admin-no-resource-state"; import { AdminLoadingState } from "@/components/admin/admin-loading-state"; import { AdminRowActionsMenu } from "@/components/admin/admin-row-actions-menu"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { signedMoneyClass } from "@/lib/admin-signed-money"; import { cn } from "@/lib/utils"; import { formatSettlementPeriodSpan } from "@/lib/agent-settlement-period-range"; import { formatSignedSettlementMoney, } from "@/modules/settlement/settlement-signed-money"; import { describeBillPaymentDirection, } from "@/modules/settlement/settlement-bill-display"; import { formatPlatformPartyLabel, SettlementDashCell, } from "@/modules/settlement/settlement-party-cells"; import { settlementBillStatusLabel, settlementBillTypeLabel, } from "@/modules/settlement/settlement-status-label"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; type BillTypeFilter = "all" | "player" | "agent"; type SettlementBillsTableProps = { rows: SettlementBillRow[]; loading: boolean; currencyCode: string; billTypeFilter?: BillTypeFilter; emptyMessage?: string; onOpenDetail: (billId: number) => void; }; function billRowTone(row: SettlementBillRow): string { if (row.bill_type === "player") { return "border-l-2 border-l-sky-300/80"; } if (row.bill_type === "agent") { return "border-l-2 border-l-amber-300/80 bg-amber-50/20"; } if (row.bill_type === "adjustment" || row.bill_type === "reversal") { return "border-l-2 border-l-emerald-300/80 bg-emerald-50/20"; } if (row.bill_type === "bad_debt") { return "border-l-2 border-l-rose-300/80 bg-rose-50/20"; } return ""; } function billTypeTone(row: SettlementBillRow): string { if (row.bill_type === "player") { return "border-sky-200 bg-sky-50 text-sky-700"; } if (row.bill_type === "agent") { return "border-amber-200 bg-amber-50 text-amber-800"; } if (row.bill_type === "adjustment" || row.bill_type === "reversal") { return "border-emerald-200 bg-emerald-50 text-emerald-700"; } if (row.bill_type === "bad_debt") { return "border-rose-200 bg-rose-50 text-rose-700"; } return "border-border/70 bg-muted/25 text-muted-foreground"; } function unpaidMoneyClass(row: SettlementBillRow): string { if (row.unpaid_amount <= 0) { return "text-muted-foreground"; } if (row.status === "overdue") { return "font-medium text-destructive"; } return "font-medium text-amber-800 dark:text-amber-300"; } function paidMoneyClass(row: SettlementBillRow): string { if ((row.paid_amount ?? 0) <= 0) { return "text-muted-foreground"; } if (row.unpaid_amount > 0) { return "font-medium text-amber-800 dark:text-amber-300"; } return "font-medium text-emerald-700"; } function ownerPartyLabel(row: SettlementBillRow): string | null { if (row.bill_type === "player") { return row.player_username ?? row.owner_label ?? null; } if (row.bill_type === "agent") { return row.owner_party_label ?? row.owner_label ?? null; } return row.owner_label ?? null; } export function SettlementBillsTable({ rows, loading, currencyCode, billTypeFilter = "all", emptyMessage, onOpenDetail, }: SettlementBillsTableProps): React.ReactElement { const { t } = useTranslation(["settlementCenter", "agents", "common"]); const agentView = billTypeFilter === "agent"; const playerView = billTypeFilter === "player"; const mixedView = billTypeFilter === "all"; if (loading) { return ; } if (rows.length === 0) { return ; } return (
{t("columns.billId", { defaultValue: "账单 ID" })} {t("columns.period", { defaultValue: "账期" })} {t("columns.type", { defaultValue: "类型" })} {playerView ? ( <> {t("columns.playerAccount", { defaultValue: "玩家账号" })} {t("columns.playerId", { defaultValue: "玩家 ID" })} {t("columns.directAgent", { defaultValue: "直属代理" })} ) : null} {agentView ? ( {t("columns.owner", { defaultValue: "本方" })} ) : null} {mixedView ? ( {t("columns.owner", { defaultValue: "本方" })} ) : null} {t("billDisplay.settlementFlow", { defaultValue: "谁付谁" })} {t("columns.superiorAgent", { defaultValue: "上级" })} {!playerView ? ( {t("columns.gross", { defaultValue: "输赢" })} ) : null} {t("billDisplay.settlementAmount", { defaultValue: "结算金额" })} {t("columns.paid", { defaultValue: "已收付" })} {t("columns.unpaid", { defaultValue: "未结" })} {t("columns.status", { defaultValue: "状态" })} {t("common:table.actions", { defaultValue: "操作" })} {rows.map((row) => { const isPlayerBill = row.bill_type === "player"; const direction = describeBillPaymentDirection(row, t); return ( {row.id} {formatSettlementPeriodSpan(row.period_start, row.period_end)} {settlementBillTypeLabel(row.bill_type, t)} {playerView ? ( <> ) : null} {agentView ? ( ) : null} {mixedView ? ( ) : null}
{direction.payer} {direction.payee}
{formatPlatformPartyLabel(row.superior_agent_label, t)} {!playerView ? ( {row.gross_win_loss != null ? (
{formatSignedSettlementMoney(row.gross_win_loss, currencyCode)}
) : ( "—" )}
) : null}
{formatDashboardMoneyMinor(direction.amount, currencyCode)}
{formatDashboardMoneyMinor(row.paid_amount ?? 0, currencyCode)} {formatDashboardMoneyMinor(row.unpaid_amount, currencyCode)} {settlementBillStatusLabel(row.status, t)} e.stopPropagation()} > onOpenDetail(row.id), }, ]} />
); })}
); }