From f4b1a770184e8647e0b3042a52a1bcc6f9cf00ce Mon Sep 17 00:00:00 2001
From: joonhoekim <26rote@gmail.com>
Date: Wed, 12 Nov 2025 17:49:57 +0900
Subject: (김준회) SWP: 파일 업로드시 Stage 검증 추가, DOC_CLASS 관리 단순화
 (코드 제거), DOC_CLASS 추가시 검증(A-Z0-9) 처리
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 lib/swp/table/swp-upload-validation-dialog.tsx | 55 ++++++++++++++++++++------
 1 file changed, 44 insertions(+), 11 deletions(-)

(limited to 'lib/swp/table/swp-upload-validation-dialog.tsx')

diff --git a/lib/swp/table/swp-upload-validation-dialog.tsx b/lib/swp/table/swp-upload-validation-dialog.tsx
index 8e786c8b..ef48f0c6 100644
--- a/lib/swp/table/swp-upload-validation-dialog.tsx
+++ b/lib/swp/table/swp-upload-validation-dialog.tsx
@@ -43,11 +43,15 @@ interface SwpUploadValidationDialogProps {
  * @param fileName 검증할 파일명
  * @param availableDocNos 업로드 가능한 문서번호 목록 (선택)
  * @param isVendorMode 벤더 모드인지 여부 (true인 경우 문서번호 검증 필수)
+ * @param docNoToDocTypeMap 문서번호 → DOC_TYPE 매핑 (Stage 검증용)
+ * @param documentClassStages Document Class → 허용 Stage 목록 매핑
  */
 export function validateFileName(
   fileName: string,
   availableDocNos?: string[],
-  isVendorMode?: boolean
+  isVendorMode?: boolean,
+  docNoToDocTypeMap?: Record<string, string>,
+  documentClassStages?: Record<string, string[]>
 ): {
   valid: boolean;
   parsed?: {
@@ -134,12 +138,36 @@ export function validateFileName(
       }
     }
 
+    // Stage 검증 (DOC_TYPE별 허용 Stage 확인)
+    const trimmedDocNo = ownDocNo.trim();
+    const trimmedStage = stage.trim();
+
+    if (docNoToDocTypeMap && documentClassStages) {
+      const docType = docNoToDocTypeMap[trimmedDocNo];
+      
+      if (docType) {
+        const allowedStages = documentClassStages[docType];
+        
+        if (allowedStages && allowedStages.length > 0) {
+          // 허용된 Stage 목록이 있는 경우에만 검증
+          if (!allowedStages.includes(trimmedStage)) {
+            return {
+              valid: false,
+              error: `문서 '${trimmedDocNo}'의 Document Class '${docType}'에서 Stage '${trimmedStage}'는 허용되지 않습니다. 허용된 Stage: ${allowedStages.join(", ")}`,
+            };
+          }
+        }
+        // allowedStages가 비어있으면 Stage 검증을 스킵 (설정되지 않은 경우)
+      }
+      // docType이 없으면 Stage 검증을 스킵 (문서 정보가 없는 경우)
+    }
+
     return {
       valid: true,
       parsed: {
-        ownDocNo: ownDocNo.trim(),
+        ownDocNo: trimmedDocNo,
         revNo: revNo.trim(),
-        stage: stage.trim(),
+        stage: trimmedStage,
         fileName: customFileName.trim(),
         extension,
       },
@@ -314,7 +342,7 @@ export function SwpUploadValidationDialog({
           {/* 형식 안내 */}
           <div className="rounded-lg bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-3">
             <div className="text-sm font-medium text-blue-900 dark:text-blue-100 mb-1">
-              올바른 파일명 형식
+              📋 올바른 파일명 형식
             </div>
             <code className="text-xs text-blue-700 dark:text-blue-300">
               [OWN_DOC_NO]_[REV_NO]_[STAGE].[확장자]
@@ -329,13 +357,18 @@ export function SwpUploadValidationDialog({
               ※ 파일명에는 언더스코어(_)가 포함될 수 있습니다.
             </div>
             {isVendorMode && (
-              <div className="text-xs text-blue-600 dark:text-blue-400 mt-2 pt-2 border-t border-blue-200 dark:border-blue-800">
-                {availableDocNos.length > 0 ? (
-                  <>ℹ️ 업로드 가능한 문서: {availableDocNos.length}개</>
-                ) : (
-                  <>⚠️ 할당된 문서가 없습니다</>
-                )}
-              </div>
+              <>
+                <div className="text-xs text-blue-600 dark:text-blue-400 mt-2 pt-2 border-t border-blue-200 dark:border-blue-800">
+                  {availableDocNos.length > 0 ? (
+                    <>ℹ️ 업로드 가능한 문서: {availableDocNos.length}개</>
+                  ) : (
+                    <>⚠️ 할당된 문서가 없습니다</>
+                  )}
+                </div>
+                <div className="text-xs text-blue-600 dark:text-blue-400 mt-1">
+                  ⚠️ 각 문서의 Document Class에 정의된 Stage만 사용할 수 있습니다.
+                </div>
+              </>
             )}
           </div>
         </div>
-- 
cgit v1.2.3

