summaryrefslogtreecommitdiff
path: root/lib/vendors/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendors/service.ts')
-rw-r--r--lib/vendors/service.ts111
1 files changed, 108 insertions, 3 deletions
diff --git a/lib/vendors/service.ts b/lib/vendors/service.ts
index 2a927069..9af81021 100644
--- a/lib/vendors/service.ts
+++ b/lib/vendors/service.ts
@@ -9,6 +9,8 @@ import crypto from 'crypto';
import fs from 'fs/promises';
import path from 'path';
import { v4 as uuidv4 } from 'uuid';
+import { saveDRMFile } from "@/lib/file-stroage";
+import { decryptWithServerAction } from "@/components/drm/drmUtils";
import { filterColumns } from "@/lib/filter-columns";
import { unstable_cache } from "@/lib/unstable-cache";
@@ -2002,6 +2004,7 @@ export async function getVendorDetailById(id: number) {
if (!vendor) {
return null;
}
+ console.log("vendor", vendor.attachments)
// JSON 문자열로 반환된 contacts와 attachments를 JavaScript 객체로 파싱
const contacts = typeof vendor.contacts === 'string'
@@ -2059,8 +2062,10 @@ export async function updateVendorInfo(params: {
files?: File[]
creditRatingFiles?: File[]
cashFlowRatingFiles?: File[]
+ signatureFiles?: File[] // 서명/직인 파일들
contacts: ContactInfo[]
filesToDelete?: number[] // 삭제할 파일 ID 목록
+ selectedAttachmentType?: string // 선택된 첨부파일 타입
}) {
try {
const {
@@ -2068,8 +2073,10 @@ export async function updateVendorInfo(params: {
files = [],
creditRatingFiles = [],
cashFlowRatingFiles = [],
+ signatureFiles = [],
contacts,
- filesToDelete = []
+ filesToDelete = [],
+ selectedAttachmentType = "GENERAL"
} = params
// 세션 및 권한 확인
@@ -2204,9 +2211,9 @@ export async function updateVendorInfo(params: {
}
// 4. 새 파일 저장 (제공된 storeVendorFiles 함수 활용)
- // 4-1. 일반 파일 저장
+ // 4-1. 일반 파일 저장 (선택된 타입 사용)
if (files.length > 0) {
- await storeVendorFiles(tx, vendorData.id, files, "GENERAL");
+ await storeVendorFiles(tx, vendorData.id, files, selectedAttachmentType);
}
// 4-2. 신용평가 파일 저장
@@ -2218,6 +2225,11 @@ export async function updateVendorInfo(params: {
if (cashFlowRatingFiles.length > 0) {
await storeVendorFiles(tx, vendorData.id, cashFlowRatingFiles, "CASH_FLOW_RATING");
}
+
+ // 4-4. 서명/직인 파일 저장
+ if (signatureFiles.length > 0) {
+ await storeVendorFiles(tx, vendorData.id, signatureFiles, "SIGNATURE");
+ }
})
// 캐시 무효화
@@ -2989,3 +3001,96 @@ export async function requestBasicContractInfo({
};
}
}
+
+/**
+ * 비밀유지 계약서 첨부파일 저장 서버 액션
+ */
+export async function saveNdaAttachments(input: {
+ vendorIds: number[];
+ files: File[];
+ userId: string;
+}) {
+ unstable_noStore();
+
+ try {
+ console.log("📎 비밀유지 계약서 첨부파일 저장 시작");
+ console.log(`벤더 수: ${input.vendorIds.length}, 파일 수: ${input.files.length}`);
+
+ const results = [];
+
+ for (const vendorId of input.vendorIds) {
+ for (const file of input.files) {
+ console.log(`📄 처리 중: 벤더 ID ${vendorId} - ${file.name}`);
+
+ try {
+ // saveDRMFile을 사용해서 파일 저장
+ const saveResult = await saveDRMFile(
+ file,
+ decryptWithServerAction,
+ `vendor-attachments/nda/${vendorId}`,
+ input.userId
+ );
+
+ if (!saveResult.success) {
+ throw new Error(`파일 저장 실패: ${file.name} - ${saveResult.error}`);
+ }
+
+ // vendor_attachments 테이블에 파일 정보 저장
+ const insertedAttachment = await db.insert(vendorAttachments).values({
+ vendorId: vendorId,
+ fileType: file.type || 'application/octet-stream',
+ fileName: saveResult.fileName || file.name,
+ filePath: saveResult.publicPath || '',
+ attachmentType: 'NDA_ATTACHMENT',
+ }).returning();
+
+ results.push({
+ vendorId,
+ fileName: file.name,
+ attachmentId: insertedAttachment[0]?.id || 0,
+ success: true
+ });
+
+ console.log(`✅ 완료: 벤더 ID ${vendorId} - ${file.name}`);
+
+ } catch (error) {
+ console.error(`❌ 실패: 벤더 ID ${vendorId} - ${file.name}`, error);
+ results.push({
+ vendorId,
+ fileName: file.name,
+ success: false,
+ error: error instanceof Error ? error.message : '알 수 없는 오류'
+ });
+ }
+ }
+ }
+
+ // 성공/실패 카운트
+ const successCount = results.filter(r => r.success).length;
+ const failureCount = results.filter(r => !r.success).length;
+
+ console.log(`📊 처리 결과: 성공 ${successCount}개, 실패 ${failureCount}개`);
+
+ // 캐시 무효화
+ revalidateTag("vendor-attachments");
+
+ return {
+ success: true,
+ results,
+ summary: {
+ total: results.length,
+ success: successCount,
+ failure: failureCount
+ }
+ };
+
+ } catch (error) {
+ console.error("비밀유지 계약서 첨부파일 저장 중 오류 발생:", error);
+ return {
+ success: false,
+ error: error instanceof Error
+ ? error.message
+ : "첨부파일 저장 처리 중 오류가 발생했습니다."
+ };
+ }
+}