|
|
|
@@ -253,7 +253,7 @@ interface PolInputResult { |
|
|
|
dnQty: string, |
|
|
|
} |
|
|
|
|
|
|
|
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.1 | 2026-08-12 */ |
|
|
|
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.2 | 2026-09-07 */ |
|
|
|
const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => { |
|
|
|
const cameras = useContext(CameraContext); |
|
|
|
const { data: session } = useSession(); |
|
|
|
@@ -678,11 +678,29 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => { |
|
|
|
}, 200); |
|
|
|
}; |
|
|
|
|
|
|
|
const exceedOrderBy10Percent = orderQty > 0 && acceptedQty > orderQty * 1.1; |
|
|
|
if (exceedOrderBy10Percent) { |
|
|
|
const sils = row.stockInLine ?? []; |
|
|
|
const alreadyM18 = sils.reduce( |
|
|
|
(acc, sil) => acc + Number(sil.purchaseAcceptedQty ?? 0), |
|
|
|
0, |
|
|
|
); |
|
|
|
const alreadyStock = sils.reduce( |
|
|
|
(acc, sil) => acc + Number(sil.acceptedQty ?? 0), |
|
|
|
0, |
|
|
|
); |
|
|
|
const stockDemand = Number(row.stockUom?.stockQty ?? 0); |
|
|
|
const thisBatchStock = |
|
|
|
orderQty > 0 && stockDemand > 0 |
|
|
|
? acceptedQty * (stockDemand / orderQty) |
|
|
|
: acceptedQty; |
|
|
|
const exceedByOrderUnit = |
|
|
|
orderQty > 0 && alreadyM18 + acceptedQty > orderQty * 1.1; |
|
|
|
const exceedByStockUnit = |
|
|
|
stockDemand > 0 && |
|
|
|
alreadyStock + thisBatchStock > stockDemand * 1.1; |
|
|
|
if (exceedByOrderUnit || exceedByStockUnit) { |
|
|
|
submitDialogWithWarning(doSubmit, t, { |
|
|
|
title: t("Confirm submit"), |
|
|
|
html: t("This batch quantity exceeds order quantity. Do you still want to submit?"), |
|
|
|
html: t("qtyExceedsOrderConfirm"), |
|
|
|
confirmButtonText: t("Submit"), |
|
|
|
}); |
|
|
|
} else { |
|
|
|
@@ -834,6 +852,11 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => { |
|
|
|
<TableCell align="center"> |
|
|
|
<Button |
|
|
|
variant="contained" |
|
|
|
onMouseDown={(e) => { |
|
|
|
// Keep input focused so onBlur does not remount this row and swallow the click. |
|
|
|
e.preventDefault(); |
|
|
|
e.stopPropagation(); |
|
|
|
}} |
|
|
|
onClick={(e) => { |
|
|
|
e.stopPropagation(); |
|
|
|
handleStart(); |
|
|
|
@@ -998,7 +1021,7 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => { |
|
|
|
<> |
|
|
|
<Stack spacing={2}> |
|
|
|
{/* Area1: title */} |
|
|
|
<Grid container xs={12} justifyContent="start"> |
|
|
|
<Grid container justifyContent="start"> |
|
|
|
<Grid item> |
|
|
|
<Typography mb={2} variant="h4"> |
|
|
|
{purchaseOrder.code} -{" "} |
|
|
|
@@ -1153,7 +1176,7 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => { |
|
|
|
|
|
|
|
|
|
|
|
{/* Area4: Main Table */} |
|
|
|
<Grid container xs={12} justifyContent="start"> |
|
|
|
<Grid container justifyContent="start"> |
|
|
|
<Grid item xs={12}> |
|
|
|
<TableContainer component={Paper} sx={{ width: 'fit-content', overflow: 'auto' }}> |
|
|
|
<Table aria-label="collapsible table" stickyHeader> |
|
|
|
@@ -1187,7 +1210,7 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => { |
|
|
|
</Grid> |
|
|
|
|
|
|
|
{/* area5: selected item info */} |
|
|
|
<Grid container xs={12} justifyContent="start"> |
|
|
|
<Grid container justifyContent="start"> |
|
|
|
<Grid item xs={12}> |
|
|
|
<Typography variant="h6"> |
|
|
|
{selectedRow ? `已選擇貨品: ${selectedRow?.itemNo ? selectedRow.itemNo : 'N/A'} - ${selectedRow?.itemName ? selectedRow?.itemName : 'N/A'}` : "未選擇貨品"} |
|
|
|
|