From defda07c0bb4b0bd444ca8dc4fd3f89322bda0ce Mon Sep 17 00:00:00 2001
From: dujinkim <dujin.kim@dtsolution.co.kr>
Date: Fri, 3 Oct 2025 04:48:47 +0000
Subject: (대표님) edp, tbe, dolce 등
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ship/import-from-dolce-button.tsx              | 188 ++++++++++++++++-----
 1 file changed, 143 insertions(+), 45 deletions(-)

(limited to 'lib/vendor-document-list/ship/import-from-dolce-button.tsx')

diff --git a/lib/vendor-document-list/ship/import-from-dolce-button.tsx b/lib/vendor-document-list/ship/import-from-dolce-button.tsx
index fe7f55c7..76d66960 100644
--- a/lib/vendor-document-list/ship/import-from-dolce-button.tsx
+++ b/lib/vendor-document-list/ship/import-from-dolce-button.tsx
@@ -1,4 +1,4 @@
-// import-from-dolce-button.tsx - 최적화된 버전
+// import-from-dolce-button.tsx - 리비전/첨부파일 포함 버전
 "use client"
 
 import * as React from "react"
@@ -223,20 +223,30 @@ export function ImportFromDOLCEButton({
     }
   }, [debouncedProjectIds, fetchAllImportStatus])
 
-  
-
-  // 🔥 전체 통계 메모이제이션
+  // 🔥 전체 통계 메모이제이션 - 리비전과 첨부파일 추가
   const totalStats = React.useMemo(() => {
     const statuses = Array.from(importStatusMap.values())
     return statuses.reduce((acc, status) => ({
       availableDocuments: acc.availableDocuments + (status.availableDocuments || 0),
       newDocuments: acc.newDocuments + (status.newDocuments || 0),
       updatedDocuments: acc.updatedDocuments + (status.updatedDocuments || 0),
+      availableRevisions: acc.availableRevisions + (status.availableRevisions || 0),
+      newRevisions: acc.newRevisions + (status.newRevisions || 0),
+      updatedRevisions: acc.updatedRevisions + (status.updatedRevisions || 0),
+      availableAttachments: acc.availableAttachments + (status.availableAttachments || 0),
+      newAttachments: acc.newAttachments + (status.newAttachments || 0),
+      updatedAttachments: acc.updatedAttachments + (status.updatedAttachments || 0),
       importEnabled: acc.importEnabled || status.importEnabled
     }), {
       availableDocuments: 0,
       newDocuments: 0,
       updatedDocuments: 0,
+      availableRevisions: 0,
+      newRevisions: 0,
+      updatedRevisions: 0,
+      availableAttachments: 0,
+      newAttachments: 0,
+      updatedAttachments: 0,
       importEnabled: false
     })
   }, [importStatusMap])
@@ -347,7 +357,14 @@ export function ImportFromDOLCEButton({
     }
   }, [projectIds, fetchAllImportStatus, onImportComplete, t])
 
