summaryrefslogtreecommitdiff
path: root/components/bidding/manage/bidding-items-editor.tsx
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-11-27 03:08:50 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-11-27 03:08:50 +0000
commit79cfa7ea8f21ae227dbb2843ae536fe876ba7c55 (patch)
treef12efae72c62286c1a2e9a3f31d695ca22d83b6e /components/bidding/manage/bidding-items-editor.tsx
parente1da84ac863989b9f63b089c09aaa2bbcdc3d6cd (diff)
(최겸) 구매 입찰 수정
Diffstat (limited to 'components/bidding/manage/bidding-items-editor.tsx')
-rw-r--r--components/bidding/manage/bidding-items-editor.tsx61
1 files changed, 53 insertions, 8 deletions
diff --git a/components/bidding/manage/bidding-items-editor.tsx b/components/bidding/manage/bidding-items-editor.tsx
index 208cf040..f61b3960 100644
--- a/components/bidding/manage/bidding-items-editor.tsx
+++ b/components/bidding/manage/bidding-items-editor.tsx
@@ -227,6 +227,57 @@ export function BiddingItemsEditor({ biddingId, readonly = false }: BiddingItems
const userId = session?.user?.id?.toString() || '1'
let hasError = false
+ // 필수값 검증
+ for (let i = 0; i < items.length; i++) {
+ const item = items[i];
+
+ // 필수값: 자재그룹코드, 자재그룹명
+ if (!item.materialGroupNumber || !item.materialGroupInfo) {
+ toast.error(`${i + 1}번 품목의 자재그룹 정보를 입력해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+
+ // 필수값: 수량 또는 중량
+ if (quantityWeightMode === 'quantity') {
+ if (!item.quantity || parseFloat(item.quantity) <= 0) {
+ toast.error(`${i + 1}번 품목의 수량을 입력해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+ if (!item.quantityUnit) {
+ toast.error(`${i + 1}번 품목의 수량 단위를 선택해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+ } else {
+ if (!item.totalWeight || parseFloat(item.totalWeight) <= 0) {
+ toast.error(`${i + 1}번 품목의 중량을 입력해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+ if (!item.weightUnit) {
+ toast.error(`${i + 1}번 품목의 중량 단위를 선택해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+ }
+
+ // 필수값: 납품요청일
+ if (!item.requestedDeliveryDate) {
+ toast.error(`${i + 1}번 품목의 납품요청일을 입력해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+
+ // 필수값: 내정단가 (사용자 요청)
+ if (!item.targetUnitPrice || parseFloat(item.targetUnitPrice.replace(/,/g, '')) <= 0) {
+ toast.error(`${i + 1}번 품목의 내정단가를 입력해주세요.`);
+ setIsSubmitting(false);
+ return;
+ }
+ }
+
// 모든 아이템을 upsert 처리 (id가 있으면 update, 없으면 insert)
for (const item of items) {
const targetAmount = calculateTargetAmount(item)
@@ -1111,10 +1162,8 @@ export function BiddingItemsEditor({ biddingId, readonly = false }: BiddingItems
if (!open) setSelectedItemForWbs(null)
}}
selectedCode={item.wbsCode ? {
- PROJ_NO: '',
WBS_ELMT: item.wbsCode,
WBS_ELMT_NM: item.wbsName || '',
- WBS_LVL: ''
} : undefined}
onCodeSelect={(wbsCode) => {
updatePRItem(item.id, {
@@ -1167,15 +1216,12 @@ export function BiddingItemsEditor({ biddingId, readonly = false }: BiddingItems
}}
selectedCode={item.costCenterCode ? {
KOSTL: item.costCenterCode,
- KTEXT: '',
- LTEXT: item.costCenterName || '',
- DATAB: '',
- DATBI: ''
+ KTEXT: item.costCenterName || '',
} : undefined}
onCodeSelect={(costCenter) => {
updatePRItem(item.id, {
costCenterCode: costCenter.KOSTL,
- costCenterName: costCenter.LTEXT
+ costCenterName: costCenter.KTEXT
})
setCostCenterDialogOpen(false)
setSelectedItemForCostCenter(null)
@@ -1223,7 +1269,6 @@ export function BiddingItemsEditor({ biddingId, readonly = false }: BiddingItems
}}
selectedCode={item.glAccountCode ? {
SAKNR: item.glAccountCode,
- FIPEX: '',
TEXT1: item.glAccountName || ''
} : undefined}
onCodeSelect={(glAccount) => {