| @@ -11,7 +11,7 @@ import { Suspense } from "react"; | |||||
| type Props = {} & SearchParams; | type Props = {} & SearchParams; | ||||
| const PoEdit: React.FC<Props> = async ({ searchParams }) => { | const PoEdit: React.FC<Props> = async ({ searchParams }) => { | ||||
| const type = "po"; | |||||
| const type = "purchaseOrder"; | |||||
| const { t } = await getServerI18n(type); | const { t } = await getServerI18n(type); | ||||
| console.log(searchParams["id"]); | console.log(searchParams["id"]); | ||||
| const id = isString(searchParams["id"]) | const id = isString(searchParams["id"]) | ||||
| @@ -1,7 +1,7 @@ | |||||
| import { preloadClaims } from "@/app/api/claims"; | import { preloadClaims } from "@/app/api/claims"; | ||||
| import ClaimSearch from "@/components/ClaimSearch"; | import ClaimSearch from "@/components/ClaimSearch"; | ||||
| import PoSearch from "@/components/PoSearch"; | import PoSearch from "@/components/PoSearch"; | ||||
| import { getServerI18n } from "@/i18n"; | |||||
| import { getServerI18n, I18nProvider } from "@/i18n"; | |||||
| import Add from "@mui/icons-material/Add"; | import Add from "@mui/icons-material/Add"; | ||||
| import Button from "@mui/material/Button"; | import Button from "@mui/material/Button"; | ||||
| import Stack from "@mui/material/Stack"; | import Stack from "@mui/material/Stack"; | ||||
| @@ -20,6 +20,7 @@ const PurchaseOrder: React.FC = async () => { | |||||
| return ( | return ( | ||||
| <> | <> | ||||
| <I18nProvider namespaces={["purchaseOrder", "common"]}> | |||||
| <Stack | <Stack | ||||
| direction="row" | direction="row" | ||||
| justifyContent="space-between" | justifyContent="space-between" | ||||
| @@ -38,6 +39,7 @@ const PurchaseOrder: React.FC = async () => { | |||||
| <Suspense fallback={<PoSearch.Loading />}> | <Suspense fallback={<PoSearch.Loading />}> | ||||
| <PoSearch /> | <PoSearch /> | ||||
| </Suspense> | </Suspense> | ||||
| </I18nProvider> | |||||
| </> | </> | ||||
| ); | ); | ||||
| }; | }; | ||||
| @@ -49,7 +49,7 @@ const EscalationForm: React.FC<Props> = ({ | |||||
| itemDetail, | itemDetail, | ||||
| disabled | disabled | ||||
| }) => { | }) => { | ||||
| const { t } = useTranslation(); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const { | const { | ||||
| register, | register, | ||||
| @@ -91,14 +91,14 @@ type EntryError = | |||||
| const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | ||||
| const cameras = useContext(CameraContext); | const cameras = useContext(CameraContext); | ||||
| console.log(cameras); | console.log(cameras); | ||||
| const { t } = useTranslation(); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const [purchaseOrder, setPurchaseOrder] = useState({ ...po }); | const [purchaseOrder, setPurchaseOrder] = useState({ ...po }); | ||||
| const [rows, setRows] = useState<PurchaseOrderLine[]>( | const [rows, setRows] = useState<PurchaseOrderLine[]>( | ||||
| purchaseOrder.pol || [] | purchaseOrder.pol || [] | ||||
| ); | ); | ||||
| const params = useSearchParams(); | const params = useSearchParams(); | ||||
| const [currPoStatus, setCurrPoStatus] = useState(purchaseOrder.status); | |||||
| // const [currPoStatus, setCurrPoStatus] = useState(purchaseOrder.status); | |||||
| const handleCompletePo = useCallback(async () => { | const handleCompletePo = useCallback(async () => { | ||||
| const checkRes = await checkPolAndCompletePo(purchaseOrder.id); | const checkRes = await checkPolAndCompletePo(purchaseOrder.id); | ||||
| @@ -167,7 +167,7 @@ const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | |||||
| {/* <TableCell align="left">{weightUnit}</TableCell> */} | {/* <TableCell align="left">{weightUnit}</TableCell> */} | ||||
| <TableCell align="left">{row.price}</TableCell> | <TableCell align="left">{row.price}</TableCell> | ||||
| {/* <TableCell align="left">{row.expiryDate}</TableCell> */} | {/* <TableCell align="left">{row.expiryDate}</TableCell> */} | ||||
| <TableCell align="left">{currStatus}</TableCell> | |||||
| <TableCell align="left">{t(`${currStatus.toLowerCase()}`)}</TableCell> | |||||
| </TableRow> | </TableRow> | ||||
| <TableRow> | <TableRow> | ||||
| {/* <TableCell /> */} | {/* <TableCell /> */} | ||||
| @@ -351,7 +351,7 @@ const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | |||||
| <TableCell>{t("itemNo")}</TableCell> | <TableCell>{t("itemNo")}</TableCell> | ||||
| <TableCell align="left">{t("itemName")}</TableCell> | <TableCell align="left">{t("itemName")}</TableCell> | ||||
| <TableCell align="left">{t("qty")}</TableCell> | <TableCell align="left">{t("qty")}</TableCell> | ||||
| <TableCell align="left">processed</TableCell> | |||||
| <TableCell align="left">{t("processed")}</TableCell> | |||||
| <TableCell align="left">{t("uom")}</TableCell> | <TableCell align="left">{t("uom")}</TableCell> | ||||
| <TableCell align="left">{t("total weight")}</TableCell> | <TableCell align="left">{t("total weight")}</TableCell> | ||||
| {/* <TableCell align="left">{t("weight unit")}</TableCell> */} | {/* <TableCell align="left">{t("weight unit")}</TableCell> */} | ||||
| @@ -110,7 +110,7 @@ function PoInputGrid({ | |||||
| warehouse, | warehouse, | ||||
| }: Props) { | }: Props) { | ||||
| console.log(itemDetail); | console.log(itemDetail); | ||||
| const { t } = useTranslation("home"); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const [rowModesModel, setRowModesModel] = useState<GridRowModesModel>({}); | const [rowModesModel, setRowModesModel] = useState<GridRowModesModel>({}); | ||||
| const getRowId = useCallback<GridRowIdGetter<StockInLineRow>>( | const getRowId = useCallback<GridRowIdGetter<StockInLineRow>>( | ||||
| @@ -369,15 +369,17 @@ function PoInputGrid({ | |||||
| () => [ | () => [ | ||||
| { | { | ||||
| field: "itemNo", | field: "itemNo", | ||||
| headerName: t("itemNo"), | |||||
| flex: 0.4, | flex: 0.4, | ||||
| }, | }, | ||||
| { | { | ||||
| field: "itemName", | field: "itemName", | ||||
| headerName: t("itemName"), | |||||
| flex: 0.6, | flex: 0.6, | ||||
| }, | }, | ||||
| { | { | ||||
| field: "acceptedQty", | field: "acceptedQty", | ||||
| headerName: "qty", | |||||
| headerName: t("acceptedQty"), | |||||
| flex: 0.5, | flex: 0.5, | ||||
| type: "number", | type: "number", | ||||
| editable: true, | editable: true, | ||||
| @@ -385,7 +387,7 @@ function PoInputGrid({ | |||||
| }, | }, | ||||
| { | { | ||||
| field: "uom", | field: "uom", | ||||
| headerName: "uom", | |||||
| headerName: t("uom"), | |||||
| flex: 0.5, | flex: 0.5, | ||||
| renderCell: (params) => { | renderCell: (params) => { | ||||
| return params.row.uom.code; | return params.row.uom.code; | ||||
| @@ -393,7 +395,7 @@ function PoInputGrid({ | |||||
| }, | }, | ||||
| { | { | ||||
| field: "weight", | field: "weight", | ||||
| headerName: "weight", | |||||
| headerName: t("weight"), | |||||
| flex: 0.5, | flex: 0.5, | ||||
| renderCell: (params) => { | renderCell: (params) => { | ||||
| const weight = calculateWeight( | const weight = calculateWeight( | ||||
| @@ -406,13 +408,18 @@ function PoInputGrid({ | |||||
| }, | }, | ||||
| { | { | ||||
| field: "status", | field: "status", | ||||
| headerName: t("status"), | |||||
| flex: 0.5, | flex: 0.5, | ||||
| renderCell: (params) => { | |||||
| return t(`${params.row.status}`) | |||||
| } | |||||
| // editable: true, | // editable: true, | ||||
| }, | }, | ||||
| { | { | ||||
| field: "actions", | field: "actions", | ||||
| type: "actions", | type: "actions", | ||||
| headerName: "start | qc | escalation | stock in | putaway | delete", | |||||
| headerName: `${t("start")} | ${t("qc")} | ${t("escalation")} | ${t("stock in")} | ${t("putaway")} | ${t("delete")}`, | |||||
| // headerName: "start | qc | escalation | stock in | putaway | delete", | |||||
| flex: 1.5, | flex: 1.5, | ||||
| cellClassName: "actions", | cellClassName: "actions", | ||||
| getActions: (params) => { | getActions: (params) => { | ||||
| @@ -578,7 +585,7 @@ function PoInputGrid({ | |||||
| console.log(newRow); | console.log(newRow); | ||||
| console.log(currQty); | console.log(currQty); | ||||
| if (newRow.acceptedQty && newRow.acceptedQty > itemDetail.qty) { | if (newRow.acceptedQty && newRow.acceptedQty > itemDetail.qty) { | ||||
| error["acceptedQty"] = "qty cannot be greater than remaining qty"; | |||||
| error["acceptedQty"] = t("qty cannot be greater than remaining qty"); | |||||
| } | } | ||||
| return Object.keys(error).length > 0 ? error : undefined; | return Object.keys(error).length > 0 ? error : undefined; | ||||
| }, | }, | ||||
| @@ -91,11 +91,13 @@ const style = { | |||||
| top: "50%", | top: "50%", | ||||
| left: "50%", | left: "50%", | ||||
| transform: "translate(-50%, -50%)", | transform: "translate(-50%, -50%)", | ||||
| overflow: "scroll", | |||||
| bgcolor: "background.paper", | bgcolor: "background.paper", | ||||
| pt: 5, | pt: 5, | ||||
| px: 5, | px: 5, | ||||
| pb: 10, | pb: 10, | ||||
| width: { xs: "80%", sm: "80%", md: "80%" }, | |||||
| display: "block", | |||||
| width: { xs: "60%", sm: "60%", md: "60%" }, | |||||
| }; | }; | ||||
| const PoQcStockInModal: React.FC<Props> = ({ | const PoQcStockInModal: React.FC<Props> = ({ | ||||
| @@ -113,7 +115,7 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
| const { setIsUploading } = useUploadContext(); | const { setIsUploading } = useUploadContext(); | ||||
| const [serverError, setServerError] = useState(""); | const [serverError, setServerError] = useState(""); | ||||
| const { t } = useTranslation(); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const params = useSearchParams(); | const params = useSearchParams(); | ||||
| const [btnIsLoading, setBtnIsLoading] = useState(false); | const [btnIsLoading, setBtnIsLoading] = useState(false); | ||||
| @@ -371,10 +373,11 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
| // useEffect(() => { | // useEffect(() => { | ||||
| // console.log(renderSubmitButton) | // console.log(renderSubmitButton) | ||||
| // }, [renderSubmitButton]) | // }, [renderSubmitButton]) | ||||
| return ( | return ( | ||||
| <> | <> | ||||
| <FormProvider {...formProps}> | <FormProvider {...formProps}> | ||||
| <Modal open={open} onClose={closeHandler}> | |||||
| <Modal open={open} onClose={closeHandler} sx={{ overflow: "scroll" }}> | |||||
| <Box | <Box | ||||
| sx={style} | sx={style} | ||||
| component="form" | component="form" | ||||
| @@ -387,14 +390,14 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
| disabled={!renderSubmitButton} | disabled={!renderSubmitButton} | ||||
| /> | /> | ||||
| )} | )} | ||||
| {itemDetail !== undefined && type === "stockIn" && ( | |||||
| <StockInForm | |||||
| {itemDetail !== undefined && type === "escalation" && ( | |||||
| <EscalationForm | |||||
| itemDetail={itemDetail} | itemDetail={itemDetail} | ||||
| disabled={!renderSubmitButton} | disabled={!renderSubmitButton} | ||||
| /> | /> | ||||
| )} | )} | ||||
| {itemDetail !== undefined && type === "escalation" && ( | |||||
| <EscalationForm | |||||
| {itemDetail !== undefined && type === "stockIn" && ( | |||||
| <StockInForm | |||||
| itemDetail={itemDetail} | itemDetail={itemDetail} | ||||
| disabled={!renderSubmitButton} | disabled={!renderSubmitButton} | ||||
| /> | /> | ||||
| @@ -73,7 +73,7 @@ const style = { | |||||
| }; | }; | ||||
| const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse, disabled }) => { | const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse, disabled }) => { | ||||
| const { t } = useTranslation(); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const { | const { | ||||
| register, | register, | ||||
| @@ -286,7 +286,7 @@ const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse, disabled }) => { | |||||
| </Grid> | </Grid> | ||||
| <Grid item xs={6}> | <Grid item xs={6}> | ||||
| <TextField | <TextField | ||||
| label={t("item name")} | |||||
| label={t("itemName")} | |||||
| fullWidth | fullWidth | ||||
| value={itemDetail.itemName} | value={itemDetail.itemName} | ||||
| disabled | disabled | ||||
| @@ -294,7 +294,7 @@ const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse, disabled }) => { | |||||
| </Grid> | </Grid> | ||||
| <Grid item xs={6}> | <Grid item xs={6}> | ||||
| <TextField | <TextField | ||||
| label={t("item no")} | |||||
| label={t("itemNo")} | |||||
| fullWidth | fullWidth | ||||
| value={itemDetail.itemNo} | value={itemDetail.itemNo} | ||||
| disabled | disabled | ||||
| @@ -51,7 +51,7 @@ type EntryError = | |||||
| type PoQcRow = TableRow<Partial<PurchaseQcResult>, EntryError>; | type PoQcRow = TableRow<Partial<PurchaseQcResult>, EntryError>; | ||||
| // fetchQcItemCheck | // fetchQcItemCheck | ||||
| const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | ||||
| const { t } = useTranslation(); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const { | const { | ||||
| register, | register, | ||||
| @@ -74,19 +74,19 @@ const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | |||||
| console.log(accQty); | console.log(accQty); | ||||
| if (accQty > itemDetail.acceptedQty) { | if (accQty > itemDetail.acceptedQty) { | ||||
| setError("acceptedQty", { | setError("acceptedQty", { | ||||
| message: `acceptedQty must not greater than ${itemDetail.acceptedQty}`, | |||||
| message: `${t("acceptedQty must not greater than")} ${itemDetail.acceptedQty}`, | |||||
| type: "required", | type: "required", | ||||
| }); | }); | ||||
| } | } | ||||
| if (accQty < 1) { | if (accQty < 1) { | ||||
| setError("acceptedQty", { | setError("acceptedQty", { | ||||
| message: `minimal value is 1`, | |||||
| message: t("minimal value is 1"), | |||||
| type: "required", | type: "required", | ||||
| }); | }); | ||||
| } | } | ||||
| if (isNaN(accQty)) { | if (isNaN(accQty)) { | ||||
| setError("acceptedQty", { | setError("acceptedQty", { | ||||
| message: `value must be a number`, | |||||
| message: t("value must be a number"), | |||||
| type: "required", | type: "required", | ||||
| }); | }); | ||||
| } | } | ||||
| @@ -101,7 +101,7 @@ const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | |||||
| () => [ | () => [ | ||||
| { | { | ||||
| field: "qcItemId", | field: "qcItemId", | ||||
| headerName: "qc Check", | |||||
| headerName: t("qc Check"), | |||||
| flex: 1, | flex: 1, | ||||
| editable: !disabled, | editable: !disabled, | ||||
| valueFormatter(params) { | valueFormatter(params) { | ||||
| @@ -139,7 +139,7 @@ const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | |||||
| /> | /> | ||||
| ); | ); | ||||
| return errorMessage ? ( | return errorMessage ? ( | ||||
| <Tooltip title={t(errorMessage)}> | |||||
| <Tooltip title={errorMessage}> | |||||
| <Box width="100%">{content}</Box> | <Box width="100%">{content}</Box> | ||||
| </Tooltip> | </Tooltip> | ||||
| ) : ( | ) : ( | ||||
| @@ -149,7 +149,7 @@ const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | |||||
| }, | }, | ||||
| { | { | ||||
| field: "failQty", | field: "failQty", | ||||
| headerName: "failQty", | |||||
| headerName: t("failQty"), | |||||
| flex: 1, | flex: 1, | ||||
| editable: !disabled, | editable: !disabled, | ||||
| type: "number", | type: "number", | ||||
| @@ -179,13 +179,13 @@ const QcForm: React.FC<Props> = ({ qc, itemDetail, disabled }) => { | |||||
| const error: EntryError = {}; | const error: EntryError = {}; | ||||
| const { qcItemId, failQty } = newRow; | const { qcItemId, failQty } = newRow; | ||||
| if (!qcItemId || qcItemId <= 0) { | if (!qcItemId || qcItemId <= 0) { | ||||
| error["qcItemId"] = "select qc"; | |||||
| error["qcItemId"] = t("select qc"); | |||||
| } | } | ||||
| if (!failQty || failQty <= 0) { | if (!failQty || failQty <= 0) { | ||||
| error["failQty"] = "enter a failQty"; | |||||
| error["failQty"] = t("enter a failQty"); | |||||
| } | } | ||||
| if (failQty && failQty > itemDetail.acceptedQty) { | if (failQty && failQty > itemDetail.acceptedQty) { | ||||
| error["failQty"] = "qty too big"; | |||||
| error["failQty"] = t("qty too big"); | |||||
| } | } | ||||
| return Object.keys(error).length > 0 ? error : undefined; | return Object.keys(error).length > 0 ? error : undefined; | ||||
| }, | }, | ||||
| @@ -49,7 +49,7 @@ const RejectForm: React.FC<Props> = ({ | |||||
| itemDetail, | itemDetail, | ||||
| disabled | disabled | ||||
| }) => { | }) => { | ||||
| const { t } = useTranslation(); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const { | const { | ||||
| register, | register, | ||||
| @@ -61,7 +61,7 @@ const StockInForm: React.FC<Props> = ({ | |||||
| const { | const { | ||||
| t, | t, | ||||
| i18n: { language }, | i18n: { language }, | ||||
| } = useTranslation(); | |||||
| } = useTranslation("purchaseOrder"); | |||||
| const apiRef = useGridApiRef(); | const apiRef = useGridApiRef(); | ||||
| const { | const { | ||||
| register, | register, | ||||
| @@ -22,7 +22,7 @@ type SearchParamNames = keyof SearchQuery; | |||||
| const PoSearch: React.FC<Props> = ({ po, warehouse }) => { | const PoSearch: React.FC<Props> = ({ po, warehouse }) => { | ||||
| const [filteredPo, setFilteredPo] = useState<PoResult[]>(po); | const [filteredPo, setFilteredPo] = useState<PoResult[]>(po); | ||||
| const { t } = useTranslation("po"); | |||||
| const { t } = useTranslation("purchaseOrder"); | |||||
| const router = useRouter(); | const router = useRouter(); | ||||
| const searchCriteria: Criterion<SearchParamNames>[] = useMemo(() => { | const searchCriteria: Criterion<SearchParamNames>[] = useMemo(() => { | ||||
| @@ -146,10 +146,12 @@ function SearchResults<T extends ResultWithId>({ | |||||
| const [page, setPage] = React.useState(0); | const [page, setPage] = React.useState(0); | ||||
| const [rowsPerPage, setRowsPerPage] = React.useState(10); | const [rowsPerPage, setRowsPerPage] = React.useState(10); | ||||
| /// this | |||||
| const handleChangePage: TablePaginationProps["onPageChange"] = ( | const handleChangePage: TablePaginationProps["onPageChange"] = ( | ||||
| _event, | _event, | ||||
| newPage, | newPage, | ||||
| ) => { | ) => { | ||||
| console.log(_event) | |||||
| setPage(newPage); | setPage(newPage); | ||||
| if (setPagingController) { | if (setPagingController) { | ||||
| setPagingController({ | setPagingController({ | ||||
| @@ -157,11 +159,12 @@ function SearchResults<T extends ResultWithId>({ | |||||
| pageNum: newPage + 1, | pageNum: newPage + 1, | ||||
| }) | }) | ||||
| } | } | ||||
| }; | |||||
| } | |||||
| const handleChangeRowsPerPage: TablePaginationProps["onRowsPerPageChange"] = ( | const handleChangeRowsPerPage: TablePaginationProps["onRowsPerPageChange"] = ( | ||||
| event, | event, | ||||
| ) => { | ) => { | ||||
| console.log(event) | |||||
| setRowsPerPage(+event.target.value); | setRowsPerPage(+event.target.value); | ||||
| setPage(0); | setPage(0); | ||||
| if (setPagingController) { | if (setPagingController) { | ||||
| @@ -0,0 +1 @@ | |||||
| {} | |||||
| @@ -1 +1,7 @@ | |||||
| {} | |||||
| { | |||||
| "Search Criteria": "搜尋條件", | |||||
| "All": "全部", | |||||
| "No options": "沒有選項", | |||||
| "Reset": "重置", | |||||
| "Search": "搜尋" | |||||
| } | |||||
| @@ -0,0 +1,85 @@ | |||||
| { | |||||
| "Purchase Order": "採購訂單", | |||||
| "Code": "編號", | |||||
| "OrderDate": "下單日期", | |||||
| "Details": "詳情", | |||||
| "Supplier": "供應商", | |||||
| "Status": "狀態", | |||||
| "Escalated": "已上報", | |||||
| "Do you want to start?": "確定開始嗎?", | |||||
| "Start": "開始", | |||||
| "Start Success": "開始成功", | |||||
| "Start Fail": "開始失敗", | |||||
| "Start PO": "開始採購訂單", | |||||
| "Do you want to complete?": "確定完成嗎?", | |||||
| "Complete": "完成", | |||||
| "Complete Success": "完成成功", | |||||
| "Complete Fail": "完成失敗", | |||||
| "Complete PO": "完成採購訂單", | |||||
| "General": "一般", | |||||
| "Bind Storage": "綁定倉位", | |||||
| "itemNo": "項目編號", | |||||
| "itemName": "項目名稱", | |||||
| "qty": "數量", | |||||
| "uom": "計量單位", | |||||
| "total weight": "總重量", | |||||
| "weight unit": "重量單位", | |||||
| "price": "價格", | |||||
| "processed": "已入倉", | |||||
| "expiryDate": "到期日", | |||||
| "acceptedQty": "接受數量", | |||||
| "weight": "重量", | |||||
| "status": "狀態", | |||||
| "start": "開始", | |||||
| "qc": "質量控制", | |||||
| "escalation": "上報", | |||||
| "stock in": "入庫", | |||||
| "putaway": "上架", | |||||
| "delete": "刪除", | |||||
| "qty cannot be greater than remaining qty": "數量不能大於剩餘數量", | |||||
| "Record pol": "記錄採購訂單", | |||||
| "Add some entries!": "添加條目!", | |||||
| "draft": "草稿", | |||||
| "pending": "待處理", | |||||
| "determine1": "上報1", | |||||
| "determine2": "上報2", | |||||
| "determine3": "上報3", | |||||
| "receiving": "收貨中", | |||||
| "received": "已收貨", | |||||
| "completed": "已完成", | |||||
| "rejected": "已拒絕", | |||||
| "acceptedQty must not greater than": "接受數量不得大於", | |||||
| "minimal value is 1": "最小值為1", | |||||
| "value must be a number": "值必須是數字", | |||||
| "qc Check": "質量控制檢查", | |||||
| "Please select QC": "請選擇質量控制", | |||||
| "failQty": "失敗數量", | |||||
| "select qc": "選擇質量控制", | |||||
| "enter a failQty": "請輸入失敗數量", | |||||
| "qty too big": "數量過大", | |||||
| "sampleRate": "抽樣率", | |||||
| "sampleWeight": "樣本重量", | |||||
| "totalWeight": "總重量", | |||||
| "Escalation": "上報", | |||||
| "to be processed": "待處理", | |||||
| "Stock In Detail": "入庫詳情", | |||||
| "productLotNo": "產品批號", | |||||
| "receiptDate": "收貨日期", | |||||
| "acceptedWeight": "接受重量", | |||||
| "productionDate": "生產日期", | |||||
| "Select warehouse": "選擇倉庫", | |||||
| "Putaway Detail": "上架詳情", | |||||
| "LotNo": "批號", | |||||
| "Po Code": "採購訂單編號", | |||||
| "No Warehouse": "沒有倉庫", | |||||
| "Please scan warehouse qr code.": "請掃描倉庫 QR 碼。", | |||||
| "Reject": "拒絕", | |||||
| "submit": "提交", | |||||
| "print": "列印" | |||||
| } | |||||