"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, } }