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/basic-contract/actions | |
| parent | 204fbfb126daf057a4567f64cfb7ab03a5679e82 (diff) | |
(임수민) 준법 Red Flag 해제, 코멘트 수정
Diffstat (limited to 'lib/basic-contract/actions')
| -rw-r--r-- | lib/basic-contract/actions/check-red-flag-resolution.ts | 82 |
1 files changed, 23 insertions, 59 deletions
diff --git a/lib/basic-contract/actions/check-red-flag-resolution.ts b/lib/basic-contract/actions/check-red-flag-resolution.ts index 84dcdf75..3ce21bde 100644 --- a/lib/basic-contract/actions/check-red-flag-resolution.ts +++ b/lib/basic-contract/actions/check-red-flag-resolution.ts @@ -2,96 +2,60 @@ import { BasicContractView } from "@/db/schema"; import { getComplianceResponseByBasicContractId } from "@/lib/compliance/services"; -import { syncSpecificApprovalStatusAction } from "@/lib/knox-api/approval/approval"; + +type RedFlagResolutionState = { + resolved: boolean; + resolvedAt: Date | null; + pendingApprovalId: string | null; +}; /** * 여러 계약서에 대한 RED FLAG 해제 상태를 한 번에 확인 */ export async function checkRedFlagResolutionForContracts( contracts: BasicContractView[] -): Promise<Record<number, { resolved: boolean; resolvedAt: Date | null }>> { - const result: Record<number, { resolved: boolean; resolvedAt: Date | null }> = {}; - +): Promise<Record<number, RedFlagResolutionState>> { + const result: Record<number, RedFlagResolutionState> = {}; + // 준법서약 템플릿인 계약서만 필터링 - const complianceContracts = contracts.filter(contract => - contract.templateName?.includes('준법') + const complianceContracts = contracts.filter((contract) => + contract.templateName?.includes("준법") ); - + if (complianceContracts.length === 0) { return result; } - // 1. 먼저 DB에서 현재 상태 조회 - const initialChecks = await Promise.all( + const checks = await Promise.all( complianceContracts.map(async (contract) => { try { const response = await getComplianceResponseByBasicContractId(contract.id); return { contractId: contract.id, - response + resolved: Boolean(response?.redFlagResolvedAt), + resolvedAt: response?.redFlagResolvedAt || null, + pendingApprovalId: response?.redFlagResolutionApprovalId ?? null, }; } catch (error) { console.error(`Error fetching compliance response for contract ${contract.id}:`, error); return { contractId: contract.id, - response: null - }; - } - }) - ); - - // 2. 진행 중인 결재(해소요청)가 있는지 확인하고 Knox 상태 동기화 - const pendingApprovalIds: string[] = []; - - initialChecks.forEach(check => { - const { response } = check; - // 해소요청은 했으나(approvalId 있음) 아직 해소되지 않은(resolvedAt 없음) 경우 - if (response?.redFlagResolutionApprovalId && !response.redFlagResolvedAt) { - pendingApprovalIds.push(response.redFlagResolutionApprovalId); - } - }); - - if (pendingApprovalIds.length > 0) { - try { - // Knox API를 통해 최신 결재 상태 동기화 - // 이 과정에서 결재가 완료되었다면 DB의 redFlagResolvedAt도 업데이트됨 (syncSpecificApprovalStatusAction 내부 로직) - await syncSpecificApprovalStatusAction(pendingApprovalIds); - } catch (error) { - console.error('Error syncing approval status:', error); - } - } - - // 3. 동기화 후 최종 상태 다시 확인 - // (동기화 과정에서 DB가 업데이트되었을 수 있으므로 다시 조회하거나, - // 성능을 위해 위에서 동기화된 건만 다시 조회하는 방식도 가능하지만, - // 여기서는 안전하게 다시 조회하는 방식을 택함) - const finalChecks = await Promise.all( - complianceContracts.map(async (contract) => { - try { - const response = await getComplianceResponseByBasicContractId(contract.id); - return { - contractId: contract.id, - resolved: response?.redFlagResolvedAt !== null && response?.redFlagResolvedAt !== undefined, - resolvedAt: response?.redFlagResolvedAt || null - }; - } catch (error) { - return { - contractId: contract.id, resolved: false, - resolvedAt: null + resolvedAt: null, + pendingApprovalId: null, }; } }) ); - - // 결과를 Record 형태로 변환 - finalChecks.forEach(check => { + + checks.forEach((check) => { result[check.contractId] = { resolved: check.resolved, - resolvedAt: check.resolvedAt + resolvedAt: check.resolvedAt, + pendingApprovalId: check.pendingApprovalId, }; }); - + return result; } |
