summaryrefslogtreecommitdiff
path: root/lib/basic-contract/actions/check-red-flag-resolution.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/basic-contract/actions/check-red-flag-resolution.ts
parent204fbfb126daf057a4567f64cfb7ab03a5679e82 (diff)
(임수민) 준법 Red Flag 해제, 코멘트 수정
Diffstat (limited to 'lib/basic-contract/actions/check-red-flag-resolution.ts')
-rw-r--r--lib/basic-contract/actions/check-red-flag-resolution.ts82
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;
}