diff options
Diffstat (limited to 'lib/knox-api/approval/service.ts')
| -rw-r--r-- | lib/knox-api/approval/service.ts | 107 |
1 files changed, 99 insertions, 8 deletions
diff --git a/lib/knox-api/approval/service.ts b/lib/knox-api/approval/service.ts index 0bd817a6..4908f984 100644 --- a/lib/knox-api/approval/service.ts +++ b/lib/knox-api/approval/service.ts @@ -9,7 +9,8 @@ import { eq, and } from 'drizzle-orm'; /** - * 결재 상신 데이터를 데이터베이스에 저장 + * 결재 상신 데이터를 데이터베이스에 저장 (upsert) + * 상신, 상세조회 업데이트, 리스트조회 상태 업데이트 시 모두 사용 */ export async function saveApprovalToDatabase( apInfId: string, @@ -18,22 +19,56 @@ export async function saveApprovalToDatabase( emailAddress: string, subject: string, content: string, - aplns: ApprovalLine[] + aplns: ApprovalLine[], + additionalData?: { + contentsType?: string; + urgYn?: string; + importantYn?: string; + docSecuType?: string; + notifyOption?: string; + docMngSaveCode?: string; + sbmLang?: string; + timeZone?: string; + sbmDt?: string; + status?: string; // 상태 업데이트를 위한 옵션 + } ): Promise<void> { try { - await db.insert(approvalLogs).values({ + const now = new Date(); + const dataToUpsert = { apInfId, userId, epId, emailAddress, subject, content, - status: '1', // 진행중 상태로 초기 설정 + contentsType: additionalData?.contentsType || 'HTML', + status: additionalData?.status || '1', // 기본값: 진행중 + urgYn: additionalData?.urgYn || 'N', + importantYn: additionalData?.importantYn || 'N', + docSecuType: additionalData?.docSecuType || 'PERSONAL', + notifyOption: additionalData?.notifyOption || '0', + docMngSaveCode: additionalData?.docMngSaveCode || '0', + sbmLang: additionalData?.sbmLang || 'ko', + timeZone: additionalData?.timeZone || 'GMT+9', + sbmDt: additionalData?.sbmDt, aplns, isDeleted: false, - createdAt: new Date(), - updatedAt: new Date(), - }); + updatedAt: now, + }; + + await db.insert(approvalLogs) + .values({ + ...dataToUpsert, + createdAt: now, + }) + .onConflictDoUpdate({ + target: approvalLogs.apInfId, + set: { + ...dataToUpsert, + // createdAt은 업데이트하지 않음 (최초 생성 시점 유지) + } + }); } catch (error) { console.error('결재 데이터 저장 실패:', error); throw new Error( @@ -43,7 +78,7 @@ export async function saveApprovalToDatabase( } /** - * 결재 상태 업데이트 + * 결재 상태만 업데이트 (기존 레코드가 있는 경우에만) */ export async function updateApprovalStatus( apInfId: string, @@ -64,6 +99,62 @@ export async function updateApprovalStatus( } /** + * 결재 상태를 upsert로 업데이트 (상세정보 없이 상태만 알고 있는 경우) + * Knox API에서 상태 조회 시 상세정보가 없을 때 사용 + */ +export async function upsertApprovalStatus( + apInfId: string, + status: string, + fallbackData?: { + userId?: string; + epId?: string; + emailAddress?: string; + subject?: string; + content?: string; + } +): Promise<void> { + try { + const now = new Date(); + + // 먼저 기존 레코드 조회 + const existingRecord = await getApprovalFromDatabase(apInfId, true); + + if (existingRecord) { + // 기존 레코드가 있으면 상태만 업데이트 + await updateApprovalStatus(apInfId, status); + } else if (fallbackData?.userId && fallbackData?.epId && fallbackData?.emailAddress) { + // 기존 레코드가 없고 fallback 데이터가 있으면 새로 생성 + await db.insert(approvalLogs).values({ + apInfId, + userId: fallbackData.userId, + epId: fallbackData.epId, + emailAddress: fallbackData.emailAddress, + subject: fallbackData.subject || `결재 ${apInfId}`, + content: fallbackData.content || `상태 동기화로 생성된 결재`, + contentsType: 'TEXT', + status, + urgYn: 'N', + importantYn: 'N', + docSecuType: 'PERSONAL', + notifyOption: '0', + docMngSaveCode: '0', + sbmLang: 'ko', + timeZone: 'GMT+9', + aplns: [], + isDeleted: false, + createdAt: now, + updatedAt: now, + }); + } else { + console.warn(`결재 상태 업데이트 건너뜀: ${apInfId} - 기존 레코드 없음, fallback 데이터 부족`); + } + } catch (error) { + console.error('결재 상태 upsert 실패:', error); + throw new Error('결재 상태를 upsert하는 중 오류가 발생했습니다.'); + } +} + +/** * 결재 상세 정보 조회 */ export async function getApprovalFromDatabase( |
