"use client"; import Link from "next/link"; import { useCallback, useState } from "react"; import { useTranslation } from "react-i18next"; import { useAsyncEffect } from "@/hooks/use-async-effect"; import { useTranslationRef } from "@/hooks/use-translation-ref"; import { getAdminDrawFinanceSummary } from "@/api/admin-draws"; import { postAdminRunDrawSettlement } from "@/api/admin-settlement"; import { Button, buttonVariants } from "@/components/ui/button"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { AdminTableExportButton } from "@/components/admin/admin-table-export-button"; import { DrawStatusBadge } from "@/modules/draws/draw-status-badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { AdminNoResourceState } from "@/components/admin/admin-no-resource-state"; import { AdminLoadingState, AdminLoadingInline, AdminTableLoadingRow } from "@/components/admin/admin-loading-state"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { adminHasAnyPermission } from "@/lib/admin-permissions"; import { signedMoneyClass } from "@/lib/admin-signed-money"; import { cn } from "@/lib/utils"; import { useAdminProfile } from "@/stores/admin-session"; import { LotteryApiBizError } from "@/types/api/errors"; import type { AdminDrawFinanceSummaryData } from "@/types/api/admin-draw-finance"; import { toast } from "sonner"; import { useAdminCurrencyCatalog } from "@/hooks/use-admin-currency-catalog"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { useConfirmAction } from "@/hooks/use-confirm-action"; import { useExportLabels } from "@/hooks/use-export-labels"; import { formatAdminMinorUnits } from "@/lib/money"; import { drawStatusLabel, settlementBatchStatusLabel } from "./draw-display"; import { PRD_PAYOUT_MANAGE, PRD_PAYOUT_REVIEW } from "./draw-prd"; export function DrawFinanceConsole({ drawId }: { drawId: string }): React.ReactElement { const { t } = useTranslation(["draws", "settlement", "common"]); const tRef = useTranslationRef(["draws", "settlement", "common"]); useAdminCurrencyCatalog(); const idNum = Number(drawId); const profile = useAdminProfile(); const canRunSettlement = adminHasAnyPermission(profile?.permissions, [ PRD_PAYOUT_MANAGE, PRD_PAYOUT_REVIEW, ]); const [data, setData] = useState(null); const formatTs = useAdminDateTimeFormatter(); const exportLabels = useExportLabels("drawFinance", { drawNo: data?.draw_no ?? drawId }); const [err, setErr] = useState(null); const [loading, setLoading] = useState(true); const [settling, setSettling] = useState(false); const { request: requestConfirm, ConfirmDialog } = useConfirmAction(); const load = useCallback(async () => { if (!Number.isFinite(idNum) || idNum < 1) { setErr(tRef.current("invalidDrawId")); setLoading(false); return; } setLoading(true); setErr(null); try { setData(await getAdminDrawFinanceSummary(idNum)); } catch (e) { setErr(e instanceof LotteryApiBizError ? e.message : tRef.current("errors.loadFailed", { ns: "common" })); setData(null); } finally { setLoading(false); } }, [idNum]); async function runSettlement(): Promise { if (!Number.isFinite(idNum) || idNum < 1) return; setSettling(true); try { const res = await postAdminRunDrawSettlement(idNum); toast.success(res.ran ? t("runSettlement") : t("status")); await load(); } catch (e) { toast.error(e instanceof LotteryApiBizError ? e.message : t("actionFailed", { name: t("runSettlement") })); } finally { setSettling(false); } } useAsyncEffect(() => { void load(); }, [idNum]); if (loading && !data) { return ; } if (err) { return

{err}

; } if (!data) { return ; } const currencyCode = data.currency_code ?? "NPR"; const formatMoney = (minor: number) => formatAdminMinorUnits(minor, currencyCode); return (
{t("financeOverview")}
{t("drawNo")}

{data.draw_no}

{t("status")}

{t("orderAndItemCount")}

{data.order_count} / {data.ticket_item_count}

{t("actualBet")}

{formatMoney(data.total_bet_minor)}

{t("currentPayout")}

{formatMoney(data.total_payout_minor)}

{t("grossProfit")}

{formatMoney(data.approx_house_gross_minor)}

{t("settlementBatchList")}
{t("relatedSettlementBatches")} {data.settlement_batches.length === 0 ? ( ) : (
{t("table.id", { ns: "common" })} {t("status")} {t("ticketCount")} {t("winCount")} {t("payoutTotal")} {t("jackpotPayout")} {t("finishedAt")} {data.settlement_batches.map((b) => ( {b.id} {settlementBatchStatusLabel(b.status, t)} {b.total_ticket_count} {b.total_win_count} {formatMoney(b.total_payout_amount)} {formatMoney(b.total_jackpot_payout_amount)} {formatTs(b.finished_at)} ))}
)}
); }