-  // 🔥 상태 뱃지 메모이제이션
+  // 🔥 전체 변경 사항 계산
+  const totalChanges = React.useMemo(() => {
+    return totalStats.newDocuments + totalStats.updatedDocuments + 
+           totalStats.newRevisions + totalStats.updatedRevisions + 
+           totalStats.newAttachments + totalStats.updatedAttachments
+  }, [totalStats])
+
+  // 🔥 상태 뱃지 메모이제이션 - 리비전과 첨부파일 포함
   const statusBadge = React.useMemo(() => {
     if (loadingVendorProjects) {
       return <Badge variant="secondary">{t('dolceImport.status.loadingProjectInfo')}</Badge>
@@ -365,7 +382,7 @@ export function ImportFromDOLCEButton({
       return <Badge variant="secondary">{t('dolceImport.status.importDisabled')}</Badge>
     }
 
-    if (totalStats.newDocuments > 0 || totalStats.updatedDocuments > 0) {
+    if (totalChanges > 0) {
       return (
         <Badge variant="samsung" className="gap-1">
           <AlertTriangle className="w-3 h-3" />
@@ -380,10 +397,10 @@ export function ImportFromDOLCEButton({
         {t('dolceImport.status.synchronized')}
       </Badge>
     )
-  }, [loadingVendorProjects, statusLoading, importStatusMap.size, totalStats, projectIds.length, t])
+  }, [loadingVendorProjects, statusLoading, importStatusMap.size, totalStats.importEnabled, totalChanges, projectIds.length, t])
 
-  const canImport = totalStats.importEnabled && 
-    (totalStats.newDocuments > 0 || totalStats.updatedDocuments > 0)
+  // 🔥 가져오기 가능 여부 - 리비전과 첨부파일도 체크
+  const canImport = totalStats.importEnabled && totalChanges > 0
 
   // 🔥 새로고침 핸들러 최적화
   const handleRefresh = React.useCallback(() => {
@@ -391,24 +408,20 @@ export function ImportFromDOLCEButton({
     fetchAllImportStatus()
   }, [fetchAllImportStatus])
 
-
-   // 🔥 자동 동기화 실행 (기존 useEffect들 다음에 추가)
-   React.useEffect(() => {
+  // 🔥 자동 동기화 실행 (기존 useEffect들 다음에 추가)
+  React.useEffect(() => {
     // 조건: 가져오기 가능하고, 동기화할 항목이 있고, 현재 진행중이 아닐 때
-    if (canImport && 
-        (totalStats.newDocuments > 0 || totalStats.updatedDocuments > 0) && 
-        !isImporting && 
-        !isDialogOpen) {
+    if (canImport && totalChanges > 0 && !isImporting && !isDialogOpen) {
       
       // 상태 로딩이 완료된 후 잠깐 대기 (사용자가 상태를 확인할 수 있도록)
       const timer = setTimeout(() => {
-        console.log(`🔄 자동 동기화 시작: 새 문서 ${totalStats.newDocuments}개, 업데이트 ${totalStats.updatedDocuments}개`)
+        console.log(`🔄 자동 동기화 시작: ${totalChanges}개 항목`)
         
         // 동기화 시작 알림
         toast.info(
-          '새로운 문서가 발견되어 자동 동기화를 시작합니다',
+          '새로운 변경사항이 발견되어 자동 동기화를 시작합니다',
           {
-            description: `새 문서 ${totalStats.newDocuments}개, 업데이트 ${totalStats.updatedDocuments}개`,
+            description: `총 ${totalChanges}개 항목 (문서/리비전/첨부파일)`,
             duration: 3000
           }
         )
@@ -424,9 +437,8 @@ export function ImportFromDOLCEButton({
 
       return () => clearTimeout(timer)
     }
-  }, [canImport, totalStats.newDocuments, totalStats.updatedDocuments, isImporting, isDialogOpen, handleImport])
+  }, [canImport, totalChanges, isImporting, isDialogOpen, handleImport])
 
-  
   // 로딩 중이거나 projectIds가 없으면 버튼을 표시하지 않음
   if (projectIds.length === 0) {
     return null 
@@ -449,12 +461,12 @@ export function ImportFromDOLCEButton({
                 <Download className="w-4 h-4" />
               )}
               <span className="hidden sm:inline">{t('dolceImport.buttons.getList')}</span>
-              {totalStats.newDocuments + totalStats.updatedDocuments > 0 && (
+              {totalChanges > 0 && (
                 <Badge 
                   variant="samsung" 
                   className="h-5 w-5 p-0 text-xs flex items-center justify-center"
                 >
-                  {totalStats.newDocuments + totalStats.updatedDocuments}
+                  {totalChanges}
                 </Badge>
               )}
             </Button>
@@ -493,21 +505,75 @@ export function ImportFromDOLCEButton({
               <div className="space-y-3">
                 <Separator />
                 
-                <div className="grid grid-cols-2 gap-4 text-sm">
-                  <div>
-                    <div className="text-muted-foreground">{t('dolceImport.labels.newDocuments')}</div>
-                    <div className="font-medium">{totalStats.newDocuments || 0}</div>
-                  </div>
-                  <div>
-                    <div className="text-muted-foreground">{t('dolceImport.labels.updates')}</div>
-                    <div className="font-medium">{totalStats.updatedDocuments || 0}</div>
+                {/* 문서 정보 */}
+                <div className="space-y-2">
+                  <div className="font-medium text-sm">{t('dolceImport.labels.documents')}</div>
+                  <div className="grid grid-cols-3 gap-3 text-sm">
+                    <div>
+                      <div className="text-muted-foreground">{t('dolceImport.labels.total')}</div>
+                      <div className="font-medium">{totalStats.availableDocuments || 0}</div>
+                    </div>
+                    <div>
+                      <div className="text-muted-foreground">{t('dolceImport.labels.new')}</div>
+                      <div className="font-medium text-green-600">{totalStats.newDocuments || 0}</div>
+                    </div>
+                    <div>
+                      <div className="text-muted-foreground">{t('dolceImport.labels.updates')}</div>
+                      <div className="font-medium text-blue-600">{totalStats.updatedDocuments || 0}</div>
+                    </div>
                   </div>
                 </div>
 
-                <div className="text-sm">
-                  <div className="text-muted-foreground">{t('dolceImport.labels.totalDocuments')}</div>
-                  <div className="font-medium">{totalStats.availableDocuments || 0}</div>
-                </div>
+                {/* 리비전 정보 */}
+                {(totalStats.availableRevisions > 0 || totalStats.newRevisions > 0 || totalStats.updatedRevisions > 0) && (
+                  <div className="space-y-2">
+                    <div className="font-medium text-sm">{t('dolceImport.labels.revisions')}</div>
+                    <div className="grid grid-cols-3 gap-3 text-sm">
+                      <div>
+                        <div className="text-muted-foreground">{t('dolceImport.labels.total')}</div>
+                        <div className="font-medium">{totalStats.availableRevisions || 0}</div>
+                      </div>
+                      <div>
+                        <div className="text-muted-foreground">{t('dolceImport.labels.new')}</div>
+                        <div className="font-medium text-green-600">{totalStats.newRevisions || 0}</div>
+                      </div>
+                      <div>
+                        <div className="text-muted-foreground">{t('dolceImport.labels.updates')}</div>
+                        <div className="font-medium text-blue-600">{totalStats.updatedRevisions || 0}</div>
+                      </div>
+                    </div>
+                  </div>
+                )}
+
+                {/* 첨부파일 정보 */}
+                {(totalStats.availableAttachments > 0 || totalStats.newAttachments > 0 || totalStats.updatedAttachments > 0) && (
+                  <div className="space-y-2">
+                    <div className="font-medium text-sm">{t('dolceImport.labels.attachments')}</div>
+                    <div className="grid grid-cols-3 gap-3 text-sm">
+                      <div>
+                        <div className="text-muted-foreground">{t('dolceImport.labels.total')}</div>
+                        <div className="font-medium">{totalStats.availableAttachments || 0}</div>
+                      </div>
+                      <div>
+                        <div className="text-muted-foreground">{t('dolceImport.labels.new')}</div>
+                        <div className="font-medium text-green-600">{totalStats.newAttachments || 0}</div>
+                      </div>
+                      <div>
+                        <div className="text-muted-foreground">{t('dolceImport.labels.updates')}</div>
+                        <div className="font-medium text-blue-600">{totalStats.updatedAttachments || 0}</div>
+                      </div>
+                    </div>
+                  </div>
+                )}
+
+                {/* 요약 */}
+                {totalChanges > 0 && (
+                  <div className="bg-muted/50 rounded-lg p-3">
+                    <div className="text-sm font-medium">
+                      {t('dolceImport.labels.totalChanges')}: <span className="text-primary">{totalChanges}</span>
+                    </div>
+                  </div>
+                )}
 
                 {/* 각 프로젝트별 세부 정보 */}
                 {projectIds.length > 1 && (
@@ -522,11 +588,29 @@ export function ImportFromDOLCEButton({
                           <div key={projectId} className="text-xs">
                             <div className="font-medium">{t('dolceImport.labels.projectLabel', { projectId })}</div>
                             {status ? (
-                              <div className="text-muted-foreground">
-                                {t('dolceImport.descriptions.projectDetails', {
-                                  newDocuments: status.newDocuments,
-                                  updatedDocuments: status.updatedDocuments
-                                })}
+                              <div className="text-muted-foreground space-y-1">
+                                <div>
+                                  {t('dolceImport.descriptions.projectDocuments', {
+                                    newDocuments: status.newDocuments,
+                                    updatedDocuments: status.updatedDocuments
+                                  })}
+                                </div>
+                                {(status.newRevisions > 0 || status.updatedRevisions > 0) && (
+                                  <div>
+                                    {t('dolceImport.descriptions.projectRevisions', {
+                                      newRevisions: status.newRevisions,
+                                      updatedRevisions: status.updatedRevisions
+                                    })}
+                                  </div>
+                                )}
+                                {(status.newAttachments > 0 || status.updatedAttachments > 0) && (
+                                  <div>
+                                    {t('dolceImport.descriptions.projectAttachments', {
+                                      newAttachments: status.newAttachments,
+                                      updatedAttachments: status.updatedAttachments
+                                    })}
+                                  </div>
+                                )}
                               </div>
                             ) : (
                               <div className="text-destructive">{t('dolceImport.status.statusCheckFailed')}</div>
@@ -595,14 +679,28 @@ export function ImportFromDOLCEButton({
               <div className="rounded-lg border p-4 space-y-3">
                 <div className="flex items-center justify-between text-sm">
                   <span>{t('dolceImport.labels.itemsToImport')}</span>
-                  <span className="font-medium">
-                    {totalStats.newDocuments + totalStats.updatedDocuments}
-                  </span>
+                  <span className="font-medium">{totalChanges}</span>
+                </div>
+                
+                <div className="space-y-1 text-xs text-muted-foreground">
+                  {totalStats.newDocuments + totalStats.updatedDocuments > 0 && (
+                    <div>
+                      • {t('dolceImport.labels.documents')}: {totalStats.newDocuments} {t('dolceImport.labels.new')}, {totalStats.updatedDocuments} {t('dolceImport.labels.updates')}
+                    </div>
+                  )}
+                  {totalStats.newRevisions + totalStats.updatedRevisions > 0 && (
+                    <div>
+                      • {t('dolceImport.labels.revisions')}: {totalStats.newRevisions} {t('dolceImport.labels.new')}, {totalStats.updatedRevisions} {t('dolceImport.labels.updates')}
+                    </div>
+                  )}
+                  {totalStats.newAttachments + totalStats.updatedAttachments > 0 && (
+                    <div>
+                      • {t('dolceImport.labels.attachments')}: {totalStats.newAttachments} {t('dolceImport.labels.new')}, {totalStats.updatedAttachments} {t('dolceImport.labels.updates')}
+                    </div>
+                  )}
                 </div>
                 
                 <div className="text-xs text-muted-foreground">
-                  {t('dolceImport.descriptions.includesNewAndUpdated')}
-                  <br />
                   {t('dolceImport.descriptions.b4DocumentsNote')}
                   {projectIds.length > 1 && (
                     <>
-- 
cgit v1.2.3

