summaryrefslogtreecommitdiff
path: root/lib/basic-contract/service.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-07-23 09:08:03 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-07-23 09:08:03 +0000
commita50bc9baea332f996e6bc3a5d70c69f6d2d0f194 (patch)
tree7493b8a4d9cc7cc3375068f1aa10b0067e85988f /lib/basic-contract/service.ts
parent7402e759857d511add0d3eb19f1fa13cb957c1df (diff)
(대표님, 최겸) 기본계약 템플릿 및 에디터, 기술영업 벤더정보, 파일 보안다운로드, 벤더 document sync 상태 서비스, 메뉴 Config, 기술영업 미사용 제거
Diffstat (limited to 'lib/basic-contract/service.ts')
-rw-r--r--lib/basic-contract/service.ts98
1 files changed, 98 insertions, 0 deletions
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