"use client"; import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { AdminListPaginationFooter } from "@/components/admin/admin-list-pagination-footer"; import { AdminTableNoResourceRow } from "@/components/admin/admin-no-resource-state"; import { AdminStatusBadge } from "@/components/admin/admin-status-badge"; import { AdminLoadingState, AdminTableLoadingRow } from "@/components/admin/admin-loading-state"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useAdminDateTimeFormatter } from "@/hooks/use-admin-datetime-formatter"; import { ReconcileItemRow } from "@/modules/reconcile/reconcile-item-row"; import { getJobSummaryValue, isOpenReconcileItem, jobStatusLabel, renderPeriodRange, } from "@/modules/reconcile/reconcile-labels"; import type { AdminReconcileItemsData, AdminReconcileJobRow, } from "@/types/api/admin-reconcile"; export type ReconcileItemsFilter = "open" | "all"; type ReconcileJobDetailPanelProps = { job: AdminReconcileJobRow; items: AdminReconcileItemsData | null; itemsLoading: boolean; itemsFilter: ReconcileItemsFilter; onItemsFilterChange: (filter: ReconcileItemsFilter) => void; canWriteWallet: boolean; actionBusy: boolean; onCompleteCredit: (transferNo: string) => void; onReverse: (transferNo: string) => void; onManualProcess: (transferNo: string) => void; onItemsPageChange: (page: number) => void; onItemsPerPageChange: (perPage: number) => void; }; export function ReconcileJobDetailPanel({ job, items, itemsLoading, itemsFilter, onItemsFilterChange, canWriteWallet, actionBusy, onCompleteCredit, onReverse, onManualProcess, onItemsPageChange, onItemsPerPageChange, }: ReconcileJobDetailPanelProps): React.ReactElement { const { t } = useTranslation("reconcile"); const formatTs = useAdminDateTimeFormatter(); const mismatchCount = getJobSummaryValue(job.summary_json, "mismatch_count"); const itemCount = getJobSummaryValue(job.summary_json, "item_count"); const displayedItems = useMemo(() => { if (!items) { return []; } if (itemsFilter === "all") { return items.items; } return items.items.filter(isOpenReconcileItem); }, [items, itemsFilter]); return (

{t("detailsTitle")}

{job.job_no}

{t("status")}
{jobStatusLabel(job.status, t)}
{t("mismatchCount")}
{mismatchCount}
{t("itemCount")}
{itemCount}
{t("period")}
{renderPeriodRange(job, formatTs)}
{itemsLoading && !items ? ( ) : ( <> {items ? (

{t("filterCount", { shown: displayedItems.length, total: items.meta.total, })}

) : null}
{t("transferNo")} {t("walletTxnNo")} {t("mainSiteCheck")} {t("detectedAt")} {t("itemScanFindingColumn")} {t("itemCurrentStatusColumn")} {t("differenceAmount")} {t("actions")} {itemsLoading && items ? ( ) : displayedItems.length === 0 ? ( ) : ( displayedItems.map((item) => ( )) )}
{items?.meta ? (
{ onItemsPerPageChange(n); onItemsPageChange(1); }} onPageChange={onItemsPageChange} />
) : null} )}
); }