diff options
Diffstat (limited to 'lib/knox-api/approval')
| -rw-r--r-- | lib/knox-api/approval/approval.ts | 100 |
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); } |
