From dd831478a3ab5ac7182903d41aa4b3e47f28224f Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 15 Sep 2025 10:13:11 +0000 Subject: (최겸) 구매 입찰 테스트 및 수정사항 반영 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/bidding/list/create-bidding-dialog.tsx | 78 +++++++++++++++++++++++------- 1 file changed, 61 insertions(+), 17 deletions(-) (limited to 'lib/bidding/list/create-bidding-dialog.tsx') diff --git a/lib/bidding/list/create-bidding-dialog.tsx b/lib/bidding/list/create-bidding-dialog.tsx index 57cc1002..4fc4fd7b 100644 --- a/lib/bidding/list/create-bidding-dialog.tsx +++ b/lib/bidding/list/create-bidding-dialog.tsx @@ -67,7 +67,7 @@ import { } from "@/components/ui/file-list" import { Checkbox } from "@/components/ui/checkbox" -import { createBidding, type CreateBiddingInput } from "@/lib/bidding/service" +import { createBidding, type CreateBiddingInput, getActivePaymentTerms, getActiveIncoterms } from "@/lib/bidding/service" import { createBiddingSchema, type CreateBiddingSchema @@ -116,6 +116,8 @@ interface PRItemInfo { quantityUnit: string totalWeight: string weightUnit: string + materialDescription: string + hasSpecDocument: boolean requestedDeliveryDate: string specFiles: File[] isRepresentative: boolean // 대표 아이템 여부 @@ -125,7 +127,12 @@ interface PRItemInfo { const TAB_ORDER = ["basic", "contract", "schedule", "conditions", "details", "manager"] as const type TabType = typeof TAB_ORDER[number] -export function CreateBiddingDialog() { +interface CreateBiddingDialogProps { + paymentTermsOptions?: Array<{code: string, description: string}> + incotermsOptions?: Array<{code: string, description: string}> +} + +export function CreateBiddingDialog({ paymentTermsOptions = [], incotermsOptions = [] }: CreateBiddingDialogProps) { const router = useRouter() const [isSubmitting, setIsSubmitting] = React.useState(false) const { data: session } = useSession() @@ -168,6 +175,7 @@ export function CreateBiddingDialog() { sparePartOptions: "", }) + // 사양설명회 파일 추가 const addMeetingFiles = (files: File[]) => { setSpecMeetingInfo(prev => ({ @@ -311,6 +319,8 @@ export function CreateBiddingDialog() { form.setValue("prNumber", representativePrNumber) }, [hasPrDocuments, representativePrNumber, form]) + + // 세션 정보로 담당자 정보 자동 채우기 React.useEffect(() => { if (session?.user) { @@ -331,8 +341,8 @@ export function CreateBiddingDialog() { } // 담당자 전화번호는 세션에 있다면 설정 (보통 세션에 전화번호는 없지만, 있다면) - if (session.user.phone) { - form.setValue("managerPhone", session.user.phone) + if ('phone' in session.user && session.user.phone) { + form.setValue("managerPhone", session.user.phone as string) } } }, [session, form]) @@ -340,7 +350,7 @@ export function CreateBiddingDialog() { // PR 아이템 추가 const addPRItem = () => { const newItem: PRItemInfo = { - id: `pr-${Date.now()}`, + id: `pr-${Math.random().toString(36).substr(2, 9)}`, prNumber: "", itemCode: "", itemInfo: "", @@ -348,6 +358,8 @@ export function CreateBiddingDialog() { quantityUnit: "EA", totalWeight: "", weightUnit: "KG", + materialDescription: "", + hasSpecDocument: false, requestedDeliveryDate: "", specFiles: [], isRepresentative: prItems.length === 0, // 첫 번째 아이템은 자동으로 대표 아이템 @@ -477,7 +489,7 @@ export function CreateBiddingDialog() { const result = await createBidding(extendedData, userId) if (result.success) { - toast.success(result.message || "입찰이 성공적으로 생성되었습니다.") + toast.success((result as { success: true; message: string }).message || "입찰이 성공적으로 생성되었습니다.") setOpen(false) router.refresh() @@ -624,7 +636,7 @@ export function CreateBiddingDialog() { > {/* 탭 영역 */}
- + setActiveTab(value as TabType)} className="h-full flex flex-col">
@@ -1333,14 +1361,30 @@ export function CreateBiddingDialog() { - setBiddingConditions(prev => ({ + onValueChange={(value) => setBiddingConditions(prev => ({ ...prev, - incoterms: e.target.value + incoterms: value }))} - /> + > + + + + + {incotermsOptions.length > 0 ? ( + incotermsOptions.map((option) => ( + + {option.code} {option.description && `(${option.description})`} + + )) + ) : ( + + 데이터를 불러오는 중... + + )} + +
-- cgit v1.2.3