summaryrefslogtreecommitdiff
path: root/lib/knox-api/approval/service.ts
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-09-10 08:59:19 +0000
committerjoonhoekim <26rote@gmail.com>2025-09-10 08:59:19 +0000
commit26bd5a0af8f69fd693c16d2eacb35cf138a360d1 (patch)
tree1d770ede1824dee37c0bff651b8844b6551284e6 /lib/knox-api/approval/service.ts
parentf828b24261b0e3661d4ab0ac72b63431887f35bd (diff)
(김준회) 결재 이력조회 기능 추가 및 로그 테이블 확장, 테스트모듈 작성
Diffstat (limited to 'lib/knox-api/approval/service.ts')
-rw-r--r--lib/knox-api/approval/service.ts107
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(