"use client"; import { useResultStore } from "@/common/stores/useResultStore"; import { StockOpnameRes } from "@/common/types/stockOpname"; import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Pagination, Skeleton, Spacer, Spinner } from "@nextui-org/react"; import { keepPreviousData, useQuery } from "@tanstack/react-query"; import styles from "./table.module.css"; import clsxm from "@/common/libs/clsxm"; import DetailRow from "./DetailRow"; import { useDebounce } from "usehooks-ts"; import getClientCredential from "@/common/libs/getClientCredential"; import { SHOWING_SELECTIONS } from "@/common/constants/result"; import { useEffect, useState } from "react"; import moment from "moment"; import { MoreVerticalIcon } from "lucide-react"; import toast from "@/common/libs/toast"; import { Product } from "prisma/generated/client"; const Table = () => { const credential = getClientCredential(); const { filter: { company, search, show, page }, updateFilter, } = useResultStore(); const debouncedSearch = useDebounce(search, 500); useEffect(() => { updateFilter("page", 1); }, [company, debouncedSearch, show, updateFilter]); const stockOpnames = useQuery({ queryKey: ["stockOpnames", company, debouncedSearch, page, show], queryFn: async () => { const searchParams = new URLSearchParams(); if (!company) return null; searchParams.set("companyId", company); const showValue = SHOWING_SELECTIONS.find((item) => item.key === show)?.value || ""; searchParams.set("show", showValue); if (debouncedSearch) searchParams.set("search", debouncedSearch); searchParams.set("page", page.toString()); return await fetch(`/api/stock-opname?${searchParams}`).then((res) => { window.scrollTo({ top: 0, behavior: "smooth" }); return res.json(); }); }, placeholderData: keepPreviousData, }); const { filter } = useResultStore(); const [exportLoad, setExportLoad] = useState(false); const exportResult = async () => { setExportLoad(true); const response = await fetch(`/api/stock-opname/export?companyId=${filter.company}`); const buffer = await response.arrayBuffer(); console.log({ type: response.headers.get("type") }); const blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `export_${moment().format("MM_DD_HH_ss")}.xlsx`; document.body.appendChild(a); a.click(); document.body.removeChild(a); setExportLoad(false); }; const toggleDifferent = async (id: number) => { const response = await fetch(`/api/product/${id}/toggle-different`, { method: "POST" }); const product: Product = await response.json(); toast(`Berhasil mengubah status barang ${product.itemCode} ${product.name} menjadi ${product.isDifferent ? "selisih" : "aman"}`, { duration: 10000 }); stockOpnames.refetch(); }; const recompute = async (productId: number, companyId: string) => { const response = await fetch(`/api/company/${companyId}/product/${productId}/compute-different`, { method: "POST" }); console.log("response", response); const stockOpname = await response.json(); console.log("stockOpname", stockOpname); toast(`Berhasil menghitung ulang status barang, hasilnya ${stockOpname.data.isDifferent ? "selisih" : "aman"}`); stockOpnames.refetch(); }; const isLoading = stockOpnames.isLoading || stockOpnames.isRefetching; const COL_LENGTH = 9; return ( <>
{!isLoading && stockOpnames.data?.result.map((stockOpname: StockOpnameRes["result"]) => ( <> ))} {!isLoading && stockOpnames.data?.result.length === 0 && ( )} {isLoading && ( )}
STATUS NAMA PRODUK TIM HITUNG 1 TIM HITUNG 2 TIM HITUNG 3 TIM VERIFIKASI ON-HAND QTY GUDANG SELISIH
{stockOpname.isDifferent ? "Selisih" : "Aman"}
{stockOpname.itemCode ? `[${stockOpname.itemCode}] ` : ""} {stockOpname.name} {stockOpname.barcode ? ` [${stockOpname.barcode}]` : ""} {credential?.team == "VERIFICATION" && typeof stockOpname.quantity.COUNT1 === "number" ? stockOpname.quantity.COUNT1 : "-"} {credential?.team == "VERIFICATION" && typeof stockOpname.quantity.COUNT2 === "number" ? stockOpname.quantity.COUNT2 : "-"} {credential?.team == "VERIFICATION" && typeof stockOpname.quantity.COUNT3 === "number" ? stockOpname.quantity.COUNT3 : "-"} {credential?.team == "VERIFICATION" && typeof stockOpname.quantity.VERIFICATION === "number" ? stockOpname.quantity.VERIFICATION : "-"} {credential?.team == "VERIFICATION" ? stockOpname.onhandQty : "-"} {credential?.team == "VERIFICATION" ? stockOpname.differenceQty : "-"} {credential?.team == "VERIFICATION" && ( recompute(stockOpname.id, company)}> Re-compute toggleDifferent(stockOpname.id)}> Tandai {stockOpname.isDifferent ? "aman" : "selisih"} )}
Belum ada data untuk ditampilkan
{Array.from({ length: 10 }, (_, i) => ( ))}
updateFilter("page", page)} className="min-h-[36px] m-0 p-0" /> ); }; export default Table;