From 3456237a39b887369c96f7939fb898ef687d4fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Mon, 26 Jan 2026 15:29:39 +0900 Subject: [PATCH] =?UTF-8?q?fix(WEB):=20=EC=88=98=EB=9F=89=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EB=AC=B8=EC=84=9C=20=EA=B8=88=EC=95=A1=20=ED=91=9C=EC=8B=9C?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - formatQuantity 함수: 단위별 정수/소수점 처리 - EA, SET, PCS 등 개수 단위: 정수 표시 - M, KG 등 측정 단위: 소수점 4자리까지 - 거래명세서: 품목코드 컬럼 너비 조정, 금액 '원' 제거 - 할인율: 정수일 경우 소수점 없이 표시 --- .../order-management-sales/[id]/edit/page.tsx | 24 ++++++++++++- .../orders/documents/ContractDocument.tsx | 9 ++++- .../documents/PurchaseOrderDocument.tsx | 22 +++++++++++- .../orders/documents/TransactionDocument.tsx | 34 +++++++++++++++---- 4 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/[id]/edit/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/[id]/edit/page.tsx index f9170912..7907ece3 100644 --- a/src/app/[locale]/(protected)/sales/order-management-sales/[id]/edit/page.tsx +++ b/src/app/[locale]/(protected)/sales/order-management-sales/[id]/edit/page.tsx @@ -45,6 +45,28 @@ import { type OrderStatus, } from "@/components/orders"; +/** + * 수량 포맷 함수 + * - EA, SET, PCS 등 개수 단위: 정수로 표시 + * - M, M2, KG, L 등 측정 단위: 소수점 이하 불필요한 0 제거 + */ +function formatQuantity(quantity: number, unit?: string): string { + const countableUnits = ["EA", "SET", "PCS", "개", "세트", "BOX", "ROLL"]; + const upperUnit = (unit || "").toUpperCase(); + + if (countableUnits.includes(upperUnit)) { + // 개수 단위는 정수로 반올림 + return Math.round(quantity).toLocaleString(); + } + + // 측정 단위는 소수점 4자리까지 반올림 후 불필요한 0 제거 + const rounded = Math.round(quantity * 10000) / 10000; + return rounded.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 4 + }); +} + // 수정 폼 데이터 interface EditFormData { // 읽기전용 정보 @@ -496,7 +518,7 @@ export default function OrderEditPage() { {item.type || "-"} {item.symbol || "-"} {item.spec} - {item.quantity} + {formatQuantity(item.quantity, item.unit)} {item.unit} {formatAmount(item.unitPrice)}원 diff --git a/src/components/orders/documents/ContractDocument.tsx b/src/components/orders/documents/ContractDocument.tsx index df2bb61d..2b4c23e5 100644 --- a/src/components/orders/documents/ContractDocument.tsx +++ b/src/components/orders/documents/ContractDocument.tsx @@ -11,6 +11,13 @@ import { formatAmount } from "@/utils/formatAmount"; import { OrderItem } from "../actions"; import { DocumentHeader } from "@/components/document-system"; +/** + * 수량 포맷 함수 (정수로 표시) + */ +function formatQuantity(quantity: number): string { + return Math.round(quantity).toLocaleString(); +} + // 제품 정보 타입 interface ProductInfo { productName: string; @@ -116,7 +123,7 @@ export function ContractDocument({
수량 -

{product.quantity} SET

+

{formatQuantity(product.quantity)} SET

{product.code && (
diff --git a/src/components/orders/documents/PurchaseOrderDocument.tsx b/src/components/orders/documents/PurchaseOrderDocument.tsx index 77ef324a..57c7549d 100644 --- a/src/components/orders/documents/PurchaseOrderDocument.tsx +++ b/src/components/orders/documents/PurchaseOrderDocument.tsx @@ -7,6 +7,26 @@ import { OrderItem } from "../actions"; +/** + * 수량 포맷 함수 + * - EA, SET, PCS 등 개수 단위: 정수로 표시 + * - M, M2, KG, L 등 측정 단위: 소수점 이하 불필요한 0 제거 + */ +function formatQuantity(quantity: number, unit?: string): string { + const countableUnits = ["EA", "SET", "PCS", "개", "세트", "BOX", "ROLL"]; + const upperUnit = (unit || "").toUpperCase(); + + if (countableUnits.includes(upperUnit)) { + return Math.round(quantity).toLocaleString(); + } + + const rounded = Math.round(quantity * 10000) / 10000; + return rounded.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 4 + }); +} + interface PurchaseOrderDocumentProps { orderNumber: string; client: string; @@ -157,7 +177,7 @@ export function PurchaseOrderDocument({ {item.width ? `${item.width}` : "-"} - {item.quantity} + {formatQuantity(item.quantity, item.unit)} {item.symbol || "-"} )) diff --git a/src/components/orders/documents/TransactionDocument.tsx b/src/components/orders/documents/TransactionDocument.tsx index 05b7aa46..7103f1dc 100644 --- a/src/components/orders/documents/TransactionDocument.tsx +++ b/src/components/orders/documents/TransactionDocument.tsx @@ -11,6 +11,26 @@ import { formatAmount } from "@/utils/formatAmount"; import { OrderItem } from "../actions"; import { DocumentHeader } from "@/components/document-system"; +/** + * 수량 포맷 함수 + * - EA, SET, PCS 등 개수 단위: 정수로 표시 + * - M, M2, KG, L 등 측정 단위: 소수점 이하 불필요한 0 제거 + */ +function formatQuantity(quantity: number, unit?: string): string { + const countableUnits = ["EA", "SET", "PCS", "개", "세트", "BOX", "ROLL"]; + const upperUnit = (unit || "").toUpperCase(); + + if (countableUnits.includes(upperUnit)) { + return Math.round(quantity).toLocaleString(); + } + + const rounded = Math.round(quantity * 10000) / 10000; + return rounded.toLocaleString(undefined, { + minimumFractionDigits: 0, + maximumFractionDigits: 4 + }); +} + interface TransactionDocumentProps { orderNumber: string; orderDate: string; @@ -125,7 +145,7 @@ export function TransactionDocument({ 순번 - 품목코드 + 품목코드 품명 규격 수량 @@ -142,7 +162,7 @@ export function TransactionDocument({ {item.itemCode} {item.itemName} {item.spec} - {item.quantity} + {formatQuantity(item.quantity, item.unit)} {item.unit} {formatAmount(item.unitPrice)} {formatAmount(item.amount)} @@ -165,23 +185,23 @@ export function TransactionDocument({ 공급가액 - {formatAmount(subtotal)}원 + {formatAmount(subtotal)} 할인율 - {discountRate}% + {Number.isInteger(discountRate) ? discountRate : Math.round(discountRate)}% 할인액 - -{formatAmount(discountAmount)}원 + {discountAmount > 0 ? `-${formatAmount(discountAmount)}` : formatAmount(discountAmount)} 할인 후 공급가액 - {formatAmount(afterDiscount)}원 + {formatAmount(afterDiscount)} 부가세 (10%) - {formatAmount(vat)}원 + {formatAmount(vat)} 합계 금액