From 10cb50753ccf318024c4394282f9e8d968dcd1a5 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 17 Sep 2025 10:40:12 +0000 Subject: (최겸) 구매 입찰 오류 수정 및 선적지,하역지 연동,TO Cont, TO PO 개발 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/bidding/bidding-conditions-edit.tsx | 164 +++++++++++++++++++++---- 1 file changed, 140 insertions(+), 24 deletions(-) (limited to 'components') diff --git a/components/bidding/bidding-conditions-edit.tsx b/components/bidding/bidding-conditions-edit.tsx index 6541bdff..51b1a688 100644 --- a/components/bidding/bidding-conditions-edit.tsx +++ b/components/bidding/bidding-conditions-edit.tsx @@ -17,21 +17,28 @@ import { } from "@/components/ui/select" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Pencil, Save, X } from "lucide-react" -import { getBiddingConditions, updateBiddingConditions, getActivePaymentTerms, getActiveIncoterms } from "@/lib/bidding/service" +import { getBiddingConditions, updateBiddingConditions } from "@/lib/bidding/service" +import { getIncotermsForSelection, getPaymentTermsForSelection, getPlaceOfShippingForSelection, getPlaceOfDestinationForSelection } from "@/lib/procurement-select/service" import { useToast } from "@/hooks/use-toast" interface BiddingConditionsEditProps { biddingId: number initialConditions?: any | null - paymentTermsOptions: Array<{code: string, description: string}> - incotermsOptions: Array<{code: string, description: string}> } -export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTermsOptions, incotermsOptions }: BiddingConditionsEditProps) { +export function BiddingConditionsEdit({ biddingId, initialConditions }: BiddingConditionsEditProps) { const router = useRouter() const { toast } = useToast() const [isPending, startTransition] = useTransition() const [isEditing, setIsEditing] = React.useState(false) + + // Procurement 데이터 상태들 + const [paymentTermsOptions, setPaymentTermsOptions] = React.useState>([]) + const [incotermsOptions, setIncotermsOptions] = React.useState>([]) + const [shippingPlaces, setShippingPlaces] = React.useState>([]) + const [destinationPlaces, setDestinationPlaces] = React.useState>([]) + const [procurementLoading, setProcurementLoading] = React.useState(false) + const [conditions, setConditions] = React.useState({ paymentTerms: initialConditions?.paymentTerms || "", taxConditions: initialConditions?.taxConditions || "", @@ -77,13 +84,92 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer }) } + // Procurement 데이터 로드 함수들 + const loadPaymentTerms = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getPaymentTermsForSelection(); + setPaymentTermsOptions(data); + } catch (error) { + console.error("Failed to load payment terms:", error); + toast({ + title: "오류", + description: "결제조건 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + const loadIncoterms = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getIncotermsForSelection(); + setIncotermsOptions(data); + } catch (error) { + console.error("Failed to load incoterms:", error); + toast({ + title: "오류", + description: "운송조건 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + const loadShippingPlaces = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getPlaceOfShippingForSelection(); + setShippingPlaces(data); + } catch (error) { + console.error("Failed to load shipping places:", error); + toast({ + title: "오류", + description: "선적지 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + const loadDestinationPlaces = React.useCallback(async () => { + setProcurementLoading(true); + try { + const data = await getPlaceOfDestinationForSelection(); + setDestinationPlaces(data); + } catch (error) { + console.error("Failed to load destination places:", error); + toast({ + title: "오류", + description: "하역지 목록을 불러오는데 실패했습니다.", + variant: "destructive", + }) + } finally { + setProcurementLoading(false); + } + }, [toast]); + + // 편집 모드로 전환할 때 procurement 데이터 로드 + React.useEffect(() => { + if (isEditing) { + loadPaymentTerms(); + loadIncoterms(); + loadShippingPlaces(); + loadDestinationPlaces(); + } + }, [isEditing, loadPaymentTerms, loadIncoterms, loadShippingPlaces, loadDestinationPlaces]); + const handleCancel = () => { setConditions({ paymentTerms: initialConditions?.paymentTerms || "", taxConditions: initialConditions?.taxConditions || "", incoterms: initialConditions?.incoterms || "", - contractDeliveryDate: initialConditions?.contractDeliveryDate - ? new Date(initialConditions.contractDeliveryDate).toISOString().split('T')[0] + contractDeliveryDate: initialConditions?.contractDeliveryDate + ? new Date(initialConditions.contractDeliveryDate).toISOString().split('T')[0] : "", shippingPort: initialConditions?.shippingPort || "", destinationPort: initialConditions?.destinationPort || "", @@ -146,7 +232,7 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer

{conditions.shippingPort || "미설정"}

- +

{conditions.destinationPort || "미설정"}

@@ -212,8 +298,8 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer )) ) : ( - - 데이터 없음 + + 데이터를 불러오는 중... )} @@ -253,8 +339,8 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer )) ) : ( - - 데이터 없음 + + 데이터를 불러오는 중... )} @@ -276,28 +362,58 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer
- setConditions(prev => ({ + onValueChange={(value) => setConditions(prev => ({ ...prev, - shippingPort: e.target.value + shippingPort: value }))} - /> + > + + + + + {shippingPlaces.length > 0 ? ( + shippingPlaces.map((place) => ( + + {place.code} {place.description && `(${place.description})`} + + )) + ) : ( + + 데이터를 불러오는 중... + + )} + +
- - 하역지 +
-- cgit v1.2.3