summaryrefslogtreecommitdiff
path: root/lib/general-contract-template/actions.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-12 08:01:02 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-12 08:01:02 +0000
commita9575387c3a765a1a65ebc179dae16a21af6eb25 (patch)
tree347f2b17b07039080fb2f116460004ba0b75a779 /lib/general-contract-template/actions.ts
parent47e527f5f763658600696ee58451fb666e692f5a (diff)
(임수민) 일반 계약 템플릿 구현 및 basic contract 필터 수정
Diffstat (limited to 'lib/general-contract-template/actions.ts')
-rw-r--r--lib/general-contract-template/actions.ts134
1 files changed, 134 insertions, 0 deletions
diff --git a/lib/general-contract-template/actions.ts b/lib/general-contract-template/actions.ts
new file mode 100644
index 00000000..eb236173
--- /dev/null
+++ b/lib/general-contract-template/actions.ts
@@ -0,0 +1,134 @@
+"use server"
+
+import { revalidateTag, revalidatePath } from 'next/cache'
+import db from '@/db/db'
+import { generalContractTemplates } from '@/db/schema'
+import { eq, inArray } from 'drizzle-orm'
+import { createContractTemplate } from '@/lib/general-contract-template/service'
+
+export async function disposeTemplates(templateIds: number[]) {
+ try {
+ if (!templateIds || !Array.isArray(templateIds) || templateIds.length === 0) {
+ throw new Error('폐기할 템플릿 ID가 필요합니다.')
+ }
+
+ // 템플릿들을 DISPOSED 상태로 업데이트하고 폐기일시 설정
+ await db
+ .update(generalContractTemplates)
+ .set({
+ status: 'DISPOSED',
+ disposedAt: new Date(),
+ updatedAt: new Date(),
+ })
+ .where(inArray(generalContractTemplates.id, templateIds))
+
+ // 캐시 무효화
+ revalidateTag('general-contract-templates')
+ revalidatePath('/evcp/general-contract-template')
+
+ return {
+ success: true,
+ message: `${templateIds.length}개의 템플릿이 폐기되었습니다.`,
+ disposedCount: templateIds.length
+ }
+
+ } catch (error) {
+ console.error('폐기 처리 오류:', error)
+ throw new Error('폐기 처리 중 오류가 발생했습니다.')
+ }
+}
+
+export async function restoreTemplates(templateIds: number[]) {
+ try {
+ if (!templateIds || !Array.isArray(templateIds) || templateIds.length === 0) {
+ throw new Error('복구할 템플릿 ID가 필요합니다.')
+ }
+
+ // 템플릿들을 ACTIVE 상태로 업데이트하고 폐기일시 제거
+ await db
+ .update(generalContractTemplates)
+ .set({
+ status: 'ACTIVE',
+ disposedAt: null,
+ updatedAt: new Date(),
+ })
+ .where(inArray(generalContractTemplates.id, templateIds))
+
+ // 캐시 무효화
+ revalidateTag('general-contract-templates')
+ revalidatePath('/evcp/general-contract-template')
+
+ return {
+ success: true,
+ message: `${templateIds.length}개의 템플릿이 복구되었습니다.`,
+ restoredCount: templateIds.length
+ }
+
+ } catch (error) {
+ console.error('복구 처리 오류:', error)
+ throw new Error('복구 처리 중 오류가 발생했습니다.')
+ }
+}
+
+export async function createGeneralContractTemplateRevisionAction(input: {
+ baseTemplateId: number;
+ contractTemplateName: string;
+ contractTemplateType: string;
+ revision: number;
+ legalReviewRequired: boolean;
+ fileName: string;
+ filePath: string;
+}) {
+ try {
+ const { createGeneralContractTemplateRevision } = await import('../general-contract-template/service');
+
+ const { data, error } = await createGeneralContractTemplateRevision({
+ ...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 createTemplateFromUpload(input: {
+ contractTemplateType: string
+ contractTemplateName: string
+ legalReviewRequired: boolean
+ fileName: string
+ filePath: string
+}) {
+ try {
+ const { data, error } = await createContractTemplate({
+ 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('general-contract-templates')
+ revalidatePath('/evcp/general-contract-template')
+
+ return { success: true, id: data?.id }
+ } catch (e: any) {
+ return { success: false, error: e?.message || '템플릿 생성 실패' }
+ }
+}