From 18954df6565108a469fb1608ea3715dd9bb1b02d Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Mon, 1 Sep 2025 09:12:09 +0000
Subject: (대표님) 구매 기본계약, gtc 개발
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../update-vendor-document-status-button.tsx       | 145 +++++++++++++++++++++
 1 file changed, 145 insertions(+)
 create mode 100644 lib/basic-contract/vendor-table/update-vendor-document-status-button.tsx

(limited to 'lib/basic-contract/vendor-table/update-vendor-document-status-button.tsx')

diff --git a/lib/basic-contract/vendor-table/update-vendor-document-status-button.tsx b/lib/basic-contract/vendor-table/update-vendor-document-status-button.tsx
new file mode 100644
index 00000000..e6e22fda
--- /dev/null
+++ b/lib/basic-contract/vendor-table/update-vendor-document-status-button.tsx
@@ -0,0 +1,145 @@
+"use client"
+
+import { useState } from "react"
+import { Button } from "@/components/ui/button"
+import { toast } from "sonner"
+import { useRouter } from "next/navigation"
+import { CheckCircle, FileText, Loader, AlertTriangle } from "lucide-react"
+import { updateVendorDocumentStatus } from "../service"
+import {
+  AlertDialog,
+  AlertDialogAction,
+  AlertDialogCancel,
+  AlertDialogContent,
+  AlertDialogDescription,
+  AlertDialogFooter,
+  AlertDialogHeader,
+  AlertDialogTitle,
+  AlertDialogTrigger,
+} from "@/components/ui/alert-dialog"
+
+interface UpdateVendorDocumentStatusButtonProps {
+  vendorDocumentId: number
+  documentId: number
+  vendorId: number
+  currentStatus: "draft" | "approved" | "reviewing" // reviewing 상태 추가
+}
+
+export function UpdateVendorDocumentStatusButton({
+  vendorDocumentId,
+  documentId,
+  vendorId,
+  currentStatus
+}: UpdateVendorDocumentStatusButtonProps) {
+
+  console.log(currentStatus)
+
+  const [isLoading, setIsLoading] = useState(false)
+  const [isOpen, setIsOpen] = useState(false)
+  const router = useRouter()
+
+  // 토글할 새로운 상태 결정
+  const newStatus = currentStatus === "approved" ? "draft" : "approved"
+  
+  // 상태에 따른 버튼 텍스트
+  const buttonText = currentStatus === "approved" 
+    ? "협의 취소" 
+    : "협의 완료 처리"
+  
+  // 상태에 따른 다이얼로그 제목
+  const dialogTitle = newStatus === "approved"
+    ? "협의를 완료 처리하시겠습니까?"
+    : "협의 완료를 취소하시겠습니까?"
+  
+  // 상태에 따른 다이얼로그 설명
+  const dialogDescription = newStatus === "approved"
+    ? "협의가 완료 처리되면 협력업체가 계약서에 서명할 수 있게 됩니다. 모든 조항 검토가 완료되었는지 확인해주세요."
+    : "협의 완료를 취소하면 협력업체가 계약서에 서명할 수 없게 됩니다. 추가 수정이 필요한 경우에만 취소해주세요."
+  
+  // 상태에 따른 토스트 메시지
+  const successMessage = newStatus === "approved"
+    ? "협의가 완료 처리되었습니다. 협력업체가 서명할 수 있습니다."
+    : "협의 완료가 취소되었습니다. 협력업체가 서명할 수 없습니다."
+
+  const handleUpdateStatus = async () => {
+    try {
+      setIsLoading(true)
+      setIsOpen(false)
+      
+      // 서버 액션 호출 - 새로운 상태로 업데이트
+      const result = await updateVendorDocumentStatus({
+        status: newStatus,
+        vendorDocumentId,
+        documentId,
+        vendorId
+      })
+
+      if (!result.success) {
+        throw new Error(result.error || "상태 업데이트 실패")
+      }
+
+      toast.success(successMessage)
+      router.refresh() // 페이지 새로고침
+    } catch (error) {
+      toast.error(error instanceof Error ? error.message : "상태 업데이트 중 오류가 발생했습니다")
+      console.error(error)
+    } finally {
+      setIsLoading(false)
+    }
+  }
+
+  return (
+    <AlertDialog open={isOpen} onOpenChange={setIsOpen}>
+      <AlertDialogTrigger asChild>
+        <Button
+          variant={currentStatus === "approved" ? "secondary" : "outline"}
+          size="sm"
+          disabled={isLoading}
+          className={currentStatus === "approved" ? "bg-green-50 hover:bg-green-100 text-green-700" : ""}
+        >
+          {isLoading ? (
+            <Loader className="h-4 w-4 mr-2 animate-spin" />
+          ) : currentStatus === "approved" ? (
+            <FileText className="h-4 w-4 mr-2" />
+          ) : (
+            <CheckCircle className="h-4 w-4 mr-2" />
+          )}
+          {buttonText}
+        </Button>
+      </AlertDialogTrigger>
+      
+      <AlertDialogContent>
+        <AlertDialogHeader>
+          <AlertDialogTitle className="flex items-center gap-2">
+            <AlertTriangle className="h-5 w-5 text-amber-500" />
+            {dialogTitle}
+          </AlertDialogTitle>
+          <AlertDialogDescription className="space-y-2">
+            <p>{dialogDescription}</p>
+            {newStatus === "approved" && (
+              <div className="bg-blue-50 border border-blue-200 rounded-md p-3 mt-3">
+                <p className="text-sm text-blue-800">
+                  <strong>확인사항:</strong>
+                </p>
+                <ul className="text-sm text-blue-700 mt-1 ml-4 list-disc">
+                  <li>모든 필수 조항이 검토되었습니까?</li>
+                  <li>협력업체와의 협의 내용이 모두 반영되었습니까?</li>
+                  <li>법무팀 검토가 완료되었습니까?</li>
+                </ul>
+              </div>
+            )}
+          </AlertDialogDescription>
+        </AlertDialogHeader>
+        <AlertDialogFooter>
+          <AlertDialogCancel>취소</AlertDialogCancel>
+          <AlertDialogAction
+            onClick={handleUpdateStatus}
+            className={newStatus === "approved" ? "bg-green-600 hover:bg-green-700" : "bg-amber-600 hover:bg-amber-700"}
+          >
+            {newStatus === "approved" ? "완료 처리" : "완료 취소"}
+          </AlertDialogAction>
+        </AlertDialogFooter>
+      </AlertDialogContent>
+    </AlertDialog>
+  )
+}
\ No newline at end of file
-- 
cgit v1.2.3

