summaryrefslogtreecommitdiff
path: root/lib/basic-contract
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-18 00:23:40 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-18 00:23:40 +0000
commitcf8dac0c6490469dab88a560004b0c07dbd48612 (patch)
treeb9e76061e80d868331e6b4277deecb9086f845f3 /lib/basic-contract
parente5745fc0268bbb5770bc14a55fd58a0ec30b466e (diff)
(대표님) rfq, 계약, 서명 등
Diffstat (limited to 'lib/basic-contract')
-rw-r--r--lib/basic-contract/actions.ts67
-rw-r--r--lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx2
-rw-r--r--lib/basic-contract/viewer/basic-contract-sign-viewer.tsx72
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();