summaryrefslogtreecommitdiff
path: root/lib/compliance/approval-handlers.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-11-21 09:44:33 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-11-21 09:44:33 +0000
commita2e0785c8749c4d3766ecf3b70edfb7c2fe4df20 (patch)
tree4b03bbec838baf307b38e0c5692da8da7bde2f9b /lib/compliance/approval-handlers.ts
parent204fbfb126daf057a4567f64cfb7ab03a5679e82 (diff)
(임수민) 준법 Red Flag 해제, 코멘트 수정
Diffstat (limited to 'lib/compliance/approval-handlers.ts')
-rw-r--r--lib/compliance/approval-handlers.ts64
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,
+ }
+}
+