summaryrefslogtreecommitdiff
path: root/lib/knox-api/approval
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-11-21 06:04:56 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-11-21 06:04:56 +0000
commitb845ccde2910894911233cda273657d2b52e63f9 (patch)
treef12032484952225d099b3399f800d912bfdbda88 /lib/knox-api/approval
parenteacfa3f36274e495838a7114d68ff80a0f257a6a (diff)
(임수민) 준법 Red Flag 수정
Diffstat (limited to 'lib/knox-api/approval')
-rw-r--r--lib/knox-api/approval/approval.ts100
1 files changed, 92 insertions, 8 deletions
diff --git a/lib/knox-api/approval/approval.ts b/lib/knox-api/approval/approval.ts
index f9ed8cfb..5599c066 100644
--- a/lib/knox-api/approval/approval.ts
+++ b/lib/knox-api/approval/approval.ts
@@ -4,6 +4,7 @@ import { getKnoxConfig, createJsonHeaders, createFormHeaders } from '../common';
import { randomUUID } from 'crypto';
import { saveApprovalToDatabase, deleteApprovalFromDatabase, upsertApprovalStatus } from './service';
import { debugLog, debugError } from '@/lib/debug-utils'
+import { resolveRedFlag } from '@/lib/compliance/red-flag-resolution'
// Knox API Approval 서버 액션들
// 가이드: lib/knox-api/approval/guide.html
@@ -830,6 +831,34 @@ export async function syncApprovalStatusAction(): Promise<{
// upsert를 사용한 상태 업데이트
await upsertApprovalStatus(statusData.apInfId, statusData.status);
updated++;
+
+ // RED FLAG 해소 결재 완료 확인 및 처리
+ if (['2', '5', '6'].includes(statusData.status)) {
+ // 완결(2), 전결(5), 후완결(6) 상태인 경우 RED FLAG 해소 처리
+ try {
+ const db = (await import('@/db/db')).default;
+ const { complianceResponses } = await import('@/db/schema/compliance');
+ const { eq } = await import('drizzle-orm');
+
+ // 해당 결재 ID로 compliance response 조회
+ const response = await db
+ .select({
+ id: complianceResponses.id,
+ basicContractId: complianceResponses.basicContractId,
+ })
+ .from(complianceResponses)
+ .where(eq(complianceResponses.redFlagResolutionApprovalId, statusData.apInfId))
+ .limit(1);
+
+ if (response[0]) {
+ // RED FLAG 해소 처리
+ await resolveRedFlag(response[0].basicContractId, statusData.apInfId);
+ }
+ } catch (redFlagError) {
+ console.error(`RED FLAG 해소 처리 실패 (${statusData.apInfId}):`, redFlagError);
+ // RED FLAG 해소 실패는 결재 상태 업데이트를 무효화하지 않음
+ }
+ }
}
} catch (updateError) {
console.error(`결재상태 업데이트 실패 (${statusData.apInfId}):`, updateError);
@@ -915,14 +944,42 @@ export async function syncSpecificApprovalStatusAction(
if (statusResponse.result === 'success' && statusResponse.data) {
// 조회된 상태로 데이터베이스 업데이트
for (const statusData of statusResponse.data) {
- try {
- // upsert를 사용한 상태 업데이트
- await upsertApprovalStatus(statusData.apInfId, statusData.status);
- updated++;
- } catch (updateError) {
- console.error(`결재상태 업데이트 실패 (${statusData.apInfId}):`, updateError);
- failed.push(statusData.apInfId);
- }
+ try {
+ // upsert를 사용한 상태 업데이트
+ await upsertApprovalStatus(statusData.apInfId, statusData.status);
+ updated++;
+
+ // RED FLAG 해소 결재 완료 확인 및 처리
+ if (['2', '5', '6'].includes(statusData.status)) {
+ // 완결(2), 전결(5), 후완결(6) 상태인 경우 RED FLAG 해소 처리
+ try {
+ const db = (await import('@/db/db')).default;
+ const { complianceResponses } = await import('@/db/schema/compliance');
+ const { eq } = await import('drizzle-orm');
+
+ // 해당 결재 ID로 compliance response 조회
+ const response = await db
+ .select({
+ id: complianceResponses.id,
+ basicContractId: complianceResponses.basicContractId,
+ })
+ .from(complianceResponses)
+ .where(eq(complianceResponses.redFlagResolutionApprovalId, statusData.apInfId))
+ .limit(1);
+
+ if (response[0]) {
+ // RED FLAG 해소 처리
+ await resolveRedFlag(response[0].basicContractId, statusData.apInfId);
+ }
+ } catch (redFlagError) {
+ console.error(`RED FLAG 해소 처리 실패 (${statusData.apInfId}):`, redFlagError);
+ // RED FLAG 해소 실패는 결재 상태 업데이트를 무효화하지 않음
+ }
+ }
+ } catch (updateError) {
+ console.error(`결재상태 업데이트 실패 (${statusData.apInfId}):`, updateError);
+ failed.push(statusData.apInfId);
+ }
}
} else {
console.error('Knox API 결재상황조회 실패:', statusResponse);
@@ -1071,6 +1128,33 @@ export async function getApprovalLogsAction(): Promise<{
// 메모리상의 데이터도 업데이트
currentLog.status = statusData.status;
updatedCount++;
+
+ // RED FLAG 해소 결재 완료 확인 및 처리
+ if (['2', '5', '6'].includes(statusData.status)) {
+ // 완결(2), 전결(5), 후완결(6) 상태인 경우 RED FLAG 해소 처리
+ try {
+ const { complianceResponses } = await import('@/db/schema/compliance');
+ const { eq } = await import('drizzle-orm');
+
+ // 해당 결재 ID로 compliance response 조회
+ const response = await db
+ .select({
+ id: complianceResponses.id,
+ basicContractId: complianceResponses.basicContractId,
+ })
+ .from(complianceResponses)
+ .where(eq(complianceResponses.redFlagResolutionApprovalId, statusData.apInfId))
+ .limit(1);
+
+ if (response[0]) {
+ // RED FLAG 해소 처리
+ await resolveRedFlag(response[0].basicContractId, statusData.apInfId);
+ }
+ } catch (redFlagError) {
+ console.error(`RED FLAG 해소 처리 실패 (${statusData.apInfId}):`, redFlagError);
+ // RED FLAG 해소 실패는 결재 상태 업데이트를 무효화하지 않음
+ }
+ }
} catch (updateError) {
console.error(`결재상태 업데이트 실패 (${statusData.apInfId}):`, updateError);
}