diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-11-21 09:44:33 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-11-21 09:44:33 +0000 |
| commit | a2e0785c8749c4d3766ecf3b70edfb7c2fe4df20 (patch) | |
| tree | 4b03bbec838baf307b38e0c5692da8da7bde2f9b /lib/compliance/approval-handlers.ts | |
| parent | 204fbfb126daf057a4567f64cfb7ab03a5679e82 (diff) | |
(임수민) 준법 Red Flag 해제, 코멘트 수정
Diffstat (limited to 'lib/compliance/approval-handlers.ts')
| -rw-r--r-- | lib/compliance/approval-handlers.ts | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/compliance/approval-handlers.ts b/lib/compliance/approval-handlers.ts new file mode 100644 index 00000000..05f92a28 --- /dev/null +++ b/lib/compliance/approval-handlers.ts @@ -0,0 +1,64 @@ +"use server" + +import db from "@/db/db" +import { and, inArray, isNull } from "drizzle-orm" +import { complianceResponses } from "@/db/schema/compliance" +import { resolveRedFlag } from "./red-flag-resolution" +import { revalidatePath } from "next/cache" + +interface RedFlagResolutionPayload { + contractIds: number[] +} + +/** + * 결재 승인 후 RED FLAG 해제를 처리하는 핸들러 + * + * approval-workflow에서 자동으로 호출됩니다. + */ +export async function resolveRedFlagAfterApproval(payload: RedFlagResolutionPayload) { + if (!payload?.contractIds || payload.contractIds.length === 0) { + return { + success: false, + message: "처리할 계약서가 없습니다.", + } + } + + const uniqueContractIds = Array.from(new Set(payload.contractIds)) + + // 이미 해제된 계약을 제외한 대상을 조회 + const targets = await db + .select({ + basicContractId: complianceResponses.basicContractId, + approvalId: complianceResponses.redFlagResolutionApprovalId, + }) + .from(complianceResponses) + .where( + and( + inArray(complianceResponses.basicContractId, uniqueContractIds), + isNull(complianceResponses.redFlagResolvedAt) + ) + ) + + if (targets.length === 0) { + return { + success: true, + message: "해제 대상이 없습니다.", + } + } + + for (const target of targets) { + await resolveRedFlag(target.basicContractId, { + approvalId: target.approvalId ?? undefined, + revalidate: false, + }) + } + + await revalidatePath("/evcp/basic-contract") + await revalidatePath("/evcp/compliance") + + return { + success: true, + updated: targets.length, + } +} + |
