summaryrefslogtreecommitdiff
path: root/lib/docu-list-rule/document-class/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/docu-list-rule/document-class/service.ts')
-rw-r--r--lib/docu-list-rule/document-class/service.ts78
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 })