diff options
Diffstat (limited to 'components/bidding/manage/bidding-items-editor.tsx')
| -rw-r--r-- | components/bidding/manage/bidding-items-editor.tsx | 61 |
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) => { |
