From a2bc455f654e011c53968b0d3a14389d7259847e Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 3 Sep 2025 10:35:57 +0000 Subject: (최겸) 구매 입찰 개발(벤더 응찰 개발 및 기본계약 요청 개발 필) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/bidding/bidding-conditions-edit.tsx | 304 +++++++++++++++++++++++++ components/bidding/bidding-info-header.tsx | 149 ++++++++++++ components/bidding/price-adjustment-dialog.tsx | 200 ++++++++++++++++ 3 files changed, 653 insertions(+) create mode 100644 components/bidding/bidding-conditions-edit.tsx create mode 100644 components/bidding/bidding-info-header.tsx create mode 100644 components/bidding/price-adjustment-dialog.tsx (limited to 'components') diff --git a/components/bidding/bidding-conditions-edit.tsx b/components/bidding/bidding-conditions-edit.tsx new file mode 100644 index 00000000..a78bb0e0 --- /dev/null +++ b/components/bidding/bidding-conditions-edit.tsx @@ -0,0 +1,304 @@ +"use client" + +import * as React from "react" +import { useRouter } from "next/navigation" +import { useTransition } from "react" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Textarea } from "@/components/ui/textarea" +import { Label } from "@/components/ui/label" +import { Switch } from "@/components/ui/switch" +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Pencil, Save, X } from "lucide-react" +import { getBiddingConditions, updateBiddingConditions } from "@/lib/bidding/service" +import { useToast } from "@/hooks/use-toast" + +interface BiddingConditionsEditProps { + biddingId: number + initialConditions?: any | null +} + +export function BiddingConditionsEdit({ biddingId, initialConditions }: BiddingConditionsEditProps) { + const router = useRouter() + const { toast } = useToast() + const [isPending, startTransition] = useTransition() + const [isEditing, setIsEditing] = React.useState(false) + const [conditions, setConditions] = React.useState({ + paymentTerms: initialConditions?.paymentTerms || "", + taxConditions: initialConditions?.taxConditions || "", + incoterms: initialConditions?.incoterms || "", + contractDeliveryDate: initialConditions?.contractDeliveryDate + ? new Date(initialConditions.contractDeliveryDate).toISOString().split('T')[0] + : "", + shippingPort: initialConditions?.shippingPort || "", + destinationPort: initialConditions?.destinationPort || "", + isPriceAdjustmentApplicable: initialConditions?.isPriceAdjustmentApplicable || false, + sparePartOptions: initialConditions?.sparePartOptions || "", + }) + + const handleSave = () => { + startTransition(async () => { + try { + const result = await updateBiddingConditions(biddingId, conditions) + + if (result.success) { + toast({ + title: "성공", + description: result.message, + }) + setIsEditing(false) + router.refresh() + } else { + toast({ + title: "오류", + description: result.error, + variant: "destructive", + }) + } + } catch (error) { + console.error('Error updating bidding conditions:', error) + toast({ + title: "오류", + description: "입찰 조건 업데이트 중 오류가 발생했습니다.", + variant: "destructive", + }) + } + }) + } + + const handleCancel = () => { + setConditions({ + paymentTerms: initialConditions?.paymentTerms || "", + taxConditions: initialConditions?.taxConditions || "", + incoterms: initialConditions?.incoterms || "", + contractDeliveryDate: initialConditions?.contractDeliveryDate + ? new Date(initialConditions.contractDeliveryDate).toISOString().split('T')[0] + : "", + shippingPort: initialConditions?.shippingPort || "", + destinationPort: initialConditions?.destinationPort || "", + isPriceAdjustmentApplicable: initialConditions?.isPriceAdjustmentApplicable || false, + sparePartOptions: initialConditions?.sparePartOptions || "", + }) + setIsEditing(false) + } + + if (!isEditing) { + return ( + + + 입찰 조건 + + + +
+
+ +

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

+
+
+ +

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

+
+
+ +

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

+
+
+ +

+ {conditions.contractDeliveryDate + ? new Date(conditions.contractDeliveryDate).toLocaleDateString('ko-KR') + : "미설정" + } +

+
+
+ +

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

+
+
+ +

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

+
+
+ +

{conditions.isPriceAdjustmentApplicable ? "적용 가능" : "적용 불가"}

+
+ {conditions.sparePartOptions && ( +
+ +

{conditions.sparePartOptions}

+
+ )} +
+
+
+ ) + } + + return ( + + + 입찰 조건 수정 +
+ + +
+
+ +
+
+ + setConditions(prev => ({ + ...prev, + paymentTerms: e.target.value + }))} + /> +
+ +
+ + setConditions(prev => ({ + ...prev, + taxConditions: e.target.value + }))} + /> +
+ +
+ + +
+ +
+ + setConditions(prev => ({ + ...prev, + contractDeliveryDate: e.target.value + }))} + /> +
+ +
+ + setConditions(prev => ({ + ...prev, + shippingPort: e.target.value + }))} + /> +
+ +
+ + setConditions(prev => ({ + ...prev, + destinationPort: e.target.value + }))} + /> +
+
+ +
+ setConditions(prev => ({ + ...prev, + isPriceAdjustmentApplicable: checked + }))} + /> + +
+ +
+ +