diff options
Diffstat (limited to 'lib/basic-contract')
| -rw-r--r-- | lib/basic-contract/actions.ts | 67 | ||||
| -rw-r--r-- | lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx | 2 | ||||
| -rw-r--r-- | lib/basic-contract/viewer/basic-contract-sign-viewer.tsx | 72 |
3 files changed, 71 insertions, 70 deletions
diff --git a/lib/basic-contract/actions.ts b/lib/basic-contract/actions.ts index 0af9b948..eb4389ae 100644 --- a/lib/basic-contract/actions.ts +++ b/lib/basic-contract/actions.ts @@ -67,69 +67,4 @@ export async function restoreDocuments(documentIds: number[]) { console.error('문서 복구 처리 오류:', error) throw new Error('문서 복구 처리 중 오류가 발생했습니다.') } -} - -export async function createDocumentRevisionAction(input: { - baseDocumentId: number; - contractTemplateName: string; - contractTemplateType: string; - revision: number; - legalReviewRequired: boolean; - fileName: string; - filePath: string; -}) { - try { - const { createBasicContractTemplateRevision } = await import('./service'); - - const { data, error } = await createBasicContractTemplateRevision({ - ...input, - status: 'ACTIVE' as const - }); - - if (error) { - throw new Error(error); - } - - return { - success: true, - data, - message: `${input.contractTemplateName} v${input.revision} 리비전이 성공적으로 생성되었습니다.` - }; - - } catch (error) { - console.error('문서 리비전 생성 오류:', error); - throw new Error(error instanceof Error ? error.message : '문서 리비전 생성 중 오류가 발생했습니다.'); - } -} - -// 업로드 완료 후 문서 생성 (클라이언트에서 직접 호출 가능한 서버 액션) -export async function createDocumentFromUpload(input: { - contractTemplateType: string - contractTemplateName: string - legalReviewRequired: boolean - fileName: string - filePath: string -}) { - try { - const { createBasicContractTemplate } = await import('./service'); - - const { data, error } = await createBasicContractTemplate({ - contractTemplateType: input.contractTemplateType, - contractTemplateName: input.contractTemplateName, - revision: 1, - status: 'ACTIVE', - legalReviewRequired: input.legalReviewRequired, - fileName: input.fileName, - filePath: input.filePath, - } as any) - - if (error) throw new Error(error) - - revalidateTag('basic-contract-templates') - revalidatePath('/evcp/basic-contract-template') - - return { success: true, id: data?.id } - } catch (e: any) { - return { success: false, error: e?.message || '문서 생성 실패' } - } -} +}
\ No newline at end of file diff --git a/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx b/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx index fa68c9c8..534a2705 100644 --- a/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx +++ b/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx @@ -86,8 +86,6 @@ export function BasicContractSignDialog({ isComplete?: boolean; }>>({}); - console.log(gtcCommentStatus, "gtcCommentStatus") - const router = useRouter() // 실제 사용할 open 상태 (외부 제어가 있으면 외부 상태 사용, 없으면 내부 상태 사용) diff --git a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx index 5698428e..77bfaf41 100644 --- a/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx +++ b/lib/basic-contract/viewer/basic-contract-sign-viewer.tsx @@ -25,6 +25,7 @@ import { getActiveSurveyTemplate, getVendorSignatureFile, type SurveyTemplateWit import { useConditionalSurvey } from '../vendor-table/survey-conditional'; import { SurveyComponent } from './SurveyComponent'; import { GtcClausesComponent } from './GtcClausesComponent'; +import { getBuyerSignatureFileWithFallback } from "@/lib/shi-signature/buyer-signature"; interface FileInfo { path: string; @@ -256,6 +257,63 @@ class AutoSignatureFieldDetector { } } +const applyBuyerSignatureAutomatically = async (instance: WebViewerInstance) => { + const { Core } = instance; + const { documentViewer, annotationManager } = Core; + const document = documentViewer.getDocument(); + + if (!document) return; + + try { + console.log('🔍 구매자 서명란 자동 서명 시작...'); + + // "삼성중공업_서명란" 텍스트 검색 + const searchText = '삼성중공업_서명란'; + const textSearchIterator = await document.getTextSearchIterator(); + textSearchIterator.begin(searchText, Core.Search.Mode.PAGE_STOP | Core.Search.Mode.HIGHLIGHT); + + let searchResult = await textSearchIterator.next(); + + if (searchResult && searchResult.resultCode === Core.Search.ResultCode.FOUND) { + const pageNumber = searchResult.pageNum; + const quads = searchResult.quads; + + if (quads && quads.length > 0) { + const quad = quads[0]; + const x = Math.min(quad.x1, quad.x2, quad.x3, quad.x4); + const y = Math.min(quad.y1, quad.y2, quad.y3, quad.y4); + const textHeight = Math.abs(quad.y3 - quad.y1); + + // 구매자 서명 이미지 가져오기 + const buyerSignature = await getBuyerSignatureFileWithFallback(); + + if (buyerSignature) { + // 스탬프 어노테이션 생성 + const stamp = new Core.Annotations.StampAnnotation(); + stamp.PageNumber = pageNumber; + stamp.X = x; + stamp.Y = y + textHeight + 5; // 텍스트 아래 5픽셀 + stamp.Width = 150; + stamp.Height = 50; + + await stamp.setImageData(buyerSignature.data.dataUrl); + + // 어노테이션 추가 + annotationManager.addAnnotation(stamp); + annotationManager.drawAnnotationsFromList([stamp]); + + console.log('✅ 구매자 서명 자동 적용 완료'); + toast.info('삼성중공업 서명이 자동으로 적용되었습니다.', { + duration: 3000 + }); + } + } + } + } catch (error) { + console.error('구매자 자동 서명 처리 실패:', error); + } +}; + function useAutoSignatureFields(instance: WebViewerInstance | null, mode: 'vendor' | 'buyer' = 'vendor') { const [signatureFields, setSignatureFields] = useState<string[]>([]); @@ -790,10 +848,20 @@ export function BasicContractSignViewer({ const { WidgetFlags } = Annotations; const FitMode = newInstance.UI.FitMode; - const handleDocumentLoaded = () => { + const handleDocumentLoaded = async () => { setFileLoading(false); newInstance.UI.setFitMode(FitMode.FitWidth); - + + // GTC 템플릿이 아닌 경우에만 구매자 자동 서명 적용 + if (!templateName.includes('GTC')) { + try { + // 구매자 서명란 찾아서 자동 서명 + await applyBuyerSignatureAutomatically(newInstance); + } catch (error) { + console.error('구매자 자동 서명 실패:', error); + } + } + requestAnimationFrame(() => { try { documentViewer.refreshAll(); |
