From ba35e67845f935c8ce0151c9ef1fefa0b0510faf Mon Sep 17 00:00:00 2001
From: joonhoekim <26rote@gmail.com>
Date: Mon, 22 Sep 2025 18:59:13 +0900
Subject: (김준회) AVL 피드백 반영 (이진용 프로 건)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 lib/avl/table/project-avl-table.tsx | 65 +++++++++++++++++++++++++++++--------
 1 file changed, 51 insertions(+), 14 deletions(-)

(limited to 'lib/avl/table/project-avl-table.tsx')

diff --git a/lib/avl/table/project-avl-table.tsx b/lib/avl/table/project-avl-table.tsx
index fc8f0f5e..7a0fda2e 100644
--- a/lib/avl/table/project-avl-table.tsx
+++ b/lib/avl/table/project-avl-table.tsx
@@ -4,6 +4,14 @@ import * as React from "react"
 import { forwardRef, useImperativeHandle, useLayoutEffect, useMemo } from "react"
 import { DataTable } from "@/components/data-table/data-table"
 import { Button } from "@/components/ui/button"
+import {
+  Dialog,
+  DialogContent,
+  DialogDescription,
+  DialogFooter,
+  DialogHeader,
+  DialogTitle,
+} from "@/components/ui/dialog"
 import { AvlVendorAddAndModifyDialog } from "./avl-vendor-add-and-modify-dialog"
 import { getProjectAvlVendorInfo, createAvlVendorInfo, updateAvlVendorInfo, deleteAvlVendorInfo, finalizeProjectAvl } from "../service"
 import { useReactTable, getCoreRowModel, getPaginationRowModel, getSortedRowModel, getFilteredRowModel } from "@tanstack/react-table"
@@ -384,6 +392,9 @@ export const ProjectAvlTable = forwardRef<ProjectAvlTableRef, ProjectAvlTablePro
     }
   }, [table, loadData])
 
+  // 최종 확정 다이얼로그 상태
+  const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false)
+
   // 최종 확정 핸들러
   const handleFinalizeAvl = React.useCallback(async () => {
     // 1. 필수 조건 검증
@@ -402,27 +413,20 @@ export const ProjectAvlTable = forwardRef<ProjectAvlTableRef, ProjectAvlTablePro
       return
     }
 
-    // 2. 사용자 확인
-    const confirmed = window.confirm(
-      `현재 프로젝트(${localProjectCode})의 AVL을 최종 확정하시겠습니까?\n\n` +
-      `- 프로젝트명: ${projectInfo.projectName}\n` +
-      `- 벤더 정보: ${data.length}개\n` +
-      `- 공사부문: ${projectInfo.constructionSector}\n` +
-      `- 선종: ${projectInfo.shipType}\n` +
-      `- H/T 구분: ${projectInfo.htDivision}\n\n` +
-      `확정 후에는 수정이 어려울 수 있습니다.`
-    )
-
-    if (!confirmed) return
+    // 2. 확인 다이얼로그 열기
+    setIsConfirmDialogOpen(true)
+  }, [localProjectCode, projectInfo, data.length])
 
+  // 실제 최종 확정 실행 함수
+  const executeFinalizeAvl = React.useCallback(async () => {
     try {
-      // 3. 현재 데이터의 모든 ID 수집
+      // 3. 현재 데이터의 모든 ID 수집 (전체 레코드 기준)
       const avlVendorInfoIds = data.map(item => item.id)
 
       // 4. 최종 확정 실행
       const result = await finalizeProjectAvl(
         localProjectCode,
-        projectInfo,
+        projectInfo!,
         avlVendorInfoIds,
         sessionData?.user?.name || ""
       )
@@ -441,6 +445,8 @@ export const ProjectAvlTable = forwardRef<ProjectAvlTableRef, ProjectAvlTablePro
     } catch (error) {
       console.error("AVL 최종 확정 실패:", error)
       toast.error("AVL 최종 확정 중 오류가 발생했습니다.")
+    } finally {
+      setIsConfirmDialogOpen(false)
     }
   }, [localProjectCode, projectInfo, data, table, loadData, sessionData?.user?.name])
 
@@ -595,6 +601,37 @@ export const ProjectAvlTable = forwardRef<ProjectAvlTableRef, ProjectAvlTablePro
         isTemplate={false} // 프로젝트 AVL 모드
         initialProjectCode={localProjectCode}
       />
+
+      {/* 최종 확정 확인 다이얼로그 */}
+      <Dialog open={isConfirmDialogOpen} onOpenChange={setIsConfirmDialogOpen}>
+        <DialogContent>
+          <DialogHeader>
+            <DialogTitle>프로젝트 AVL 최종 확정</DialogTitle>
+            <DialogDescription>
+              현재 프로젝트의 AVL을 최종 확정하시겠습니까?
+            </DialogDescription>
+          </DialogHeader>
+          <div className="space-y-2 text-sm">
+            <div>• 프로젝트 코드: {localProjectCode}</div>
+            <div>• 프로젝트명: {projectInfo?.projectName || ""}</div>
+            <div>• 공사부문: {projectInfo?.constructionSector || ""}</div>
+            <div>• 선종: {projectInfo?.shipType || ""}</div>
+            <div>• H/T 구분: {projectInfo?.htDivision || ""}</div>
+            <div>• 벤더 정보: {data.length}개 (전체 레코드)</div>
+            {/* <div className="text-amber-600 font-medium mt-4">
+              ⚠️ 확정 후 내용 수정을 필요로 하는 경우 동일 건을 다시 최종확정해 revision 처리로 수정해야 합니다.
+            </div> */}
+          </div>
+          <DialogFooter>
+            <Button variant="outline" onClick={() => setIsConfirmDialogOpen(false)}>
+              취소
+            </Button>
+            <Button onClick={executeFinalizeAvl}>
+              최종 확정
+            </Button>
+          </DialogFooter>
+        </DialogContent>
+      </Dialog>
     </div>
   )
 })
-- 
cgit v1.2.3

