From a50bc9baea332f996e6bc3a5d70c69f6d2d0f194 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 23 Jul 2025 09:08:03 +0000 Subject: (대표님, 최겸) 기본계약 템플릿 및 에디터, 기술영업 벤더정보, 파일 보안다운로드, 벤더 document sync 상태 서비스, 메뉴 Config, 기술영업 미사용 제거 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/basic-contract/service.ts | 98 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) (limited to 'lib/basic-contract/service.ts') diff --git a/lib/basic-contract/service.ts b/lib/basic-contract/service.ts index 9890cdfc..87a861e1 100644 --- a/lib/basic-contract/service.ts +++ b/lib/basic-contract/service.ts @@ -889,4 +889,102 @@ export async function checkContractRequestStatus( error: error instanceof Error ? error.message : "계약 상태 확인 중 오류가 발생했습니다." }; } +} + + +/** + * ID로 기본계약서 템플릿 조회 + */ +export async function getBasicContractTemplateByIdService(id: string) { + try { + const templateId = parseInt(id); + + if (isNaN(templateId)) { + return null; + } + + const templates = await db + .select() + .from(basicContractTemplates) + .where(eq(basicContractTemplates.id, templateId)) + .limit(1); + + if (templates.length === 0) { + return null; + } + + return templates[0]; + } catch (error) { + console.error("템플릿 조회 오류:", error); + return null; + } +} + +/** + * 템플릿 파일 저장 서버 액션 + */ +export async function saveTemplateFile(templateId: number, formData: FormData) { + try { + const file = formData.get("file") as File; + + if (!file) { + return { error: "파일이 필요합니다." }; + } + + // 기존 템플릿 정보 조회 + const existingTemplate = await db + .select() + .from(basicContractTemplates) + .where(eq(basicContractTemplates.id, templateId)) + .limit(1); + + if (existingTemplate.length === 0) { + return { error: "템플릿을 찾을 수 없습니다." }; + } + + const template = existingTemplate[0]; + + // 파일 저장 로직 (실제 파일 시스템에 저장) + const { writeFile, mkdir } = await import("fs/promises"); + const { join } = await import("path"); + + const bytes = await file.arrayBuffer(); + const buffer = Buffer.from(bytes); + + // 기존 파일 경로 사용 (덮어쓰기) + const uploadPath = join(process.cwd(), "public", template.filePath.replace(/^\//, "")); + + // 디렉토리 확인 및 생성 + const dirPath = uploadPath.substring(0, uploadPath.lastIndexOf('/')); + await mkdir(dirPath, { recursive: true }); + + // 파일 저장 + await writeFile(uploadPath, buffer); + + // 데이터베이스 업데이트 (수정일시만 업데이트) + await db + .update(basicContractTemplates) + .set({ + updatedAt: new Date(), + }) + .where(eq(basicContractTemplates.id, templateId)); + + // 캐시 무효화 + revalidatePath(`/evcp/basic-contract-template/${templateId}`); + revalidateTag("basic-contract-templates"); + + return { success: true, message: "템플릿이 성공적으로 저장되었습니다." }; + + } catch (error) { + console.error("템플릿 저장 오류:", error); + return { error: "저장 중 오류가 발생했습니다." }; + } +} + +/** + * 템플릿 페이지 새로고침 서버 액션 + */ +export async function refreshTemplatePage(templateId: string) { + revalidatePath(`/evcp/basic-contract-template/${templateId}`); + revalidateTag("basic-contract-templates"); } \ No newline at end of file -- cgit v1.2.3