From 0e1a15c1be7bd9620fc61767b63b5b6f87563b4f Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Thu, 4 Dec 2025 09:08:44 +0000
Subject: (임수민) 준법문의,법무검토 관련 요청사항 작업
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...basic-contract-detail-table-toolbar-actions.tsx | 209 +++++++++++++++++----
 1 file changed, 170 insertions(+), 39 deletions(-)

(limited to 'lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx')

diff --git a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
index 575582cf..3e7caee1 100644
--- a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
+++ b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
@@ -18,9 +18,10 @@ import {
     DialogTitle,
 } from "@/components/ui/dialog"
 import { Badge } from "@/components/ui/badge"
-import { prepareFinalApprovalAction, quickFinalApprovalAction, resendContractsAction, updateLegalReviewStatusFromSSLVW } from "../service"
+import { prepareFinalApprovalAction, quickFinalApprovalAction, resendContractsAction, updateLegalReviewStatusFromSSLVW, updateComplianceReviewStatusFromCPVW, requestComplianceInquiryAction } from "../service"
 import { BasicContractSignDialog } from "../vendor-table/basic-contract-sign-dialog"
 import { SSLVWPurInqReqDialog } from "@/components/common/legal/sslvw-pur-inq-req-dialog"
+import { CPVWWabQustListViewDialog } from "@/components/common/legal/cpvw-wab-qust-list-view-dialog"
 import { prepareRedFlagResolutionApproval, requestRedFlagResolution } from "@/lib/compliance/red-flag-resolution"
 import { useRouter } from "next/navigation"
 import { useSession } from "next-auth/react"
@@ -81,24 +82,26 @@ export function BasicContractDetailTableToolbarActions({
         if (contract.completedAt !== null || !contract.signedFilePath) {
             return false;
         }
-        if (contract.legalReviewRequestedAt && !contract.legalReviewCompletedAt) {
-            return false;
-        }
+        // ⚠️ 법무/준법문의 완료 여부는 SSLVW/CPVW 상태 및 완료 시간에 의존하므로,
+        //    여기서는 legalReviewCompletedAt / complianceReviewCompletedAt 기반으로
+        //    최종 승인 버튼을 막지 않습니다. (상태/시간은 UI 참고용으로만 사용)
         return true;
     });
 
-    // 법무검토 요청 가능 여부
-    // 1. 협의 완료됨 (negotiationCompletedAt 있음) OR
-    // 2. 협의 없음 (코멘트 없음, hasComments: false)
+    // 법무검토 요청 가능 여부 (준법서약 템플릿이 아닐 때만)
+    // 1. 협력업체 서명 완료 (vendorSignedAt 있음)
+    // 2. 협의 완료됨 (negotiationCompletedAt 있음) OR
+    // 3. 협의 없음 (코멘트 없음, hasComments: false)
     // 협의 중 (negotiationCompletedAt 없고 코멘트 있음)은 불가
