diff options
Diffstat (limited to 'lib/docu-list-rule/document-class/service.ts')
| -rw-r--r-- | lib/docu-list-rule/document-class/service.ts | 78 |
1 files changed, 54 insertions, 24 deletions
diff --git a/lib/docu-list-rule/document-class/service.ts b/lib/docu-list-rule/document-class/service.ts index 2ec31ae6..378c3215 100644 --- a/lib/docu-list-rule/document-class/service.ts +++ b/lib/docu-list-rule/document-class/service.ts @@ -18,6 +18,7 @@ export async function getDocumentClassCodeGroups(input: { classId?: string description?: string isActive?: string + projectId?: string }) { try { const { page, perPage, sort, search, filters, joinOperator } = input @@ -26,10 +27,15 @@ export async function getDocumentClassCodeGroups(input: { // 기본 조건 (plant 타입 프로젝트만) let whereConditions = sql`${documentClasses.isActive} = true AND ${projects.type} = 'plant'` + // 프로젝트 ID 필터링 + if (input.projectId) { + whereConditions = sql`${whereConditions} AND ${documentClasses.projectId} = ${parseInt(input.projectId)}` + } + // 검색 조건 if (search) { const searchTerm = `%${search}%` - whereConditions = sql`${documentClasses.isActive} = true AND ${projects.type} = 'plant' AND ( + whereConditions = sql`${whereConditions} AND ( ${documentClasses.code} ILIKE ${searchTerm} OR ${documentClasses.value} ILIKE ${searchTerm} OR ${documentClasses.description} ILIKE ${searchTerm} OR @@ -363,7 +369,7 @@ export async function getDocumentClassSubOptions(documentClassId: number, input? } // 정렬 (안전한 필드 체크 적용) - let orderBy = sql`${documentClassOptions.optionCode} ASC` + let orderBy = sql`${documentClassOptions.sdq} ASC` if (sort && sort.length > 0) { const sortField = sort[0] // 안전성 체크: 필드가 실제 테이블에 존재하는지 확인 @@ -380,6 +386,7 @@ export async function getDocumentClassSubOptions(documentClassId: number, input? documentClassId: documentClassOptions.documentClassId, description: documentClassOptions.description, optionCode: documentClassOptions.optionCode, + sdq: documentClassOptions.sdq, isActive: documentClassOptions.isActive, createdAt: documentClassOptions.createdAt, updatedAt: documentClassOptions.updatedAt, @@ -448,12 +455,21 @@ export async function createDocumentClassOptionItem(input: { } } + // 해당 Document Class의 최대 sdq 값 찾기 + const maxSdqResult = await db + .select({ maxSdq: sql<number>`COALESCE(MAX(${documentClassOptions.sdq}), 0)` }) + .from(documentClassOptions) + .where(eq(documentClassOptions.documentClassId, input.documentClassId)) + + const nextSdq = (maxSdqResult[0]?.maxSdq || 0) + 1 + const [newOption] = await db .insert(documentClassOptions) .values({ documentClassId: input.documentClassId, description: userOptionCode, // 코드값을 description에도 자동 설정 optionCode: userOptionCode, + sdq: nextSdq, isActive: true, }) .returning({ id: documentClassOptions.id }) @@ -477,11 +493,10 @@ export async function createDocumentClassOptionItem(input: { // Document Class 옵션 수정 export async function updateDocumentClassOption(input: { id: number - optionCode: string + optionCode?: string + sdq?: number }) { try { - const userOptionCode = input.optionCode.toUpperCase().trim() - // 기존 옵션 조회하여 documentClassId 가져오기 const currentOption = await db .select({ documentClassId: documentClassOptions.documentClassId }) @@ -496,32 +511,47 @@ export async function updateDocumentClassOption(input: { } } - // 같은 Document Class 내에서 코드 중복 체크 (자신 제외) - const existingOption = await db - .select({ id: documentClassOptions.id }) - .from(documentClassOptions) - .where( - and( - eq(documentClassOptions.documentClassId, currentOption[0].documentClassId), - eq(documentClassOptions.optionCode, userOptionCode) + // optionCode가 제공된 경우에만 중복 체크 및 업데이트 + if (input.optionCode) { + const userOptionCode = input.optionCode.toUpperCase().trim() + + // 같은 Document Class 내에서 코드 중복 체크 (자신 제외) + const existingOption = await db + .select({ id: documentClassOptions.id }) + .from(documentClassOptions) + .where( + and( + eq(documentClassOptions.documentClassId, currentOption[0].documentClassId), + eq(documentClassOptions.optionCode, userOptionCode) + ) ) - ) - .limit(1) + .limit(1) - if (existingOption.length > 0 && existingOption[0].id !== input.id) { - return { - success: false, - error: "이미 존재하는 코드입니다." + if (existingOption.length > 0 && existingOption[0].id !== input.id) { + return { + success: false, + error: "이미 존재하는 코드입니다." + } } } + // 업데이트할 데이터 준비 + const updateData: any = { + updatedAt: new Date(), + } + + if (input.optionCode) { + updateData.description = input.optionCode.toUpperCase().trim() + updateData.optionCode = input.optionCode.toUpperCase().trim() + } + + if (input.sdq !== undefined) { + updateData.sdq = input.sdq + } + const [updatedOption] = await db .update(documentClassOptions) - .set({ - description: userOptionCode, // 코드값을 description에도 자동 설정 - optionCode: userOptionCode, - updatedAt: new Date(), - }) + .set(updateData) .where(eq(documentClassOptions.id, input.id)) .returning({ id: documentClassOptions.id }) |
