diff options
Diffstat (limited to 'lib/vendors')
| -rw-r--r-- | lib/vendors/service.ts | 42 | ||||
| -rw-r--r-- | lib/vendors/table/vendor-all-export.ts | 10 |
2 files changed, 29 insertions, 23 deletions
diff --git a/lib/vendors/service.ts b/lib/vendors/service.ts index a22a1551..22d58ae1 100644 --- a/lib/vendors/service.ts +++ b/lib/vendors/service.ts @@ -6,8 +6,6 @@ import { vendorAttachments, VendorContact, vendorContacts, vendorDetailView, ven import logger from '@/lib/logger'; import * as z from "zod" 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"; @@ -58,7 +56,7 @@ import { mfaTokens, roles, userRoles, users } from "@/db/schema/users"; import { getServerSession } from "next-auth"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; import { contractsDetailView, projects, vendorPQSubmissions, vendorsLogs } from "@/db/schema"; -import { deleteFile, saveFile } from "../file-stroage"; +import { deleteFile, saveFile, saveBuffer } from "../file-stroage"; import { basicContractTemplates } from "@/db/schema/basicContractDocumnet"; import { basicContract } from "@/db/schema/basicContractDocumnet"; import { headers } from 'next/headers'; @@ -2868,14 +2866,8 @@ export async function requestBasicContractInfo({ try { const fileId = uuidv4(); const fileName = `${fileId}.pdf`; - const relativePath = `/basicContract/${fileName}`; - const publicDir = path.join(process.cwd(), "public", "basicContract"); - const absolutePath = path.join(publicDir, fileName); - // 디렉토리 생성 - await fs.mkdir(publicDir, { recursive: true }); - - // PDF 파일 저장 (다양한 타입을 Buffer로 변환) + // PDF 버퍼를 Buffer로 변환 (saveBuffer 함수가 Buffer 메서드를 사용하므로) let bufferData: Buffer; if (Buffer.isBuffer(pdfBuffer)) { bufferData = pdfBuffer; @@ -2886,12 +2878,29 @@ export async function requestBasicContractInfo({ } else { bufferData = Buffer.from(pdfBuffer as any); } - await fs.writeFile(absolutePath, bufferData); + + // saveBuffer 함수를 사용해서 파일 저장 (환경별 경로 처리는 자동으로 됨) + const saveResult = await saveBuffer({ + buffer: bufferData, + fileName: fileName, + directory: "basicContract", + originalName: `${template.templateName || 'contract'}_${fileId}.pdf`, + userId: requestedBy.toString() + }); + + if (!saveResult.success) { + throw new Error(saveResult.error || '파일 저장에 실패했습니다.'); + } - finalFileName = fileName; - finalFilePath = relativePath; + finalFileName = saveResult.fileName || fileName; + // publicPath에서 /api/files/ 부분을 제거하여 데이터베이스에 저장 + // 이렇게 하면 /api/files/ API를 통해 접근할 때 올바른 경로가 됨 + finalFilePath = saveResult.publicPath + ? saveResult.publicPath.replace('/api/files/', '') + : `/basicContract/${fileName}`; - console.log(`✅ PDF 파일 저장 완료: ${absolutePath}`); + console.log(`✅ PDF 파일 저장 완료: ${saveResult.filePath}`); + console.log(`📄 접근 경로: ${finalFilePath}`); } catch (pdfSaveError) { console.error('PDF 파일 저장 오류:', pdfSaveError); return { error: `PDF 파일 저장 실패: ${pdfSaveError instanceof Error ? pdfSaveError.message : '알 수 없는 오류'}` }; @@ -2917,6 +2926,10 @@ export async function requestBasicContractInfo({ try { // 3-1. basic_contract 테이블에 레코드 추가 + // 마감일은 생성일로부터 10일 후로 설정 + const deadline = new Date(); + deadline.setDate(deadline.getDate() + 10); + const [newContract] = await db .insert(basicContract) .values({ @@ -2926,6 +2939,7 @@ export async function requestBasicContractInfo({ status: "PENDING", fileName: finalFileName, // PDF 변환된 파일 이름 사용 filePath: finalFilePath, // PDF 변환된 파일 경로 사용 + deadline: deadline.toISOString().split('T')[0], // YYYY-MM-DD 형식으로 변환 }) .returning(); diff --git a/lib/vendors/table/vendor-all-export.ts b/lib/vendors/table/vendor-all-export.ts index 31ab2b52..1784ae9b 100644 --- a/lib/vendors/table/vendor-all-export.ts +++ b/lib/vendors/table/vendor-all-export.ts @@ -2,6 +2,7 @@ import ExcelJS from "exceljs" import { VendorWithType } from "@/db/schema/vendors" import { exportVendorDetails } from "../service"; +import { formatDate } from "@/lib/utils"; // 연락처 인터페이스 정의 interface VendorContact { @@ -451,15 +452,6 @@ function applyHeaderStyle(sheet: ExcelJS.Worksheet): void { }); } -// 날짜 포맷 함수 -function formatDate(date: Date | string): string { - if (!date) return ""; - if (typeof date === 'string') { - date = new Date(date); - } - return date.toISOString().split('T')[0]; -} - // 금액 포맷 함수 function formatAmount(amount: number): string { return amount.toLocaleString(); |