-    const canRequestLegalReview = hasSelectedRows && selectedRows.some(row => {
+    const canRequestLegalReview = !isComplianceTemplate && hasSelectedRows && selectedRows.some(row => {
         const contract = row.original;
-        // 이미 법무검토 요청된 계약서는 제외
-        if (contract.legalReviewRequestedAt) {
-            return false;
-        }
-        // 이미 최종승인 완료된 계약서는 제외
-        if (contract.completedAt) {
+        
+        // 필수 조건 확인: 최종승인 미완료, 법무검토 미요청, 협력업체 서명 완료
+        if (
+            contract.legalReviewRequestedAt ||
+            contract.completedAt ||
+            !contract.vendorSignedAt
+        ) {
             return false;
         }
         
@@ -123,6 +126,35 @@ export function BasicContractDetailTableToolbarActions({
         return false;
     });
 
+    // 준법문의 버튼 활성화 가능 여부
+    // 1. 협력업체 서명 완료 (vendorSignedAt 있음)
+    // 2. 협의 완료 (negotiationCompletedAt 있음)
+    // 3. 레드플래그 해소됨 (redFlagResolutionData에서 resolved 상태)
+    // 4. 이미 준법문의 요청되지 않음 (complianceReviewRequestedAt 없음)
+    const canRequestComplianceInquiry = hasSelectedRows && selectedRows.some(row => {
+        const contract = row.original;
+        
+        // 필수 조건 확인: 준법서약 템플릿, 최종승인 미완료, 협력업체 서명 완료, 협의 완료, 준법문의 미요청
+        if (
+            !isComplianceTemplate ||
+            contract.completedAt ||
+            !contract.vendorSignedAt ||
+            !contract.negotiationCompletedAt ||
+            contract.complianceReviewRequestedAt
+        ) {
+            return false;
+        }
+        
+        // 레드플래그 해소 확인
+        const resolution = redFlagResolutionData[contract.id];
+        // 레드플래그가 있는 경우, 해소되어야 함
+        if (redFlagData[contract.id] === true && !resolution?.resolved) {
+            return false;
+        }
+        
+        return true;
+    });
+
     // 필터링된 계약서들 계산
     const resendContracts = selectedRows.map(row => row.original)
 
@@ -394,6 +426,47 @@ export function BasicContractDetailTableToolbarActions({
         }
     }
 
+    // CPVW 데이터 선택 확인 핸들러
+    const handleCPVWConfirm = async (selectedCPVWData: any[]) => {
+        if (!selectedCPVWData || selectedCPVWData.length === 0) {
+            toast.error("선택된 데이터가 없습니다.")
+            return
+        }
+
+        if (selectedRows.length !== 1) {
+            toast.error("계약서 한 건을 선택해주세요.")
+            return
+        }
+
+        try {
+            setLoading(true)
+
+            // 선택된 계약서 ID들 추출
+            const selectedContractIds = selectedRows.map(row => row.original.id)
+
+            // 서버 액션 호출
+            const result = await updateComplianceReviewStatusFromCPVW(selectedCPVWData, selectedContractIds)
+
+            if (result.success) {
+                toast.success(result.message)
+                router.refresh()
+                table.toggleAllPageRowsSelected(false)
+            } else {
+                toast.error(result.message)
+            }
+
+            if (result.errors && result.errors.length > 0) {
+                toast.warning(`일부 처리 실패: ${result.errors.join(', ')}`)
+            }
+
+        } catch (error) {
+            console.error('CPVW 확인 처리 실패:', error)
+            toast.error('준법문의 상태 업데이트 중 오류가 발생했습니다.')
+        } finally {
+            setLoading(false)
+        }
+    }
+
     // 빠른 승인 (서명 없이)
     const confirmQuickApproval = async () => {
         setLoading(true)
@@ -541,9 +614,26 @@ export function BasicContractDetailTableToolbarActions({
     const complianceInquiryUrl = 'http://60.101.207.55/Inquiry/Write/InquiryWrite.aspx'
 
     // 법무검토 요청 / 준법문의
-    const handleRequestLegalReview = () => {
+    const handleRequestLegalReview = async () => {
         if (isComplianceTemplate) {
-            window.open(complianceInquiryUrl, '_blank', 'noopener,noreferrer')
+            // 준법문의: 요청일 기록 후 외부 URL 열기
+            const selectedContractIds = selectedRows.map(row => row.original.id)
+            try {
+                setLoading(true)
+                const result = await requestComplianceInquiryAction(selectedContractIds)
+                if (result.success) {
+                    toast.success(result.message)
+                    router.refresh()
+                    window.open(complianceInquiryUrl, '_blank', 'noopener,noreferrer')
+                } else {
+                    toast.error(result.message)
+                }
+            } catch (error) {
+                console.error('준법문의 요청 처리 실패:', error)
+                toast.error('준법문의 요청 중 오류가 발생했습니다.')
+            } finally {
+                setLoading(false)
+            }
             return
         }
         setLegalReviewDialog(true)
@@ -617,31 +707,72 @@ export function BasicContractDetailTableToolbarActions({
                     </span>
                 </Button>
 
-                {/* 법무검토 버튼 (SSLVW 데이터 조회) */}
-                <SSLVWPurInqReqDialog
-                    onConfirm={handleSSLVWConfirm}
-                    requireSingleSelection
-                    triggerDisabled={selectedRows.length !== 1 || loading}
-                    triggerTitle={
-                        selectedRows.length !== 1
-                            ? "계약서 한 건을 선택해주세요"
-                            : undefined
-                    }
-                />
+                {/* 법무검토 버튼 (SSLVW 데이터 조회) - 준법서약 템플릿이 아닐 때만 표시 */}
+                {!isComplianceTemplate && (
+                    <SSLVWPurInqReqDialog
+                        onConfirm={handleSSLVWConfirm}
+                        requireSingleSelection
+                        triggerDisabled={selectedRows.length !== 1 || loading}
+                        triggerTitle={
+                            selectedRows.length !== 1
+                                ? "계약서 한 건을 선택해주세요"
+                                : undefined
+                        }
+                    />
+                )}
+
+                {/* 준법문의 요청 데이터 조회 버튼 (준법서약 템플릿만) */}
+                {isComplianceTemplate && (
+                    <CPVWWabQustListViewDialog
+                        onConfirm={handleCPVWConfirm}
+                        requireSingleSelection
+                        triggerDisabled={selectedRows.length !== 1 || loading}
+                        triggerTitle={
+                            selectedRows.length !== 1
+                                ? "계약서 한 건을 선택해주세요"
+                                : undefined
+                        }
+                    />
+                )}
 
                 {/* 법무검토 요청 / 준법문의 버튼 */}
-                <Button
-                    variant="outline"
-                    size="sm"
-                    onClick={handleRequestLegalReview}
-                    className="gap-2"
-                    title={isComplianceTemplate ? "준법문의 링크로 이동" : "법무검토 요청 링크 선택"}
-                >
-                    <FileText className="size-4" aria-hidden="true" />
-                    <span className="hidden sm:inline">
-                        {isComplianceTemplate ? "준법문의" : "법무검토 요청"}
-                    </span>
-                </Button>
+                {isComplianceTemplate ? (
+                    <Button
+                        variant="outline"
+                        size="sm"
+                        onClick={handleRequestLegalReview}
+                        className="gap-2"
+                        disabled={!canRequestComplianceInquiry || loading}
+                        title={
+                            !canRequestComplianceInquiry
+                                ? "협력업체 서명 완료, 협의 완료, 레드플래그 해소가 필요합니다"
+                                : "준법문의 링크로 이동"
+                        }
+                    >
+                        <FileText className="size-4" aria-hidden="true" />
+                        <span className="hidden sm:inline">
+                            준법문의
+                        </span>
+                    </Button>
+                ) : (
+                    <Button
+                        variant="outline"
+                        size="sm"
+                        onClick={handleRequestLegalReview}
+                        className="gap-2"
+                        disabled={!canRequestLegalReview || loading}
+                        title={
+                            !canRequestLegalReview
+                                ? "협력업체 서명 완료 및 협의 완료가 필요합니다"
+                                : "법무검토 요청 링크 선택"
+                        }
+                    >
+                        <FileText className="size-4" aria-hidden="true" />
+                        <span className="hidden sm:inline">
+                            법무검토 요청
+                        </span>
+                    </Button>
+                )}                
 
                 {/* 최종승인 버튼 */}
                 <Button
-- 
cgit v1.2.3


From ae211e5b9d9bf8e1566b78a85ec4522360833ea9 Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Thu, 4 Dec 2025 11:42:01 +0000
Subject: (임수민) 준법문의 버튼 수정
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../basic-contract-detail-table-toolbar-actions.tsx | 21 ++++++++++++++++++---
 .../status-detail/basic-contracts-detail-table.tsx  |  1 +
 2 files changed, 19 insertions(+), 3 deletions(-)

(limited to 'lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx')

diff --git a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
index 3e7caee1..8f945bbd 100644
--- a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
+++ b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
@@ -36,6 +36,7 @@ interface RedFlagResolutionState {
 interface BasicContractDetailTableToolbarActionsProps {
     table: Table<BasicContractView>
     gtcData?: Record<number, { gtcDocumentId: number | null; hasComments: boolean }>
+    agreementCommentData?: Record<number, { hasComments: boolean; commentCount: number }>
     redFlagData?: Record<number, boolean>
     redFlagResolutionData?: Record<number, RedFlagResolutionState>
     isComplianceTemplate?: boolean
@@ -44,6 +45,7 @@ interface BasicContractDetailTableToolbarActionsProps {
 export function BasicContractDetailTableToolbarActions({ 
     table, 
     gtcData = {},
+    agreementCommentData = {},
     redFlagData = {},
     redFlagResolutionData = {},
     isComplianceTemplate = false
@@ -128,23 +130,36 @@ export function BasicContractDetailTableToolbarActions({
 
     // 준법문의 버튼 활성화 가능 여부
     // 1. 협력업체 서명 완료 (vendorSignedAt 있음)
-    // 2. 협의 완료 (negotiationCompletedAt 있음)
+    // 2. 협의 완료됨 (negotiationCompletedAt 있음) OR 협의 없음 (코멘트 없음)
     // 3. 레드플래그 해소됨 (redFlagResolutionData에서 resolved 상태)
     // 4. 이미 준법문의 요청되지 않음 (complianceReviewRequestedAt 없음)
     const canRequestComplianceInquiry = hasSelectedRows && selectedRows.some(row => {
         const contract = row.original;
         
-        // 필수 조건 확인: 준법서약 템플릿, 최종승인 미완료, 협력업체 서명 완료, 협의 완료, 준법문의 미요청
+        // 필수 조건 확인: 준법서약 템플릿, 최종승인 미완료, 협력업체 서명 완료, 준법문의 미요청
         if (
             !isComplianceTemplate ||
             contract.completedAt ||
             !contract.vendorSignedAt ||
-            !contract.negotiationCompletedAt ||
             contract.complianceReviewRequestedAt
         ) {
             return false;
         }
         
+        // 협의 완료 확인
+        // 협의 완료된 경우 → 가능
+        if (contract.negotiationCompletedAt) {
+            // 협의 완료됨, 레드플래그만 확인하면 됨
+        } else {
+            // 협의 완료되지 않은 경우: 코멘트가 없으면 협의 없음으로 간주하여 가능
+            const commentData = agreementCommentData[contract.id];
+            if (commentData && commentData.hasComments) {
+                // 코멘트가 있으면 협의 중이므로 불가
+                return false;
+            }
+            // 코멘트가 없으면 협의 없음으로 간주하여 가능
+        }
+        
         // 레드플래그 해소 확인
         const resolution = redFlagResolutionData[contract.id];
         // 레드플래그가 있는 경우, 해소되어야 함
diff --git a/lib/basic-contract/status-detail/basic-contracts-detail-table.tsx b/lib/basic-contract/status-detail/basic-contracts-detail-table.tsx
index cface6b3..c6fe1cdd 100644
--- a/lib/basic-contract/status-detail/basic-contracts-detail-table.tsx
+++ b/lib/basic-contract/status-detail/basic-contracts-detail-table.tsx
@@ -241,6 +241,7 @@ type RedFlagResolutionState = {
                 <BasicContractDetailTableToolbarActions 
                     table={table} 
                     gtcData={gtcData}
+                    agreementCommentData={agreementCommentData}
                     redFlagData={redFlagData}
                     redFlagResolutionData={redFlagResolutionData}
                     isComplianceTemplate={isComplianceTemplate}
-- 
cgit v1.2.3


From 93ac03bdba683b41391a10a0daefd0b8ba711307 Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Thu, 4 Dec 2025 12:57:05 +0000
Subject: (임수민) 활성화 조건 제거 준법,법무 요청 버튼
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...basic-contract-detail-table-toolbar-actions.tsx | 94 ++--------------------
 1 file changed, 6 insertions(+), 88 deletions(-)

(limited to 'lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx')

diff --git a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
index 8f945bbd..56857b8d 100644
--- a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
+++ b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
@@ -90,85 +90,11 @@ export function BasicContractDetailTableToolbarActions({
         return true;
     });
 
-    // 법무검토 요청 가능 여부 (준법서약 템플릿이 아닐 때만)
-    // 1. 협력업체 서명 완료 (vendorSignedAt 있음)
-    // 2. 협의 완료됨 (negotiationCompletedAt 있음) OR
-    // 3. 협의 없음 (코멘트 없음, hasComments: false)
-    // 협의 중 (negotiationCompletedAt 없고 코멘트 있음)은 불가
-    const canRequestLegalReview = !isComplianceTemplate && hasSelectedRows && selectedRows.some(row => {
-        const contract = row.original;
-        
-        // 필수 조건 확인: 최종승인 미완료, 법무검토 미요청, 협력업체 서명 완료
-        if (
-            contract.legalReviewRequestedAt ||
-            contract.completedAt ||
-            !contract.vendorSignedAt
-        ) {
-            return false;
-        }
-        
-        // 협의 완료된 경우 → 가능
-        if (contract.negotiationCompletedAt) {
-            return true;
-        }
-        
-        // 협의 완료되지 않은 경우
-        // GTC 템플릿인 경우 코멘트 존재 여부 확인
-        if (contract.templateName?.includes('GTC')) {
-            const contractGtcData = gtcData[contract.id];
-            // 코멘트가 없으면 가능 (협의 없음)
-            if (contractGtcData && !contractGtcData.hasComments) {
-                return true;
-            }
-            // 코멘트가 있으면 불가 (협의 중)
-            return false;
-        }
-        
-        // GTC가 아닌 경우는 협의 완료 여부만 확인
-        return false;
-    });
+    // 법무검토 요청 가능 여부: 항상 활성화
+    const canRequestLegalReview = !isComplianceTemplate;
 
-    // 준법문의 버튼 활성화 가능 여부
-    // 1. 협력업체 서명 완료 (vendorSignedAt 있음)
-    // 2. 협의 완료됨 (negotiationCompletedAt 있음) OR 협의 없음 (코멘트 없음)
-    // 3. 레드플래그 해소됨 (redFlagResolutionData에서 resolved 상태)
-    // 4. 이미 준법문의 요청되지 않음 (complianceReviewRequestedAt 없음)
-    const canRequestComplianceInquiry = hasSelectedRows && selectedRows.some(row => {
-        const contract = row.original;
-        
-        // 필수 조건 확인: 준법서약 템플릿, 최종승인 미완료, 협력업체 서명 완료, 준법문의 미요청
-        if (
-            !isComplianceTemplate ||
-            contract.completedAt ||
-            !contract.vendorSignedAt ||
-            contract.complianceReviewRequestedAt
-        ) {
-            return false;
-        }
-        
-        // 협의 완료 확인
-        // 협의 완료된 경우 → 가능
-        if (contract.negotiationCompletedAt) {
-            // 협의 완료됨, 레드플래그만 확인하면 됨
-        } else {
-            // 협의 완료되지 않은 경우: 코멘트가 없으면 협의 없음으로 간주하여 가능
-            const commentData = agreementCommentData[contract.id];
-            if (commentData && commentData.hasComments) {
-                // 코멘트가 있으면 협의 중이므로 불가
-                return false;
-            }
-            // 코멘트가 없으면 협의 없음으로 간주하여 가능
-        }
-        
-        // 레드플래그 해소 확인
-        const resolution = redFlagResolutionData[contract.id];
-        // 레드플래그가 있는 경우, 해소되어야 함
-        if (redFlagData[contract.id] === true && !resolution?.resolved) {
-            return false;
-        }
-        
-        return true;
-    });
+    // 준법문의 버튼 활성화 가능 여부: 항상 활성화
+    const canRequestComplianceInquiry = isComplianceTemplate;
 
     // 필터링된 계약서들 계산
     const resendContracts = selectedRows.map(row => row.original)
@@ -758,11 +684,7 @@ export function BasicContractDetailTableToolbarActions({
                         onClick={handleRequestLegalReview}
                         className="gap-2"
                         disabled={!canRequestComplianceInquiry || loading}
-                        title={
-                            !canRequestComplianceInquiry
-                                ? "협력업체 서명 완료, 협의 완료, 레드플래그 해소가 필요합니다"
-                                : "준법문의 링크로 이동"
-                        }
+                        title="준법문의 링크로 이동"
                     >
                         <FileText className="size-4" aria-hidden="true" />
                         <span className="hidden sm:inline">
@@ -776,11 +698,7 @@ export function BasicContractDetailTableToolbarActions({
                         onClick={handleRequestLegalReview}
                         className="gap-2"
                         disabled={!canRequestLegalReview || loading}
-                        title={
-                            !canRequestLegalReview
-                                ? "협력업체 서명 완료 및 협의 완료가 필요합니다"
-                                : "법무검토 요청 링크 선택"
-                        }
+                        title="법무검토 요청 링크 선택"
                     >
                         <FileText className="size-4" aria-hidden="true" />
                         <span className="hidden sm:inline">
-- 
cgit v1.2.3


From 718b9c5217eb435dcba07f8322591564d49e364a Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Fri, 5 Dec 2025 09:19:08 +0000
Subject: (임수민) 준법 버튼 활성화 수정
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ...basic-contract-detail-table-toolbar-actions.tsx | 46 ++++++++++++----------
 1 file changed, 25 insertions(+), 21 deletions(-)

(limited to 'lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx')

diff --git a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
index 56857b8d..77e36bc7 100644
--- a/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
+++ b/lib/basic-contract/status-detail/basic-contract-detail-table-toolbar-actions.tsx
@@ -36,7 +36,6 @@ interface RedFlagResolutionState {
 interface BasicContractDetailTableToolbarActionsProps {
     table: Table<BasicContractView>
     gtcData?: Record<number, { gtcDocumentId: number | null; hasComments: boolean }>
-    agreementCommentData?: Record<number, { hasComments: boolean; commentCount: number }>
     redFlagData?: Record<number, boolean>
     redFlagResolutionData?: Record<number, RedFlagResolutionState>
     isComplianceTemplate?: boolean
@@ -45,7 +44,6 @@ interface BasicContractDetailTableToolbarActionsProps {
 export function BasicContractDetailTableToolbarActions({ 
     table, 
     gtcData = {},
-    agreementCommentData = {},
     redFlagData = {},
     redFlagResolutionData = {},
     isComplianceTemplate = false
@@ -90,10 +88,10 @@ export function BasicContractDetailTableToolbarActions({
         return true;
     });
 
-    // 법무검토 요청 가능 여부: 항상 활성화
+    // 법무검토 요청 가능 여부: 준법서약 템플릿이 아닐 때 항상 활성화
     const canRequestLegalReview = !isComplianceTemplate;
 
-    // 준법문의 버튼 활성화 가능 여부: 항상 활성화
+    // 준법문의 버튼 활성화 가능 여부: 준법서약 템플릿일 때 항상 활성화
     const canRequestComplianceInquiry = isComplianceTemplate;
 
     // 필터링된 계약서들 계산
@@ -557,26 +555,32 @@ export function BasicContractDetailTableToolbarActions({
     // 법무검토 요청 / 준법문의
     const handleRequestLegalReview = async () => {
         if (isComplianceTemplate) {
-            // 준법문의: 요청일 기록 후 외부 URL 열기
+            // 준법문의: 선택된 계약서가 있으면 요청일 기록 후 외부 URL 열기, 없으면 URL만 열기
             const selectedContractIds = selectedRows.map(row => row.original.id)
-            try {
-                setLoading(true)
-                const result = await requestComplianceInquiryAction(selectedContractIds)
-                if (result.success) {
-                    toast.success(result.message)
-                    router.refresh()
-                    window.open(complianceInquiryUrl, '_blank', 'noopener,noreferrer')
-                } else {
-                    toast.error(result.message)
+            
+            if (selectedContractIds.length > 0) {
+                try {
+                    setLoading(true)
+                    const result = await requestComplianceInquiryAction(selectedContractIds)
+                    if (result.success) {
+                        toast.success(result.message)
+                        router.refresh()
+                    } else {
+                        toast.error(result.message)
+                    }
+                } catch (error) {
+                    console.error('준법문의 요청 처리 실패:', error)
+                    toast.error('준법문의 요청 중 오류가 발생했습니다.')
+                } finally {
+                    setLoading(false)
                 }
-            } catch (error) {
-                console.error('준법문의 요청 처리 실패:', error)
-                toast.error('준법문의 요청 중 오류가 발생했습니다.')
-            } finally {
-                setLoading(false)
             }
+            
+            // 선택된 계약서가 있든 없든 URL은 항상 열기
+            window.open(complianceInquiryUrl, '_blank', 'noopener,noreferrer')
             return
         }
+        // 법무검토 요청: 선택된 행이 없어도 다이얼로그 열기
         setLegalReviewDialog(true)
     }
 
@@ -683,7 +687,7 @@ export function BasicContractDetailTableToolbarActions({
                         size="sm"
                         onClick={handleRequestLegalReview}
                         className="gap-2"
-                        disabled={!canRequestComplianceInquiry || loading}
+                        disabled={loading}
                         title="준법문의 링크로 이동"
                     >
                         <FileText className="size-4" aria-hidden="true" />
@@ -697,7 +701,7 @@ export function BasicContractDetailTableToolbarActions({
                         size="sm"
                         onClick={handleRequestLegalReview}
                         className="gap-2"
-                        disabled={!canRequestLegalReview || loading}
+                        disabled={loading}
                         title="법무검토 요청 링크 선택"
                     >
                         <FileText className="size-4" aria-hidden="true" />
-- 
cgit v1.2.3

