summaryrefslogtreecommitdiff
path: root/lib/docu-list-rule/code-groups/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/docu-list-rule/code-groups/service.ts')
-rw-r--r--lib/docu-list-rule/code-groups/service.ts53
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 옵션들 삭제