summaryrefslogtreecommitdiff
path: root/components/bidding
diff options
context:
space:
mode:
Diffstat (limited to 'components/bidding')
-rw-r--r--components/bidding/bidding-conditions-edit.tsx164
1 files changed, 140 insertions, 24 deletions
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<Array<{code: string, description: string}>>([])
+ const [incotermsOptions, setIncotermsOptions] = React.useState<Array<{code: string, description: string}>>([])
+ const [shippingPlaces, setShippingPlaces] = React.useState<Array<{code: string, description: string}>>([])
+ const [destinationPlaces, setDestinationPlaces] = React.useState<Array<{code: string, description: string}>>([])
+ 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
<p className="font-medium">{conditions.shippingPort || "미설정"}</p>
</div>
<div>
- <Label className="text-muted-foreground">도착지</Label>
+ <Label className="text-muted-foreground">하역지</Label>
<p className="font-medium">{conditions.destinationPort || "미설정"}</p>
</div>
<div>
@@ -212,8 +298,8 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer
</SelectItem>
))
) : (
- <SelectItem value="no-data" disabled>
- 데이터 없음
+ <SelectItem value="loading" disabled>
+ 데이터를 불러오는 중...
</SelectItem>
)}
</SelectContent>
@@ -253,8 +339,8 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer
</SelectItem>
))
) : (
- <SelectItem value="no-data" disabled>
- 데이터 없음
+ <SelectItem value="loading" disabled>
+ 데이터를 불러오는 중...
</SelectItem>
)}
</SelectContent>
@@ -276,28 +362,58 @@ export function BiddingConditionsEdit({ biddingId, initialConditions, paymentTer
<div className="space-y-2">
<Label htmlFor="shippingPort">선적지</Label>
- <Input
- id="shippingPort"
- placeholder="예: 부산항, 인천항"
+ <Select
value={conditions.shippingPort}
- onChange={(e) => setConditions(prev => ({
+ onValueChange={(value) => setConditions(prev => ({
...prev,
- shippingPort: e.target.value
+ shippingPort: value
}))}
- />
+ >
+ <SelectTrigger>
+ <SelectValue placeholder="선적지 선택" />
+ </SelectTrigger>
+ <SelectContent>
+ {shippingPlaces.length > 0 ? (
+ shippingPlaces.map((place) => (
+ <SelectItem key={place.code} value={place.code}>
+ {place.code} {place.description && `(${place.description})`}
+ </SelectItem>
+ ))
+ ) : (
+ <SelectItem value="loading" disabled>
+ 데이터를 불러오는 중...
+ </SelectItem>
+ )}
+ </SelectContent>
+ </Select>
</div>
<div className="space-y-2">
- <Label htmlFor="destinationPort">도착지</Label>
- <Input
- id="destinationPort"
- placeholder="예: 현장 직납, 창고 납품"
+ <Label htmlFor="destinationPort">하역지</Label>
+ <Select
value={conditions.destinationPort}
- onChange={(e) => setConditions(prev => ({
+ onValueChange={(value) => setConditions(prev => ({
...prev,
- destinationPort: e.target.value
+ destinationPort: value
}))}
- />
+ >
+ <SelectTrigger>
+ <SelectValue placeholder="하역지 선택" />
+ </SelectTrigger>
+ <SelectContent>
+ {destinationPlaces.length > 0 ? (
+ destinationPlaces.map((place) => (
+ <SelectItem key={place.code} value={place.code}>
+ {place.code} {place.description && `(${place.description})`}
+ </SelectItem>
+ ))
+ ) : (
+ <SelectItem value="loading" disabled>
+ 데이터를 불러오는 중...
+ </SelectItem>
+ )}
+ </SelectContent>
+ </Select>
</div>
</div>