"use client"; import { fetchPoWithStockInLines, PoResult, PurchaseOrderLine, StockInLine, } from "@/app/api/po"; import { Box, Button, ButtonProps, Collapse, Grid, IconButton, Paper, Stack, Tab, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Tabs, TabsProps, TextField, Typography, } from "@mui/material"; import { useTranslation } from "react-i18next"; // import InputDataGrid, { TableRow } from "../InputDataGrid/InputDataGrid"; import { GridColDef, GridRowId, GridRowModel, useGridApiRef, } from "@mui/x-data-grid"; import { checkPolAndCompletePo, fetchPoInClient, fetchStockInLineInfo, PurchaseQcResult, startPo, testFetch, } from "@/app/api/po/actions"; import { use, useCallback, useContext, useEffect, useMemo, useState, } from "react"; import { FormProvider, useForm } from "react-hook-form"; import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; import KeyboardArrowUpIcon from "@mui/icons-material/KeyboardArrowUp"; import InputDataGrid, { TableRow as InputTableRow, } from "../InputDataGrid/InputDataGrid"; import PoInputGrid from "./PoInputGrid"; import { QcItemWithChecks } from "@/app/api/qc"; import { useSearchParams } from "next/navigation"; import { WarehouseResult } from "@/app/api/warehouse"; import { calculateWeight, returnWeightUnit } from "@/app/utils/formatUtil"; import QrCodeScanner from "../QrCodeScanner"; import { CameraDevice, Html5Qrcode } from "html5-qrcode"; import { CameraContext } from "../Cameras/CameraProvider"; import StyledDataGrid from "../StyledDataGrid"; import { QrCodeInfo } from "@/app/api/qrcode"; import { fetchQcResult } from "@/app/api/qc/actions"; import PoQcStockInModal from "./PoQcStockInModal"; import ReactQrCodeScannerModal, { ScannerConfig, } from "../ReactQrCodeScanner/ReactQrCodeScanner"; import QrModal from "./QrModal"; import { PlayArrow } from "@mui/icons-material"; import DoneIcon from "@mui/icons-material/Done"; type Props = { po: PoResult; qc: QcItemWithChecks[]; warehouse: WarehouseResult[]; }; type EntryError = | { [field in keyof StockInLine]?: string; } | undefined; // type PolRow = TableRow, EntryError>; const PoDetail: React.FC = ({ po, qc, warehouse }) => { const cameras = useContext(CameraContext); console.log(cameras); const { t } = useTranslation("purchaseOrder"); const apiRef = useGridApiRef(); const [purchaseOrder, setPurchaseOrder] = useState({ ...po }); const [rows, setRows] = useState( purchaseOrder.pol || [] ); const params = useSearchParams(); // const [currPoStatus, setCurrPoStatus] = useState(purchaseOrder.status); const handleCompletePo = useCallback(async () => { const checkRes = await checkPolAndCompletePo(purchaseOrder.id); console.log(checkRes); const newPo = await fetchPoInClient(purchaseOrder.id); setPurchaseOrder(newPo); }, [checkPolAndCompletePo, fetchPoInClient]); const handleStartPo = useCallback(async () => { const startRes = await startPo(purchaseOrder.id); console.log(startRes); const newPo = await fetchPoInClient(purchaseOrder.id); setPurchaseOrder(newPo); }, [startPo, fetchPoInClient]); useEffect(() => { setRows(purchaseOrder.pol || []); }, [purchaseOrder]); function Row(props: { row: PurchaseOrderLine }) { const { row } = props; const [open, setOpen] = useState(false); const [processedQty, setProcessedQty] = useState(row.processed); const [currStatus, setCurrStatus] = useState(row.status); const [stockInLine, setStockInLine] = useState(row.stockInLine); const totalWeight = useMemo( () => calculateWeight(row.qty, row.uom), [calculateWeight] ); const weightUnit = useMemo( () => returnWeightUnit(row.uom), [returnWeightUnit] ); useEffect(() => { if (processedQty === row.qty) { setCurrStatus("completed".toUpperCase()); } else if (processedQty > 0) { setCurrStatus("receiving".toUpperCase()); } else { setCurrStatus("pending".toUpperCase()); } }, [processedQty]); return ( <> *": { borderBottom: "unset" }, color: "black" }}> setOpen(!open)} > {open ? : } {row.itemNo} {row.itemName} {row.qty} {processedQty} {row.uom?.code} {totalWeight} {weightUnit} {/* {weightUnit} */} {row.price} {/* {row.expiryDate} */} {t(`${currStatus.toLowerCase()}`)} {/* */}
); } const [tabIndex, setTabIndex] = useState(0); const handleTabChange = useCallback>( (_e, newValue) => { setTabIndex(newValue); }, [] ); const [isOpenScanner, setOpenScanner] = useState(false); const onOpenScanner = useCallback(() => { setOpenScanner(true); }, []); const onCloseScanner = useCallback(() => { setOpenScanner(false); }, []); const [itemInfo, setItemInfo] = useState< StockInLine & { warehouseId?: number } >(); const [putAwayOpen, setPutAwayOpen] = useState(false); // const [scannedInfo, setScannedInfo] = useState({} as QrCodeInfo); const closePutAwayModal = useCallback(() => { setPutAwayOpen(false); setItemInfo(undefined); }, []); const openPutAwayModal = useCallback(() => { setPutAwayOpen(true); }, []); const buttonData = useMemo(() => { switch (purchaseOrder.status.toLowerCase()) { case "pending": return { buttonName: "start", title: t("Do you want to start?"), confirmButtonText: t("Start"), successTitle: t("Start Success"), errorTitle: t("Start Fail"), buttonText: t("Start PO"), buttonIcon: , buttonColor: "success", disabled: false, onClick: handleStartPo, }; case "receiving": return { buttonName: "complete", title: t("Do you want to complete?"), confirmButtonText: t("Complete"), successTitle: t("Complete Success"), errorTitle: t("Complete Fail"), buttonText: t("Complete PO"), buttonIcon: , buttonColor: "info", disabled: false, onClick: handleCompletePo, }; default: return { buttonName: "complete", title: t("Do you want to complete?"), confirmButtonText: t("Complete"), successTitle: t("Complete Success"), errorTitle: t("Complete Fail"), buttonText: t("Complete PO"), buttonIcon: , buttonColor: "info", disabled: true, }; // break; } }, [purchaseOrder, handleStartPo, handleCompletePo]); return ( <> {/* {purchaseOrder.code} - {currPoStatus} */} {purchaseOrder.code} - {purchaseOrder.status} {/* {purchaseOrder.status.toLowerCase() === "pending" && ( )} {purchaseOrder.status.toLowerCase() === "receiving" && ( )} */} {/* */} {/* */} {/* */} {/* scanner */} {/* */} {/* tab 1 */} {/* for the collapse button */} {t("itemNo")} {t("itemName")} {t("qty")} {t("processed")} {t("uom")} {t("total weight")} {/* {t("weight unit")} */} {t("price")} {/* {t("expiryDate")} */} {t("status")} {/* {"add icon button"} */} {rows.map((row) => ( ))}
{/* tab 2 */} {/* */}
{itemInfo !== undefined && ( <> )} ); }; export default PoDetail;