diff options
Diffstat (limited to 'lib/docu-list-rule/code-groups/service.ts')
| -rw-r--r-- | lib/docu-list-rule/code-groups/service.ts | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/lib/docu-list-rule/code-groups/service.ts b/lib/docu-list-rule/code-groups/service.ts index 843bafa2..c854f6c9 100644 --- a/lib/docu-list-rule/code-groups/service.ts +++ b/lib/docu-list-rule/code-groups/service.ts @@ -2,26 +2,33 @@ import { revalidatePath } from "next/cache" import db from "@/db/db" -import { codeGroups, comboBoxSettings } from "@/db/schema/docu-list-rule" +import { codeGroups, comboBoxSettings, documentNumberTypeConfigs, documentNumberTypes } from "@/db/schema/docu-list-rule" import { projects } from "@/db/schema/projects" -import { eq, sql, count, and } from "drizzle-orm" +import { eq, sql } from "drizzle-orm" import { unstable_noStore } from "next/cache" // Code Groups 목록 조회 -export async function getCodeGroups(input: any) { +export async function getCodeGroups(input: { + page: number + perPage: number + search: string + filters: Array<{ id: string; value: string | string[] }> + joinOperator: "and" | "or" + sort: Array<{ id: string; desc: boolean }> +}) { unstable_noStore() try { const { page, perPage, search, filters, joinOperator } = input const offset = (page - 1) * perPage - // 검색 조건 (Document Class 제외) - let whereConditions = sql`${codeGroups.groupId} != 'DOC_CLASS'` + // 검색 조건 (plant 타입 프로젝트만) + let whereConditions = sql`${projects.type} = 'plant'` // 검색어 필터링 if (search) { const searchTerm = `%${search}%` - whereConditions = sql`${codeGroups.groupId} != 'DOC_CLASS' AND ( + whereConditions = sql`${projects.type} = 'plant' AND ( ${codeGroups.groupId} ILIKE ${searchTerm} OR ${codeGroups.description} ILIKE ${searchTerm} OR ${codeGroups.codeFormat} ILIKE ${searchTerm} OR @@ -32,7 +39,7 @@ export async function getCodeGroups(input: any) { // 고급 필터링 (단순화) if (filters && filters.length > 0) { - const filterConditions = filters.map(filter => { + const filterConditions = filters.map((filter: { id: string; value: string | string[] }) => { const { id, value } = filter if (!value || Array.isArray(value)) return null @@ -56,7 +63,7 @@ export async function getCodeGroups(input: any) { if (filterConditions.length > 0) { const operator = joinOperator === "or" ? sql` OR ` : sql` AND ` - const combinedFilters = filterConditions.reduce((acc, condition, index) => { + const combinedFilters = filterConditions.reduce((acc: ReturnType<typeof sql> | null, condition: ReturnType<typeof sql> | null, index: number) => { if (index === 0) return condition return sql`${acc}${operator}${condition}` }) @@ -98,6 +105,7 @@ export async function getCodeGroups(input: any) { projectId: codeGroups.projectId, projectCode: projects.code, projectName: projects.name, + projectType: projects.type, }) .from(codeGroups) .leftJoin(projects, eq(codeGroups.projectId, projects.id)) @@ -140,14 +148,11 @@ export async function createCodeGroup(input: { isActive?: boolean }) { try { - // 해당 프로젝트의 마지막 Code Group의 groupId를 찾아서 다음 번호 생성 (DOC_CLASS 제외) + // 해당 프로젝트의 마지막 Code Group의 groupId를 찾아서 다음 번호 생성 const lastCodeGroup = await db .select({ groupId: codeGroups.groupId }) .from(codeGroups) - .where(and( - eq(codeGroups.projectId, input.projectId), // projectId로 변경 - sql`${codeGroups.groupId} != 'DOC_CLASS'` - )) + .where(eq(codeGroups.projectId, input.projectId)) // projectId로 변경 .orderBy(sql`CAST(SUBSTRING(${codeGroups.groupId}, 6) AS INTEGER) DESC`) .limit(1) @@ -251,6 +256,28 @@ export async function deleteCodeGroup(id: number) { } } + // Number Type Config에서 사용 중인지 확인 (Number Type 정보 포함) + const numberTypeConfigs = await db + .select({ + id: documentNumberTypeConfigs.id, + numberTypeName: documentNumberTypes.name, + numberTypeDescription: documentNumberTypes.description + }) + .from(documentNumberTypeConfigs) + .leftJoin(documentNumberTypes, eq(documentNumberTypeConfigs.documentNumberTypeId, documentNumberTypes.id)) + .where(eq(documentNumberTypeConfigs.codeGroupId, id)) + + if (numberTypeConfigs.length > 0) { + const numberTypeNames = numberTypeConfigs.map(config => + `${config.numberTypeName}${config.numberTypeDescription ? ` (${config.numberTypeDescription})` : ''}` + ).join(', ') + + return { + success: false, + error: `Code Group "${codeGroup[0].description}"은(는) ${numberTypeNames}에서 사용 중이므로 삭제할 수 없습니다. Number Type별 설정에서 먼저 제거해주세요.` + } + } + // Control Type이 combobox인 경우 관련 Combo Box 옵션들도 삭제 if (codeGroup[0].controlType === 'combobox') { // Combo Box 옵션들 삭제 |
