From cb88faa68e15cf9a5ac913e55cca922e6ebaee52 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Mon, 1 Sep 2025 11:00:38 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EC=A3=BC=EC=9A=94=EA=B8=B0=EB=8A=A5=20Pris?= =?UTF-8?q?ma=20ORM=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controllers/adminController.ts | 941 ++++++++---------- .../src/controllers/multilangController.ts | 498 +++------ .../controllers/tableManagementController.ts | 248 ++--- backend-node/src/services/multilangService.ts | 824 +++++++-------- .../src/services/tableManagementService.ts | 239 +++-- 5 files changed, 1135 insertions(+), 1615 deletions(-) diff --git a/backend-node/src/controllers/adminController.ts b/backend-node/src/controllers/adminController.ts index 0ec055ba..4ca152ec 100644 --- a/backend-node/src/controllers/adminController.ts +++ b/backend-node/src/controllers/adminController.ts @@ -180,9 +180,7 @@ export const getUserList = async (req: AuthenticatedRequest, res: Response) => { const { page = 1, countPerPage = 20, - // 통합 검색 (전체 필드 대상) search, - // 고급 검색 (개별 필드별) searchField, searchValue, search_sabun, @@ -193,286 +191,199 @@ export const getUserList = async (req: AuthenticatedRequest, res: Response) => { search_userName, search_tel, search_email, - // 기존 필터 deptCode, status, } = req.query; - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: config.databaseUrl, - }); + // Prisma ORM을 사용한 사용자 목록 조회 + let whereConditions: any = {}; + let searchType = "none"; - await client.connect(); + // 검색 조건 처리 + if (search && typeof search === "string" && search.trim()) { + // 통합 검색 + searchType = "unified"; + const searchTerm = search.trim(); - try { - // 기본 사용자 목록 조회 쿼리 - let query = ` - SELECT - u.sabun, - u.user_id, - u.user_name, - u.user_name_eng, - u.dept_code, - u.dept_name, - u.position_code, - u.position_name, - u.email, - u.tel, - u.cell_phone, - u.user_type, - u.user_type_name, - u.regdate, - u.status, - u.company_code, - u.locale, - d.dept_name as dept_name_full - FROM user_info u - LEFT JOIN dept_info d ON u.dept_code = d.dept_code - WHERE 1=1 - `; + whereConditions.OR = [ + { sabun: { contains: searchTerm, mode: "insensitive" } }, + { user_type_name: { contains: searchTerm, mode: "insensitive" } }, + { dept_name: { contains: searchTerm, mode: "insensitive" } }, + { position_name: { contains: searchTerm, mode: "insensitive" } }, + { user_id: { contains: searchTerm, mode: "insensitive" } }, + { user_name: { contains: searchTerm, mode: "insensitive" } }, + { tel: { contains: searchTerm, mode: "insensitive" } }, + { cell_phone: { contains: searchTerm, mode: "insensitive" } }, + { email: { contains: searchTerm, mode: "insensitive" } }, + ]; - const queryParams: any[] = []; - let paramIndex = 1; - let searchType = "none"; - - // 검색 조건 처리 - if (search && typeof search === "string" && search.trim()) { - // 통합 검색 (우선순위: 모든 주요 필드에서 검색) - searchType = "unified"; - const searchTerm = search.trim(); - - query += ` AND ( - UPPER(COALESCE(u.sabun, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.user_type_name, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.dept_name, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.position_name, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.user_id, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.user_name, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.tel, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.cell_phone, '')) LIKE UPPER($${paramIndex}) OR - UPPER(COALESCE(u.email, '')) LIKE UPPER($${paramIndex}) - )`; - queryParams.push(`%${searchTerm}%`); - paramIndex++; - - logger.info("통합 검색 실행", { searchTerm }); - } else if (searchField && searchValue) { - // 단일 필드 검색 - searchType = "single"; - const fieldMap: { [key: string]: string } = { - sabun: "u.sabun", - companyName: "u.user_type_name", - deptName: "u.dept_name", - positionName: "u.position_name", - userId: "u.user_id", - userName: "u.user_name", - tel: "u.tel", - cellPhone: "u.cell_phone", - email: "u.email", - }; - - if (fieldMap[searchField as string]) { - if (searchField === "tel") { - // 전화번호는 TEL과 CELL_PHONE 모두 검색 - query += ` AND (UPPER(u.tel) LIKE UPPER($${paramIndex}) OR UPPER(u.cell_phone) LIKE UPPER($${paramIndex}))`; - } else { - query += ` AND UPPER(${fieldMap[searchField as string]}) LIKE UPPER($${paramIndex})`; - } - queryParams.push(`%${searchValue}%`); - paramIndex++; - - logger.info("단일 필드 검색 실행", { searchField, searchValue }); - } - } else { - // 고급 검색 (개별 필드별 AND 조건) - const advancedSearchFields = [ - { param: search_sabun, field: "u.sabun" }, - { param: search_companyName, field: "u.user_type_name" }, - { param: search_deptName, field: "u.dept_name" }, - { param: search_positionName, field: "u.position_name" }, - { param: search_userId, field: "u.user_id" }, - { param: search_userName, field: "u.user_name" }, - { param: search_email, field: "u.email" }, - ]; - - let hasAdvancedSearch = false; - - for (const { param, field } of advancedSearchFields) { - if (param && typeof param === "string" && param.trim()) { - query += ` AND UPPER(${field}) LIKE UPPER($${paramIndex})`; - queryParams.push(`%${param.trim()}%`); - paramIndex++; - hasAdvancedSearch = true; - } - } - - // 전화번호 검색 (TEL 또는 CELL_PHONE) - if (search_tel && typeof search_tel === "string" && search_tel.trim()) { - query += ` AND (UPPER(u.tel) LIKE UPPER($${paramIndex}) OR UPPER(u.cell_phone) LIKE UPPER($${paramIndex}))`; - queryParams.push(`%${search_tel.trim()}%`); - paramIndex++; - hasAdvancedSearch = true; - } - - if (hasAdvancedSearch) { - searchType = "advanced"; - logger.info("고급 검색 실행", { - search_sabun, - search_companyName, - search_deptName, - search_positionName, - search_userId, - search_userName, - search_tel, - search_email, - }); - } - } - - // 기존 필터들 - if (deptCode) { - query += ` AND u.dept_code = $${paramIndex}`; - queryParams.push(deptCode); - paramIndex++; - } - - if (status) { - query += ` AND u.status = $${paramIndex}`; - queryParams.push(status); - paramIndex++; - } - - // 정렬 - query += ` ORDER BY u.regdate DESC, u.user_name`; - - // 페이징 파라미터 제외한 카운트용 파라미터 - const countParams = [...queryParams]; - - // 총 개수 조회를 위해 기존 쿼리를 COUNT로 변환 - const countQuery = query - .replace(/SELECT[\s\S]*?FROM/i, "SELECT COUNT(*) as total FROM") - .replace(/ORDER BY.*$/i, ""); - - const countResult = await client.query(countQuery, countParams); - const totalCount = parseInt(countResult.rows[0].total); - - // 페이징 적용 - const offset = (Number(page) - 1) * Number(countPerPage); - query += ` LIMIT $${paramIndex} OFFSET $${paramIndex + 1}`; - queryParams.push(Number(countPerPage), offset); - - // 사용자 목록 조회 - const result = await client.query(query, queryParams); - const users = result.rows; - - // 디버깅: 원본 데이터베이스 조회 결과 로깅 - logger.info("=== 원본 데이터베이스 조회 결과 ==="); - logger.info("총 조회된 사용자 수:", users.length); - if (users.length > 0) { - logger.info("첫 번째 사용자 원본 데이터:", { - user_id: users[0].user_id, - user_name: users[0].user_name, - user_name_eng: users[0].user_name_eng, - dept_code: users[0].dept_code, - dept_name: users[0].dept_name, - position_code: users[0].position_code, - position_name: users[0].position_name, - email: users[0].email, - tel: users[0].tel, - cell_phone: users[0].cell_phone, - user_type: users[0].user_type, - user_type_name: users[0].user_type_name, - status: users[0].status, - company_code: users[0].company_code, - locale: users[0].locale, - regdate: users[0].regdate, - }); - } - - // 응답 데이터 가공 - const processedUsers = users.map((user) => { - // 디버깅: 각 필드별 값 확인 - const processedUser = { - userId: user.user_id, - userName: user.user_name, - userNameEng: user.user_name_eng || null, - sabun: user.sabun || null, - deptCode: user.dept_code || null, - deptName: user.dept_name || user.dept_name_full || null, - positionCode: user.position_code || null, - positionName: user.position_name || null, - email: user.email || null, - tel: user.tel || null, - cellPhone: user.cell_phone || null, - userType: user.user_type || null, - userTypeName: user.user_type_name || null, - status: user.status || "active", - companyCode: user.company_code || null, - locale: user.locale || null, - regDate: user.regdate - ? user.regdate.toISOString().split("T")[0] - : null, - }; - - // 빈 문자열을 null로 변환 - Object.keys(processedUser).forEach((key) => { - if (processedUser[key as keyof typeof processedUser] === "") { - (processedUser as any)[key] = null; - } - }); - - // 디버깅: 가공된 데이터 로깅 - logger.info(`사용자 ${user.user_id} 가공 결과:`, { - 원본: { - user_id: user.user_id, - user_name: user.user_name, - user_name_eng: user.user_name_eng, - dept_code: user.dept_code, - dept_name: user.dept_name, - position_code: user.position_code, - position_name: user.position_name, - email: user.email, - tel: user.tel, - cell_phone: user.cell_phone, - user_type: user.user_type, - user_type_name: user.user_type_name, - status: user.status, - company_code: user.company_code, - locale: user.locale, - regdate: user.regdate, - }, - 가공후: processedUser, - }); - - return processedUser; - }); - - const response = { - success: true, - data: processedUsers, - total: totalCount, - searchType, // 검색 타입 정보 (unified, single, advanced, none) - pagination: { - page: Number(page), - limit: Number(countPerPage), - totalPages: Math.ceil(totalCount / Number(countPerPage)), - }, - message: "사용자 목록 조회 성공", + logger.info("통합 검색 실행", { searchTerm }); + } else if (searchField && searchValue) { + // 단일 필드 검색 + searchType = "single"; + const fieldMap: { [key: string]: string } = { + sabun: "sabun", + companyName: "user_type_name", + deptName: "dept_name", + positionName: "position_name", + userId: "user_id", + userName: "user_name", + tel: "tel", + cellPhone: "cell_phone", + email: "email", }; - logger.info("사용자 목록 조회 성공", { - totalCount, - returnedCount: processedUsers.length, - searchType, - currentPage: Number(page), - countPerPage: Number(countPerPage), - }); + if (fieldMap[searchField as string]) { + if (searchField === "tel") { + whereConditions.OR = [ + { tel: { contains: searchValue as string, mode: "insensitive" } }, + { + cell_phone: { + contains: searchValue as string, + mode: "insensitive", + }, + }, + ]; + } else { + whereConditions[fieldMap[searchField as string]] = { + contains: searchValue as string, + mode: "insensitive", + }; + } + logger.info("단일 필드 검색 실행", { searchField, searchValue }); + } + } else { + // 고급 검색 (개별 필드별 AND 조건) + const advancedSearchFields = [ + { param: search_sabun, field: "sabun" }, + { param: search_companyName, field: "user_type_name" }, + { param: search_deptName, field: "dept_name" }, + { param: search_positionName, field: "position_name" }, + { param: search_userId, field: "user_id" }, + { param: search_userName, field: "user_name" }, + { param: search_email, field: "email" }, + ]; - res.status(200).json(response); - } finally { - await client.end(); + let hasAdvancedSearch = false; + + for (const { param, field } of advancedSearchFields) { + if (param && typeof param === "string" && param.trim()) { + whereConditions[field] = { + contains: param.trim(), + mode: "insensitive", + }; + hasAdvancedSearch = true; + } + } + + // 전화번호 검색 + if (search_tel && typeof search_tel === "string" && search_tel.trim()) { + whereConditions.OR = [ + { tel: { contains: search_tel.trim(), mode: "insensitive" } }, + { cell_phone: { contains: search_tel.trim(), mode: "insensitive" } }, + ]; + hasAdvancedSearch = true; + } + + if (hasAdvancedSearch) { + searchType = "advanced"; + logger.info("고급 검색 실행", { + search_sabun, + search_companyName, + search_deptName, + search_positionName, + search_userId, + search_userName, + search_tel, + search_email, + }); + } } + + // 기존 필터들 + if (deptCode) { + whereConditions.dept_code = deptCode as string; + } + + if (status) { + whereConditions.status = status as string; + } + + // 총 개수 조회 + const totalCount = await prisma.user_info.count({ + where: whereConditions, + }); + + // 사용자 목록 조회 + const users = await prisma.user_info.findMany({ + where: whereConditions, + orderBy: [{ regdate: "desc" }, { user_name: "asc" }], + skip: (Number(page) - 1) * Number(countPerPage), + take: Number(countPerPage), + select: { + sabun: true, + user_id: true, + user_name: true, + user_name_eng: true, + dept_code: true, + dept_name: true, + position_code: true, + position_name: true, + email: true, + tel: true, + cell_phone: true, + user_type: true, + user_type_name: true, + regdate: true, + status: true, + company_code: true, + locale: true, + }, + }); + + // 응답 데이터 가공 + const processedUsers = users.map((user) => ({ + userId: user.user_id, + userName: user.user_name, + userNameEng: user.user_name_eng || null, + sabun: user.sabun || null, + deptCode: user.dept_code || null, + deptName: user.dept_name || null, + positionCode: user.position_code || null, + positionName: user.position_name || null, + email: user.email || null, + tel: user.tel || null, + cellPhone: user.cell_phone || null, + userType: user.user_type || null, + userTypeName: user.user_type_name || null, + status: user.status || "active", + companyCode: user.company_code || null, + locale: user.locale || null, + regDate: user.regdate ? user.regdate.toISOString().split("T")[0] : null, + })); + + const response = { + success: true, + data: processedUsers, + total: totalCount, + searchType, + pagination: { + page: Number(page), + limit: Number(countPerPage), + totalPages: Math.ceil(totalCount / Number(countPerPage)), + }, + message: "사용자 목록 조회 성공", + }; + + logger.info("사용자 목록 조회 성공", { + totalCount, + returnedCount: processedUsers.length, + searchType, + currentPage: Number(page), + countPerPage: Number(countPerPage), + }); + + res.status(200).json(response); } catch (error) { logger.error("사용자 목록 조회 실패", { error }); res.status(500).json({ @@ -506,8 +417,6 @@ export const getUserLocale = async ( } // 데이터베이스에서 사용자 로케일 조회 - const prisma = (await import("../config/database")).default; - const userInfo = await prisma.user_info.findFirst({ where: { user_id: req.user.userId, @@ -587,8 +496,6 @@ export const setUserLocale = async ( } // 데이터베이스에 사용자 로케일 저장 - const prisma = (await import("../config/database")).default; - await prisma.user_info.update({ where: { user_id: req.user.userId, @@ -1473,35 +1380,23 @@ export async function getCompanyListFromDB( res: Response ): Promise { try { - logger.info("회사 목록 조회 요청 (DB)", { user: req.user }); + logger.info("회사 목록 조회 요청 (Prisma)", { user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM으로 회사 목록 조회 + const companies = await prisma.company_mng.findMany({ + select: { + company_code: true, + company_name: true, + writer: true, + regdate: true, + status: true, + }, + orderBy: { + regdate: "desc", + }, }); - await client.connect(); - - // company_mng 테이블에서 회사 목록 조회 - const query = ` - SELECT - company_code, - company_name, - writer, - regdate, - status - FROM company_mng - ORDER BY regdate DESC - `; - - const result = await client.query(query); - const companies = result.rows; - - await client.end(); - - logger.info("회사 목록 조회 성공 (DB)", { count: companies.length }); + logger.info("회사 목록 조회 성공 (Prisma)", { count: companies.length }); const response: ApiResponse = { success: true, @@ -1512,7 +1407,7 @@ export async function getCompanyListFromDB( res.status(200).json(response); } catch (error) { - logger.error("회사 목록 조회 실패 (DB):", error); + logger.error("회사 목록 조회 실패 (Prisma):", error); res.status(500).json({ success: false, message: "회사 목록 조회 중 오류가 발생했습니다.", @@ -1846,7 +1741,7 @@ export const getUserInfo = async (req: AuthenticatedRequest, res: Response) => { export const checkDuplicateUserId = async ( req: AuthenticatedRequest, res: Response -) => { +): Promise => { try { const { userId } = req.body; logger.info(`사용자 ID 중복 체크 요청 - userId: ${userId}`, { @@ -1865,50 +1760,38 @@ export const checkDuplicateUserId = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM으로 사용자 ID 중복 체크 + const existingUser = await prisma.user_info.findUnique({ + where: { + user_id: userId, + }, + select: { + user_id: true, + }, }); - await client.connect(); + const isDuplicate = !!existingUser; + const count = isDuplicate ? 1 : 0; - try { - // 사용자 ID 중복 체크 쿼리 - const query = ` - SELECT COUNT(*) as count - FROM user_info - WHERE user_id = $1 - `; - - const result = await client.query(query, [userId]); - const count = parseInt(result.rows[0].count); - - const isDuplicate = count > 0; - - const response = { - success: true, - data: { - isDuplicate, - count, - message: isDuplicate - ? "이미 사용 중인 사용자 ID입니다." - : "사용 가능한 사용자 ID입니다.", - }, - message: "사용자 ID 중복 체크 완료", - }; - - logger.info("사용자 ID 중복 체크 완료", { - userId, + const response = { + success: true, + data: { isDuplicate, count, - }); + message: isDuplicate + ? "이미 사용 중인 사용자 ID입니다." + : "사용 가능한 사용자 ID입니다.", + }, + message: "사용자 ID 중복 체크 완료", + }; - res.status(200).json(response); - } finally { - await client.end(); - } + logger.info("사용자 ID 중복 체크 완료", { + userId, + isDuplicate, + count, + }); + + res.status(200).json(response); } catch (error) { logger.error("사용자 ID 중복 체크 실패", { error, @@ -2112,20 +1995,25 @@ export const changeUserStatus = async ( return; } + // 복잡한 상태 변경은 직접 쿼리 사용 const client = new Client({ connectionString: config.databaseUrl, }); try { - await client.connect(); + // 1. Prisma ORM으로 사용자 존재 여부 확인 + const currentUser = await prisma.user_info.findUnique({ + where: { + user_id: userId, + }, + select: { + user_id: true, + user_name: true, + status: true, + }, + }); - // 1. 사용자 존재 여부 확인 - const userCheckResult = await client.query( - "SELECT user_id, user_name, status FROM user_info WHERE user_id = $1", - [userId] - ); - - if (userCheckResult.rows.length === 0) { + if (!currentUser) { res.status(404).json({ result: false, msg: "사용자를 찾을 수 없습니다.", @@ -2133,7 +2021,7 @@ export const changeUserStatus = async ( return; } - const currentUser = userCheckResult.rows[0]; + await client.connect(); // 2. 상태 변경 쿼리 실행 let updateQuery = ` @@ -2387,7 +2275,23 @@ export const createCompany = async ( return; } - // PostgreSQL 클라이언트 생성 + // Prisma ORM으로 회사명 중복 체크 + const existingCompany = await prisma.company_mng.findFirst({ + where: { + company_name: company_name.trim(), + }, + }); + + if (existingCompany) { + res.status(400).json({ + success: false, + message: "이미 등록된 회사명입니다.", + errorCode: "COMPANY_NAME_DUPLICATE", + }); + return; + } + + // PostgreSQL 클라이언트 생성 (복잡한 코드 생성 쿼리용) const client = new Client({ connectionString: process.env.DATABASE_URL || @@ -2397,26 +2301,6 @@ export const createCompany = async ( await client.connect(); try { - // 회사명 중복 체크 - const duplicateCheckQuery = ` - SELECT COUNT(*) as count - FROM company_mng - WHERE company_name = $1 - `; - - const duplicateResult = await client.query(duplicateCheckQuery, [ - company_name.trim(), - ]); - - if (parseInt(duplicateResult.rows[0].count) > 0) { - res.status(400).json({ - success: false, - message: "이미 등록된 회사명입니다.", - errorCode: "COMPANY_NAME_DUPLICATE", - }); - return; - } - // 회사 코드 생성 (COMPANY_1, COMPANY_2, ...) const codeQuery = ` SELECT COALESCE(MAX(CAST(SUBSTRING(company_code FROM 9) AS INTEGER)), 0) + 1 as next_number @@ -2622,60 +2506,48 @@ export const deleteCompany = async ( user: req.user, }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM으로 회사 존재 여부 확인 + const existingCompany = await prisma.company_mng.findUnique({ + where: { + company_code: companyCode, + }, + select: { + company_code: true, + company_name: true, + }, }); - await client.connect(); - - try { - // 회사 존재 여부 확인 - const checkQuery = ` - SELECT company_code, company_name - FROM company_mng - WHERE company_code = $1 - `; - - const checkResult = await client.query(checkQuery, [companyCode]); - - if (checkResult.rows.length === 0) { - res.status(404).json({ - success: false, - message: "해당 회사를 찾을 수 없습니다.", - errorCode: "COMPANY_NOT_FOUND", - }); - return; - } - - // 회사 삭제 - const deleteQuery = ` - DELETE FROM company_mng - WHERE company_code = $1 - `; - - await client.query(deleteQuery, [companyCode]); - - logger.info("회사 삭제 성공", { - companyCode, - companyName: checkResult.rows[0].company_name, + if (!existingCompany) { + res.status(404).json({ + success: false, + message: "해당 회사를 찾을 수 없습니다.", + errorCode: "COMPANY_NOT_FOUND", }); - - const response = { - success: true, - message: "회사가 삭제되었습니다.", - data: { - company_code: companyCode, - company_name: checkResult.rows[0].company_name, - }, - }; - - res.status(200).json(response); - } finally { - await client.end(); + return; } + + // Prisma ORM으로 회사 삭제 + await prisma.company_mng.delete({ + where: { + company_code: companyCode, + }, + }); + + logger.info("회사 삭제 성공", { + companyCode, + companyName: existingCompany.company_name, + }); + + const response = { + success: true, + message: "회사가 삭제되었습니다.", + data: { + company_code: companyCode, + company_name: existingCompany.company_name, + }, + }; + + res.status(200).json(response); } catch (error) { logger.error("회사 삭제 실패", { error }); res.status(500).json({ @@ -2816,143 +2688,144 @@ export const updateProfile = async ( export const resetUserPassword = async ( req: AuthenticatedRequest, res: Response -) => { +): Promise => { + const { userId, newPassword } = req.body; + + logger.info("비밀번호 초기화 요청", { userId, user: req.user }); + + // 입력값 검증 + if (!userId || !userId.trim()) { + res.status(400).json({ + result: false, + msg: "사용자 ID가 필요합니다.", + }); + return; + } + + if (!newPassword || !newPassword.trim()) { + res.status(400).json({ + success: false, + result: false, + message: "새 비밀번호가 필요합니다.", + msg: "새 비밀번호가 필요합니다.", + }); + return; + } + + // 비밀번호 길이 검증 (최소 4자) + if (newPassword.length < 4) { + res.status(400).json({ + success: false, + result: false, + message: "비밀번호는 최소 4자 이상이어야 합니다.", + msg: "비밀번호는 최소 4자 이상이어야 합니다.", + }); + return; + } + + // 복잡한 암호화 로직은 직접 쿼리 사용 + const client = new Client({ connectionString: config.databaseUrl }); + try { - const { userId, newPassword } = req.body; + // 1. Prisma ORM으로 사용자 존재 여부 확인 + const currentUser = await prisma.user_info.findUnique({ + where: { + user_id: userId, + }, + select: { + user_id: true, + user_name: true, + }, + }); - logger.info("비밀번호 초기화 요청", { userId, user: req.user }); - - // 입력값 검증 - if (!userId || !userId.trim()) { - res.status(400).json({ - result: false, - msg: "사용자 ID가 필요합니다.", - }); - return; - } - - if (!newPassword || !newPassword.trim()) { - res.status(400).json({ + if (!currentUser) { + res.status(404).json({ success: false, result: false, - message: "새 비밀번호가 필요합니다.", - msg: "새 비밀번호가 필요합니다.", + message: "사용자를 찾을 수 없습니다.", + msg: "사용자를 찾을 수 없습니다.", }); return; } - // 비밀번호 길이 검증 (최소 4자) - if (newPassword.length < 4) { - res.status(400).json({ - success: false, - result: false, - message: "비밀번호는 최소 4자 이상이어야 합니다.", - msg: "비밀번호는 최소 4자 이상이어야 합니다.", - }); - return; - } + await client.connect(); - const client = new Client({ connectionString: config.databaseUrl }); + // 2. 비밀번호 암호화 (기존 Java 로직과 동일) + let encryptedPassword: string; try { - await client.connect(); + // EncryptUtil과 동일한 암호화 사용 + const crypto = require("crypto"); + const keyName = "ILJIAESSECRETKEY"; + const algorithm = "aes-128-ecb"; - // 1. 사용자 존재 여부 확인 - const userCheckResult = await client.query( - "SELECT user_id, user_name FROM user_info WHERE user_id = $1", - [userId] - ); + // AES-128-ECB 암호화 + const cipher = crypto.createCipher(algorithm, keyName); + let encrypted = cipher.update(newPassword, "utf8", "hex"); + encrypted += cipher.final("hex"); + encryptedPassword = encrypted.toUpperCase(); + } catch (encryptError) { + logger.error("비밀번호 암호화 중 오류 발생", { + error: encryptError, + userId, + }); + res.status(500).json({ + success: false, + result: false, + message: "비밀번호 암호화 중 오류가 발생했습니다.", + msg: "비밀번호 암호화 중 오류가 발생했습니다.", + }); + return; + } - if (userCheckResult.rows.length === 0) { - res.status(404).json({ - success: false, - result: false, - message: "사용자를 찾을 수 없습니다.", - msg: "사용자를 찾을 수 없습니다.", - }); - return; - } + // 3. 비밀번호 업데이트 실행 + const updateResult = await client.query( + "UPDATE user_info SET user_password = $1 WHERE user_id = $2", + [encryptedPassword, userId] + ); - const currentUser = userCheckResult.rows[0]; - - // 2. 비밀번호 암호화 (기존 Java 로직과 동일) - let encryptedPassword: string; + if (updateResult.rowCount && updateResult.rowCount > 0) { + // 4. 이력 저장 (선택적) try { - // EncryptUtil과 동일한 암호화 사용 - const crypto = require("crypto"); - const keyName = "ILJIAESSECRETKEY"; - const algorithm = "aes-128-ecb"; - - // AES-128-ECB 암호화 - const cipher = crypto.createCipher(algorithm, keyName); - let encrypted = cipher.update(newPassword, "utf8", "hex"); - encrypted += cipher.final("hex"); - encryptedPassword = encrypted.toUpperCase(); - } catch (encryptError) { - logger.error("비밀번호 암호화 중 오류 발생", { - error: encryptError, - userId, - }); - res.status(500).json({ - success: false, - result: false, - message: "비밀번호 암호화 중 오류가 발생했습니다.", - msg: "비밀번호 암호화 중 오류가 발생했습니다.", - }); - return; - } - - // 3. 비밀번호 업데이트 실행 - const updateResult = await client.query( - "UPDATE user_info SET user_password = $1 WHERE user_id = $2", - [encryptedPassword, userId] - ); - - if (updateResult.rowCount && updateResult.rowCount > 0) { - // 4. 이력 저장 (선택적) - try { - const writer = req.user?.userId || "system"; - await client.query( - ` + const writer = req.user?.userId || "system"; + await client.query( + ` INSERT INTO user_info_history (sabun, user_id, user_name, dept_code, dept_name, user_type_name, history_type, writer, regdate, status) VALUES ('', $1, $2, '', '', '', '비밀번호 초기화', $3, NOW(), '') `, - [userId, currentUser.user_name || userId, writer] - ); - } catch (historyError) { - logger.warn("비밀번호 초기화 이력 저장 실패", { - error: historyError, - userId, - }); - // 이력 저장 실패해도 비밀번호 초기화는 성공으로 처리 - } - - logger.info("비밀번호 초기화 성공", { + [userId, currentUser.user_name || userId, writer] + ); + } catch (historyError) { + logger.warn("비밀번호 초기화 이력 저장 실패", { + error: historyError, userId, - updatedBy: req.user?.userId, - }); - - res.json({ - success: true, - result: true, - message: "비밀번호가 성공적으로 초기화되었습니다.", - msg: "비밀번호가 성공적으로 초기화되었습니다.", - }); - } else { - res.status(400).json({ - success: false, - result: false, - message: "사용자 정보를 찾을 수 없거나 비밀번호 변경에 실패했습니다.", - msg: "사용자 정보를 찾을 수 없거나 비밀번호 변경에 실패했습니다.", }); + // 이력 저장 실패해도 비밀번호 초기화는 성공으로 처리 } - } finally { - await client.end(); + + logger.info("비밀번호 초기화 성공", { + userId, + updatedBy: req.user?.userId, + }); + + res.json({ + success: true, + result: true, + message: "비밀번호가 성공적으로 초기화되었습니다.", + msg: "비밀번호가 성공적으로 초기화되었습니다.", + }); + } else { + res.status(400).json({ + success: false, + result: false, + message: "사용자 정보를 찾을 수 없거나 비밀번호 변경에 실패했습니다.", + msg: "사용자 정보를 찾을 수 없거나 비밀번호 변경에 실패했습니다.", + }); } } catch (error) { logger.error("비밀번호 초기화 중 오류 발생", { error, - userId: req.body.userId, + userId, }); res.status(500).json({ success: false, @@ -2960,5 +2833,7 @@ export const resetUserPassword = async ( message: "비밀번호 초기화 중 시스템 오류가 발생했습니다.", msg: "비밀번호 초기화 중 시스템 오류가 발생했습니다.", }); + } finally { + await client.end(); } }; diff --git a/backend-node/src/controllers/multilangController.ts b/backend-node/src/controllers/multilangController.ts index ab1c395c..14155f86 100644 --- a/backend-node/src/controllers/multilangController.ts +++ b/backend-node/src/controllers/multilangController.ts @@ -2,7 +2,6 @@ import { Request, Response } from "express"; import { logger } from "../utils/logger"; import { AuthenticatedRequest } from "../types/auth"; import { MultiLangService } from "../services/multilangService"; -import { Client } from "pg"; import { CreateLanguageRequest, UpdateLanguageRequest, @@ -25,29 +24,16 @@ export const getLanguages = async ( try { logger.info("언어 목록 조회 요청", { user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + const languages = await multiLangService.getLanguages(); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "언어 목록 조회 성공", + data: languages, + }; - try { - const multiLangService = new MultiLangService(client); - const languages = await multiLangService.getLanguages(); - - const response: ApiResponse = { - success: true, - message: "언어 목록 조회 성공", - data: languages, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("언어 목록 조회 실패:", error); res.status(500).json({ @@ -90,33 +76,20 @@ export const createLanguage = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + const createdLanguage = await multiLangService.createLanguage({ + ...languageData, + createdBy: req.user?.userId || "system", + updatedBy: req.user?.userId || "system", }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "언어가 성공적으로 생성되었습니다.", + data: createdLanguage, + }; - try { - const multiLangService = new MultiLangService(client); - const createdLanguage = await multiLangService.createLanguage({ - ...languageData, - createdBy: req.user?.userId || "system", - updatedBy: req.user?.userId || "system", - }); - - const response: ApiResponse = { - success: true, - message: "언어가 성공적으로 생성되었습니다.", - data: createdLanguage, - }; - - res.status(201).json(response); - } finally { - await client.end(); - } + res.status(201).json(response); } catch (error) { logger.error("언어 생성 실패:", error); res.status(500).json({ @@ -144,32 +117,19 @@ export const updateLanguage = async ( logger.info("언어 수정 요청", { langCode, languageData, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + const updatedLanguage = await multiLangService.updateLanguage(langCode, { + ...languageData, + updatedBy: req.user?.userId || "system", }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "언어가 성공적으로 수정되었습니다.", + data: updatedLanguage, + }; - try { - const multiLangService = new MultiLangService(client); - const updatedLanguage = await multiLangService.updateLanguage(langCode, { - ...languageData, - updatedBy: req.user?.userId || "system", - }); - - const response: ApiResponse = { - success: true, - message: "언어가 성공적으로 수정되었습니다.", - data: updatedLanguage, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("언어 수정 실패:", error); res.status(500).json({ @@ -195,29 +155,16 @@ export const toggleLanguage = async ( const { langCode } = req.params; logger.info("언어 상태 토글 요청", { langCode, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + const result = await multiLangService.toggleLanguage(langCode); - await client.connect(); + const response: ApiResponse = { + success: true, + message: `언어가 ${result}되었습니다.`, + data: result, + }; - try { - const multiLangService = new MultiLangService(client); - const result = await multiLangService.toggleLanguage(langCode); - - const response: ApiResponse = { - success: true, - message: `언어가 ${result}되었습니다.`, - data: result, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("언어 상태 토글 실패:", error); res.status(500).json({ @@ -246,34 +193,21 @@ export const getLangKeys = async ( user: req.user, }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + const langKeys = await multiLangService.getLangKeys({ + companyCode: companyCode as string, + menuCode: menuCode as string, + keyType: keyType as string, + searchText: searchText as string, }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "다국어 키 목록 조회 성공", + data: langKeys, + }; - try { - const multiLangService = new MultiLangService(client); - const langKeys = await multiLangService.getLangKeys({ - companyCode: companyCode as string, - menuCode: menuCode as string, - keyType: keyType as string, - searchText: searchText as string, - }); - - const response: ApiResponse = { - success: true, - message: "다국어 키 목록 조회 성공", - data: langKeys, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 키 목록 조회 실패:", error); res.status(500).json({ @@ -299,29 +233,16 @@ export const getLangTexts = async ( const { keyId } = req.params; logger.info("다국어 텍스트 조회 요청", { keyId, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + const langTexts = await multiLangService.getLangTexts(parseInt(keyId)); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "다국어 텍스트 조회 성공", + data: langTexts, + }; - try { - const multiLangService = new MultiLangService(client); - const langTexts = await multiLangService.getLangTexts(parseInt(keyId)); - - const response: ApiResponse = { - success: true, - message: "다국어 텍스트 조회 성공", - data: langTexts, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 텍스트 조회 실패:", error); res.status(500).json({ @@ -360,33 +281,20 @@ export const createLangKey = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + const keyId = await multiLangService.createLangKey({ + ...keyData, + createdBy: req.user?.userId || "system", + updatedBy: req.user?.userId || "system", }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "다국어 키가 성공적으로 생성되었습니다.", + data: keyId, + }; - try { - const multiLangService = new MultiLangService(client); - const keyId = await multiLangService.createLangKey({ - ...keyData, - createdBy: req.user?.userId || "system", - updatedBy: req.user?.userId || "system", - }); - - const response: ApiResponse = { - success: true, - message: "다국어 키가 성공적으로 생성되었습니다.", - data: keyId, - }; - - res.status(201).json(response); - } finally { - await client.end(); - } + res.status(201).json(response); } catch (error) { logger.error("다국어 키 생성 실패:", error); res.status(500).json({ @@ -414,32 +322,19 @@ export const updateLangKey = async ( logger.info("다국어 키 수정 요청", { keyId, keyData, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + await multiLangService.updateLangKey(parseInt(keyId), { + ...keyData, + updatedBy: req.user?.userId || "system", }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "다국어 키가 성공적으로 수정되었습니다.", + data: "수정 완료", + }; - try { - const multiLangService = new MultiLangService(client); - await multiLangService.updateLangKey(parseInt(keyId), { - ...keyData, - updatedBy: req.user?.userId || "system", - }); - - const response: ApiResponse = { - success: true, - message: "다국어 키가 성공적으로 수정되었습니다.", - data: "수정 완료", - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 키 수정 실패:", error); res.status(500).json({ @@ -465,29 +360,16 @@ export const deleteLangKey = async ( const { keyId } = req.params; logger.info("다국어 키 삭제 요청", { keyId, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + await multiLangService.deleteLangKey(parseInt(keyId)); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "다국어 키가 성공적으로 삭제되었습니다.", + data: "삭제 완료", + }; - try { - const multiLangService = new MultiLangService(client); - await multiLangService.deleteLangKey(parseInt(keyId)); - - const response: ApiResponse = { - success: true, - message: "다국어 키가 성공적으로 삭제되었습니다.", - data: "삭제 완료", - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 키 삭제 실패:", error); res.status(500).json({ @@ -513,29 +395,16 @@ export const toggleLangKey = async ( const { keyId } = req.params; logger.info("다국어 키 상태 토글 요청", { keyId, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + const result = await multiLangService.toggleLangKey(parseInt(keyId)); - await client.connect(); + const response: ApiResponse = { + success: true, + message: `다국어 키가 ${result}되었습니다.`, + data: result, + }; - try { - const multiLangService = new MultiLangService(client); - const result = await multiLangService.toggleLangKey(parseInt(keyId)); - - const response: ApiResponse = { - success: true, - message: `다국어 키가 ${result}되었습니다.`, - data: result, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 키 상태 토글 실패:", error); res.status(500).json({ @@ -580,35 +449,22 @@ export const saveLangTexts = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + await multiLangService.saveLangTexts(parseInt(keyId), { + texts: textData.texts.map((text) => ({ + ...text, + createdBy: req.user?.userId || "system", + updatedBy: req.user?.userId || "system", + })), }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "다국어 텍스트가 성공적으로 저장되었습니다.", + data: "저장 완료", + }; - try { - const multiLangService = new MultiLangService(client); - await multiLangService.saveLangTexts(parseInt(keyId), { - texts: textData.texts.map((text) => ({ - ...text, - createdBy: req.user?.userId || "system", - updatedBy: req.user?.userId || "system", - })), - }); - - const response: ApiResponse = { - success: true, - message: "다국어 텍스트가 성공적으로 저장되었습니다.", - data: "저장 완료", - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 텍스트 저장 실패:", error); res.status(500).json({ @@ -654,34 +510,21 @@ export const getUserText = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + const langText = await multiLangService.getUserText({ + companyCode, + menuCode, + langKey, + userLang: userLang as string, }); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "사용자별 다국어 텍스트 조회 성공", + data: langText, + }; - try { - const multiLangService = new MultiLangService(client); - const langText = await multiLangService.getUserText({ - companyCode, - menuCode, - langKey, - userLang: userLang as string, - }); - - const response: ApiResponse = { - success: true, - message: "사용자별 다국어 텍스트 조회 성공", - data: langText, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("사용자별 다국어 텍스트 조회 실패:", error); res.status(500).json({ @@ -713,33 +556,20 @@ export const getLangText = async ( user: req.user, }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + const langText = await multiLangService.getLangText( + companyCode, + langKey, + langCode + ); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "특정 키의 다국어 텍스트 조회 성공", + data: langText, + }; - try { - const multiLangService = new MultiLangService(client); - const langText = await multiLangService.getLangText( - companyCode, - langKey, - langCode - ); - - const response: ApiResponse = { - success: true, - message: "특정 키의 다국어 텍스트 조회 성공", - data: langText, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("특정 키의 다국어 텍스트 조회 실패:", error); res.status(500).json({ @@ -777,29 +607,16 @@ export const deleteLanguage = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); + const multiLangService = new MultiLangService(); + await multiLangService.deleteLanguage(langCode); - await client.connect(); + const response: ApiResponse = { + success: true, + message: "언어가 성공적으로 삭제되었습니다.", + data: "삭제 완료", + }; - try { - const multiLangService = new MultiLangService(client); - await multiLangService.deleteLanguage(langCode); - - const response: ApiResponse = { - success: true, - message: "언어가 성공적으로 삭제되었습니다.", - data: "삭제 완료", - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("언어 삭제 실패:", error); res.status(500).json({ @@ -866,34 +683,21 @@ export const getBatchTranslations = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + const multiLangService = new MultiLangService(); + const translations = await multiLangService.getBatchTranslations({ + companyCode: finalCompanyCode as string, + menuCode: finalMenuCode as string, + userLang: finalUserLang as string, + langKeys, }); - await client.connect(); + const response: ApiResponse> = { + success: true, + message: "다국어 텍스트 배치 조회 성공", + data: translations, + }; - try { - const multiLangService = new MultiLangService(client); - const translations = await multiLangService.getBatchTranslations({ - companyCode: finalCompanyCode as string, - menuCode: finalMenuCode as string, - userLang: finalUserLang as string, - langKeys, - }); - - const response: ApiResponse> = { - success: true, - message: "다국어 텍스트 배치 조회 성공", - data: translations, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 텍스트 배치 조회 실패:", error); res.status(500).json({ diff --git a/backend-node/src/controllers/tableManagementController.ts b/backend-node/src/controllers/tableManagementController.ts index 10c38831..cf54176a 100644 --- a/backend-node/src/controllers/tableManagementController.ts +++ b/backend-node/src/controllers/tableManagementController.ts @@ -2,7 +2,6 @@ import { Request, Response } from "express"; import { logger } from "../utils/logger"; import { AuthenticatedRequest } from "../types/auth"; import { ApiResponse } from "../types/common"; -import { Client } from "pg"; import { TableManagementService } from "../services/tableManagementService"; import { TableInfo, @@ -23,29 +22,18 @@ export async function getTableList( try { logger.info("=== 테이블 목록 조회 시작 ==="); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: process.env.DATABASE_URL, - }); + const tableManagementService = new TableManagementService(); + const tableList = await tableManagementService.getTableList(); - await client.connect(); + logger.info(`테이블 목록 조회 결과: ${tableList.length}개`); - try { - const tableManagementService = new TableManagementService(client); - const tableList = await tableManagementService.getTableList(); + const response: ApiResponse = { + success: true, + message: "테이블 목록을 성공적으로 조회했습니다.", + data: tableList, + }; - logger.info(`테이블 목록 조회 결과: ${tableList.length}개`); - - const response: ApiResponse = { - success: true, - message: "테이블 목록을 성공적으로 조회했습니다.", - data: tableList, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("테이블 목록 조회 중 오류 발생:", error); @@ -86,29 +74,18 @@ export async function getColumnList( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: process.env.DATABASE_URL, - }); + const tableManagementService = new TableManagementService(); + const columnList = await tableManagementService.getColumnList(tableName); - await client.connect(); + logger.info(`컬럼 정보 조회 결과: ${tableName}, ${columnList.length}개`); - try { - const tableManagementService = new TableManagementService(client); - const columnList = await tableManagementService.getColumnList(tableName); + const response: ApiResponse = { + success: true, + message: "컬럼 목록을 성공적으로 조회했습니다.", + data: columnList, + }; - logger.info(`컬럼 정보 조회 결과: ${tableName}, ${columnList.length}개`); - - const response: ApiResponse = { - success: true, - message: "컬럼 목록을 성공적으로 조회했습니다.", - data: columnList, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("컬럼 정보 조회 중 오류 발생:", error); @@ -164,32 +141,21 @@ export async function updateColumnSettings( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: process.env.DATABASE_URL, - }); + const tableManagementService = new TableManagementService(); + await tableManagementService.updateColumnSettings( + tableName, + columnName, + settings + ); - await client.connect(); + logger.info(`컬럼 설정 업데이트 완료: ${tableName}.${columnName}`); - try { - const tableManagementService = new TableManagementService(client); - await tableManagementService.updateColumnSettings( - tableName, - columnName, - settings - ); + const response: ApiResponse = { + success: true, + message: "컬럼 설정을 성공적으로 저장했습니다.", + }; - logger.info(`컬럼 설정 업데이트 완료: ${tableName}.${columnName}`); - - const response: ApiResponse = { - success: true, - message: "컬럼 설정을 성공적으로 저장했습니다.", - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("컬럼 설정 업데이트 중 오류 발생:", error); @@ -245,33 +211,22 @@ export async function updateAllColumnSettings( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: process.env.DATABASE_URL, - }); + const tableManagementService = new TableManagementService(); + await tableManagementService.updateAllColumnSettings( + tableName, + columnSettings + ); - await client.connect(); + logger.info( + `전체 컬럼 설정 일괄 업데이트 완료: ${tableName}, ${columnSettings.length}개` + ); - try { - const tableManagementService = new TableManagementService(client); - await tableManagementService.updateAllColumnSettings( - tableName, - columnSettings - ); + const response: ApiResponse = { + success: true, + message: "모든 컬럼 설정을 성공적으로 저장했습니다.", + }; - logger.info( - `전체 컬럼 설정 일괄 업데이트 완료: ${tableName}, ${columnSettings.length}개` - ); - - const response: ApiResponse = { - success: true, - message: "모든 컬럼 설정을 성공적으로 저장했습니다.", - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("전체 컬럼 설정 일괄 업데이트 중 오류 발생:", error); @@ -312,43 +267,31 @@ export async function getTableLabels( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: process.env.DATABASE_URL, - }); + const tableManagementService = new TableManagementService(); + const tableLabels = await tableManagementService.getTableLabels(tableName); - await client.connect(); - - try { - const tableManagementService = new TableManagementService(client); - const tableLabels = - await tableManagementService.getTableLabels(tableName); - - if (!tableLabels) { - const response: ApiResponse = { - success: false, - message: "테이블 라벨 정보를 찾을 수 없습니다.", - error: { - code: "TABLE_LABELS_NOT_FOUND", - details: `테이블 ${tableName}의 라벨 정보가 존재하지 않습니다.`, - }, - }; - res.status(404).json(response); - return; - } - - logger.info(`테이블 라벨 정보 조회 완료: ${tableName}`); - - const response: ApiResponse = { - success: true, - message: "테이블 라벨 정보를 성공적으로 조회했습니다.", - data: tableLabels, + if (!tableLabels) { + const response: ApiResponse = { + success: false, + message: "테이블 라벨 정보를 찾을 수 없습니다.", + error: { + code: "TABLE_LABELS_NOT_FOUND", + details: `테이블 ${tableName}의 라벨 정보가 존재하지 않습니다.`, + }, }; - - res.status(200).json(response); - } finally { - await client.end(); + res.status(404).json(response); + return; } + + logger.info(`테이블 라벨 정보 조회 완료: ${tableName}`); + + const response: ApiResponse = { + success: true, + message: "테이블 라벨 정보를 성공적으로 조회했습니다.", + data: tableLabels, + }; + + res.status(200).json(response); } catch (error) { logger.error("테이블 라벨 정보 조회 중 오류 발생:", error); @@ -389,45 +332,34 @@ export async function getColumnLabels( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: process.env.DATABASE_URL, - }); + const tableManagementService = new TableManagementService(); + const columnLabels = await tableManagementService.getColumnLabels( + tableName, + columnName + ); - await client.connect(); - - try { - const tableManagementService = new TableManagementService(client); - const columnLabels = await tableManagementService.getColumnLabels( - tableName, - columnName - ); - - if (!columnLabels) { - const response: ApiResponse = { - success: false, - message: "컬럼 라벨 정보를 찾을 수 없습니다.", - error: { - code: "COLUMN_LABELS_NOT_FOUND", - details: `컬럼 ${tableName}.${columnName}의 라벨 정보가 존재하지 않습니다.`, - }, - }; - res.status(404).json(response); - return; - } - - logger.info(`컬럼 라벨 정보 조회 완료: ${tableName}.${columnName}`); - - const response: ApiResponse = { - success: true, - message: "컬럼 라벨 정보를 성공적으로 조회했습니다.", - data: columnLabels, + if (!columnLabels) { + const response: ApiResponse = { + success: false, + message: "컬럼 라벨 정보를 찾을 수 없습니다.", + error: { + code: "COLUMN_LABELS_NOT_FOUND", + details: `컬럼 ${tableName}.${columnName}의 라벨 정보가 존재하지 않습니다.`, + }, }; - - res.status(200).json(response); - } finally { - await client.end(); + res.status(404).json(response); + return; } + + logger.info(`컬럼 라벨 정보 조회 완료: ${tableName}.${columnName}`); + + const response: ApiResponse = { + success: true, + message: "컬럼 라벨 정보를 성공적으로 조회했습니다.", + data: columnLabels, + }; + + res.status(200).json(response); } catch (error) { logger.error("컬럼 라벨 정보 조회 중 오류 발생:", error); diff --git a/backend-node/src/services/multilangService.ts b/backend-node/src/services/multilangService.ts index 00f72439..742bb2e9 100644 --- a/backend-node/src/services/multilangService.ts +++ b/backend-node/src/services/multilangService.ts @@ -1,4 +1,4 @@ -import { Client } from "pg"; +import { PrismaClient } from "@prisma/client"; import { logger } from "../utils/logger"; import { Language, @@ -15,12 +15,10 @@ import { ApiResponse, } from "../types/multilang"; -export class MultiLangService { - private client: Client; +const prisma = new PrismaClient(); - constructor(client: Client) { - this.client = client; - } +export class MultiLangService { + constructor() {} /** * 언어 목록 조회 @@ -29,30 +27,35 @@ export class MultiLangService { try { logger.info("언어 목록 조회 시작"); - const query = ` - SELECT - lang_code as "langCode", - lang_name as "langName", - lang_native as "langNative", - is_active as "isActive", - sort_order as "sortOrder", - created_date as "createdDate", - created_by as "createdBy", - updated_date as "updatedDate", - updated_by as "updatedBy" - FROM language_master - ORDER BY sort_order, lang_code - `; + const languages = await prisma.language_master.findMany({ + orderBy: [{ sort_order: "asc" }, { lang_code: "asc" }], + select: { + lang_code: true, + lang_name: true, + lang_native: true, + is_active: true, + sort_order: true, + created_date: true, + created_by: true, + updated_date: true, + updated_by: true, + }, + }); - const result = await this.client.query(query); - const languages = result.rows.map((row) => ({ - ...row, - createdDate: row.createdDate ? new Date(row.createdDate) : undefined, - updatedDate: row.updatedDate ? new Date(row.updatedDate) : undefined, + const mappedLanguages: Language[] = languages.map((lang) => ({ + langCode: lang.lang_code, + langName: lang.lang_name, + langNative: lang.lang_native, + isActive: lang.is_active || "N", + sortOrder: lang.sort_order ?? undefined, + createdDate: lang.created_date || undefined, + createdBy: lang.created_by || undefined, + updatedDate: lang.updated_date || undefined, + updatedBy: lang.updated_by || undefined, })); - logger.info(`언어 목록 조회 완료: ${languages.length}개`); - return languages; + logger.info(`언어 목록 조회 완료: ${mappedLanguages.length}개`); + return mappedLanguages; } catch (error) { logger.error("언어 목록 조회 중 오류 발생:", error); throw new Error( @@ -69,40 +72,28 @@ export class MultiLangService { logger.info("언어 생성 시작", { languageData }); // 중복 체크 - const duplicateCheckQuery = ` - SELECT lang_code FROM language_master WHERE lang_code = $1 - `; - const duplicateResult = await this.client.query(duplicateCheckQuery, [ - languageData.langCode, - ]); + const existingLanguage = await prisma.language_master.findUnique({ + where: { lang_code: languageData.langCode }, + }); - if (duplicateResult.rows.length > 0) { + if (existingLanguage) { throw new Error( `이미 존재하는 언어 코드입니다: ${languageData.langCode}` ); } // 언어 생성 - const insertQuery = ` - INSERT INTO language_master ( - lang_code, lang_name, lang_native, is_active, sort_order, - created_date, created_by, updated_date, updated_by - ) VALUES ($1, $2, $3, $4, $5, now(), $6, now(), $7) - RETURNING * - `; - - const insertValues = [ - languageData.langCode, - languageData.langName, - languageData.langNative, - languageData.isActive || "Y", - languageData.sortOrder || 0, - languageData.createdBy || "system", - languageData.updatedBy || "system", - ]; - - const result = await this.client.query(insertQuery, insertValues); - const createdLanguage = result.rows[0]; + const createdLanguage = await prisma.language_master.create({ + data: { + lang_code: languageData.langCode, + lang_name: languageData.langName, + lang_native: languageData.langNative, + is_active: languageData.isActive || "Y", + sort_order: languageData.sortOrder || 0, + created_by: languageData.createdBy || "system", + updated_by: languageData.updatedBy || "system", + }, + }); logger.info("언어 생성 완료", { langCode: createdLanguage.lang_code }); @@ -110,16 +101,12 @@ export class MultiLangService { langCode: createdLanguage.lang_code, langName: createdLanguage.lang_name, langNative: createdLanguage.lang_native, - isActive: createdLanguage.is_active, - sortOrder: createdLanguage.sort_order, - createdDate: createdLanguage.created_date - ? new Date(createdLanguage.created_date) - : undefined, - createdBy: createdLanguage.created_by, - updatedDate: createdLanguage.updated_date - ? new Date(createdLanguage.updated_date) - : undefined, - updatedBy: createdLanguage.updated_by, + isActive: createdLanguage.is_active || "N", + sortOrder: createdLanguage.sort_order ?? undefined, + createdDate: createdLanguage.created_date || undefined, + createdBy: createdLanguage.created_by || undefined, + updatedDate: createdLanguage.updated_date || undefined, + updatedBy: createdLanguage.updated_by || undefined, }; } catch (error) { logger.error("언어 생성 중 오류 발생:", error); @@ -140,40 +127,29 @@ export class MultiLangService { logger.info("언어 수정 시작", { langCode, languageData }); // 기존 언어 확인 - const checkQuery = ` - SELECT * FROM language_master WHERE lang_code = $1 - `; - const checkResult = await this.client.query(checkQuery, [langCode]); + const existingLanguage = await prisma.language_master.findUnique({ + where: { lang_code: langCode }, + }); - if (checkResult.rows.length === 0) { + if (!existingLanguage) { throw new Error(`언어를 찾을 수 없습니다: ${langCode}`); } // 언어 수정 - const updateQuery = ` - UPDATE language_master - SET - lang_name = COALESCE($2, lang_name), - lang_native = COALESCE($3, lang_native), - is_active = COALESCE($4, is_active), - sort_order = COALESCE($5, sort_order), - updated_date = now(), - updated_by = $6 - WHERE lang_code = $1 - RETURNING * - `; - - const updateValues = [ - langCode, - languageData.langName, - languageData.langNative, - languageData.isActive, - languageData.sortOrder, - languageData.updatedBy || "system", - ]; - - const result = await this.client.query(updateQuery, updateValues); - const updatedLanguage = result.rows[0]; + const updatedLanguage = await prisma.language_master.update({ + where: { lang_code: langCode }, + data: { + ...(languageData.langName && { lang_name: languageData.langName }), + ...(languageData.langNative && { + lang_native: languageData.langNative, + }), + ...(languageData.isActive && { is_active: languageData.isActive }), + ...(languageData.sortOrder !== undefined && { + sort_order: languageData.sortOrder, + }), + updated_by: languageData.updatedBy || "system", + }, + }); logger.info("언어 수정 완료", { langCode }); @@ -181,16 +157,12 @@ export class MultiLangService { langCode: updatedLanguage.lang_code, langName: updatedLanguage.lang_name, langNative: updatedLanguage.lang_native, - isActive: updatedLanguage.is_active, - sortOrder: updatedLanguage.sort_order, - createdDate: updatedLanguage.created_date - ? new Date(updatedLanguage.created_date) - : undefined, - createdBy: updatedLanguage.created_by, - updatedDate: updatedLanguage.updated_date - ? new Date(updatedLanguage.updated_date) - : undefined, - updatedBy: updatedLanguage.updated_by, + isActive: updatedLanguage.is_active || "N", + sortOrder: updatedLanguage.sort_order ?? undefined, + createdDate: updatedLanguage.created_date || undefined, + createdBy: updatedLanguage.created_by || undefined, + updatedDate: updatedLanguage.updated_date || undefined, + updatedBy: updatedLanguage.updated_by || undefined, }; } catch (error) { logger.error("언어 수정 중 오류 발생:", error); @@ -207,27 +179,26 @@ export class MultiLangService { try { logger.info("언어 상태 토글 시작", { langCode }); - // 현재 상태 조회 - const currentQuery = ` - SELECT is_active FROM language_master WHERE lang_code = $1 - `; - const currentResult = await this.client.query(currentQuery, [langCode]); + // 현재 언어 조회 + const currentLanguage = await prisma.language_master.findUnique({ + where: { lang_code: langCode }, + select: { is_active: true }, + }); - if (currentResult.rows.length === 0) { + if (!currentLanguage) { throw new Error(`언어를 찾을 수 없습니다: ${langCode}`); } - const currentStatus = currentResult.rows[0].is_active; - const newStatus = currentStatus === "Y" ? "N" : "Y"; + const newStatus = currentLanguage.is_active === "Y" ? "N" : "Y"; // 상태 업데이트 - const updateQuery = ` - UPDATE language_master - SET is_active = $2, updated_date = now(), updated_by = 'system' - WHERE lang_code = $1 - `; - - await this.client.query(updateQuery, [langCode, newStatus]); + await prisma.language_master.update({ + where: { lang_code: langCode }, + data: { + is_active: newStatus, + updated_by: "system", + }, + }); const result = newStatus === "Y" ? "활성화" : "비활성화"; logger.info("언어 상태 토글 완료", { langCode, result }); @@ -248,62 +219,63 @@ export class MultiLangService { try { logger.info("다국어 키 목록 조회 시작", { params }); - let query = ` - SELECT - key_id as "keyId", - company_code as "companyCode", - menu_name as "menuName", - lang_key as "langKey", - description, - is_active as "isActive", - created_date as "createdDate", - created_by as "createdBy", - updated_date as "updatedDate", - updated_by as "updatedBy" - FROM multi_lang_key_master - WHERE 1=1 - `; - - const queryParams: any[] = []; - let paramIndex = 1; + const whereConditions: any = {}; // 회사 코드 필터 if (params.companyCode) { - query += ` AND company_code = $${paramIndex}`; - queryParams.push(params.companyCode); - paramIndex++; + whereConditions.company_code = params.companyCode; } // 메뉴 코드 필터 if (params.menuCode) { - query += ` AND menu_name = $${paramIndex}`; - queryParams.push(params.menuCode); - paramIndex++; + whereConditions.menu_name = params.menuCode; } // 검색 조건 if (params.searchText) { - query += ` AND ( - lang_key ILIKE $${paramIndex} OR - description ILIKE $${paramIndex} OR - menu_name ILIKE $${paramIndex} - )`; - queryParams.push(`%${params.searchText}%`); - paramIndex++; + whereConditions.OR = [ + { lang_key: { contains: params.searchText, mode: "insensitive" } }, + { description: { contains: params.searchText, mode: "insensitive" } }, + { menu_name: { contains: params.searchText, mode: "insensitive" } }, + ]; } - // 정렬 - query += ` ORDER BY company_code, menu_name, lang_key`; + const langKeys = await prisma.multi_lang_key_master.findMany({ + where: whereConditions, + orderBy: [ + { company_code: "asc" }, + { menu_name: "asc" }, + { lang_key: "asc" }, + ], + select: { + key_id: true, + company_code: true, + menu_name: true, + lang_key: true, + description: true, + is_active: true, + created_date: true, + created_by: true, + updated_date: true, + updated_by: true, + }, + }); - const result = await this.client.query(query, queryParams); - const langKeys = result.rows.map((row) => ({ - ...row, - createdDate: row.createdDate ? new Date(row.createdDate) : undefined, - updatedDate: row.updatedDate ? new Date(row.updatedDate) : undefined, + const mappedKeys: LangKey[] = langKeys.map((key) => ({ + keyId: key.key_id, + companyCode: key.company_code, + menuName: key.menu_name || undefined, + langKey: key.lang_key, + description: key.description || undefined, + isActive: key.is_active || "Y", + createdDate: key.created_date || undefined, + createdBy: key.created_by || undefined, + updatedDate: key.updated_date || undefined, + updatedBy: key.updated_by || undefined, })); - logger.info(`다국어 키 목록 조회 완료: ${langKeys.length}개`); - return langKeys; + logger.info(`다국어 키 목록 조회 완료: ${mappedKeys.length}개`); + return mappedKeys; } catch (error) { logger.error("다국어 키 목록 조회 중 오류 발생:", error); throw new Error( @@ -319,31 +291,39 @@ export class MultiLangService { try { logger.info("다국어 텍스트 조회 시작", { keyId }); - const query = ` - SELECT - text_id as "textId", - key_id as "keyId", - lang_code as "langCode", - lang_text as "langText", - is_active as "isActive", - created_date as "createdDate", - created_by as "createdBy", - updated_date as "updatedDate", - updated_by as "updatedBy" - FROM multi_lang_text - WHERE key_id = $1 AND is_active = 'Y' - ORDER BY lang_code - `; + const langTexts = await prisma.multi_lang_text.findMany({ + where: { + key_id: keyId, + is_active: "Y", + }, + orderBy: { lang_code: "asc" }, + select: { + text_id: true, + key_id: true, + lang_code: true, + lang_text: true, + is_active: true, + created_date: true, + created_by: true, + updated_date: true, + updated_by: true, + }, + }); - const result = await this.client.query(query, [keyId]); - const langTexts = result.rows.map((row) => ({ - ...row, - createdDate: row.createdDate ? new Date(row.createdDate) : undefined, - updatedDate: row.updatedDate ? new Date(row.updatedDate) : undefined, + const mappedTexts: LangText[] = langTexts.map((text) => ({ + textId: text.text_id, + keyId: text.key_id, + langCode: text.lang_code, + langText: text.lang_text, + isActive: text.is_active || "Y", + createdDate: text.created_date || undefined, + createdBy: text.created_by || undefined, + updatedDate: text.updated_date || undefined, + updatedBy: text.updated_by || undefined, })); - logger.info(`다국어 텍스트 조회 완료: ${langTexts.length}개`); - return langTexts; + logger.info(`다국어 텍스트 조회 완료: ${mappedTexts.length}개`); + return mappedTexts; } catch (error) { logger.error("다국어 텍스트 조회 중 오류 발생:", error); throw new Error( @@ -360,46 +340,38 @@ export class MultiLangService { logger.info("다국어 키 생성 시작", { keyData }); // 중복 체크 - const duplicateCheckQuery = ` - SELECT key_id FROM multi_lang_key_master - WHERE company_code = $1 AND lang_key = $2 - `; - const duplicateResult = await this.client.query(duplicateCheckQuery, [ - keyData.companyCode, - keyData.langKey, - ]); + const existingKey = await prisma.multi_lang_key_master.findFirst({ + where: { + company_code: keyData.companyCode, + lang_key: keyData.langKey, + }, + }); - if (duplicateResult.rows.length > 0) { + if (existingKey) { throw new Error( `동일한 회사에 이미 존재하는 언어키입니다: ${keyData.langKey}` ); } // 다국어 키 생성 - const insertQuery = ` - INSERT INTO multi_lang_key_master ( - company_code, menu_name, lang_key, description, is_active, - created_date, created_by, updated_date, updated_by - ) VALUES ($1, $2, $3, $4, $5, now(), $6, now(), $7) - RETURNING key_id - `; + const createdKey = await prisma.multi_lang_key_master.create({ + data: { + company_code: keyData.companyCode, + menu_name: keyData.menuName || null, + lang_key: keyData.langKey, + description: keyData.description || null, + is_active: keyData.isActive || "Y", + created_by: keyData.createdBy || "system", + updated_by: keyData.updatedBy || "system", + }, + }); - const insertValues = [ - keyData.companyCode, - keyData.menuName || null, - keyData.langKey, - keyData.description || null, - keyData.isActive || "Y", - keyData.createdBy || "system", - keyData.updatedBy || "system", - ]; + logger.info("다국어 키 생성 완료", { + keyId: createdKey.key_id, + langKey: keyData.langKey, + }); - const result = await this.client.query(insertQuery, insertValues); - const keyId = result.rows[0].key_id; - - logger.info("다국어 키 생성 완료", { keyId, langKey: keyData.langKey }); - - return keyId; + return createdKey.key_id; } catch (error) { logger.error("다국어 키 생성 중 오류 발생:", error); throw new Error( @@ -419,28 +391,25 @@ export class MultiLangService { logger.info("다국어 키 수정 시작", { keyId, keyData }); // 기존 키 확인 - const checkQuery = ` - SELECT key_id FROM multi_lang_key_master WHERE key_id = $1 - `; - const checkResult = await this.client.query(checkQuery, [keyId]); + const existingKey = await prisma.multi_lang_key_master.findUnique({ + where: { key_id: keyId }, + }); - if (checkResult.rows.length === 0) { + if (!existingKey) { throw new Error(`다국어 키를 찾을 수 없습니다: ${keyId}`); } // 중복 체크 (자신을 제외하고) if (keyData.companyCode && keyData.langKey) { - const duplicateCheckQuery = ` - SELECT key_id FROM multi_lang_key_master - WHERE company_code = $1 AND lang_key = $2 AND key_id != $3 - `; - const duplicateResult = await this.client.query(duplicateCheckQuery, [ - keyData.companyCode, - keyData.langKey, - keyId, - ]); + const duplicateKey = await prisma.multi_lang_key_master.findFirst({ + where: { + company_code: keyData.companyCode, + lang_key: keyData.langKey, + key_id: { not: keyId }, + }, + }); - if (duplicateResult.rows.length > 0) { + if (duplicateKey) { throw new Error( `동일한 회사에 이미 존재하는 언어키입니다: ${keyData.langKey}` ); @@ -448,28 +417,20 @@ export class MultiLangService { } // 다국어 키 수정 - const updateQuery = ` - UPDATE multi_lang_key_master - SET - company_code = COALESCE($2, company_code), - menu_name = COALESCE($3, menu_name), - lang_key = COALESCE($4, lang_key), - description = COALESCE($5, description), - updated_date = now(), - updated_by = $6 - WHERE key_id = $1 - `; - - const updateValues = [ - keyId, - keyData.companyCode, - keyData.menuName, - keyData.langKey, - keyData.description, - keyData.updatedBy || "system", - ]; - - await this.client.query(updateQuery, updateValues); + await prisma.multi_lang_key_master.update({ + where: { key_id: keyId }, + data: { + ...(keyData.companyCode && { company_code: keyData.companyCode }), + ...(keyData.menuName !== undefined && { + menu_name: keyData.menuName, + }), + ...(keyData.langKey && { lang_key: keyData.langKey }), + ...(keyData.description !== undefined && { + description: keyData.description, + }), + updated_by: keyData.updatedBy || "system", + }, + }); logger.info("다국어 키 수정 완료", { keyId }); } catch (error) { @@ -488,40 +449,28 @@ export class MultiLangService { logger.info("다국어 키 삭제 시작", { keyId }); // 기존 키 확인 - const checkQuery = ` - SELECT key_id FROM multi_lang_key_master WHERE key_id = $1 - `; - const checkResult = await this.client.query(checkQuery, [keyId]); + const existingKey = await prisma.multi_lang_key_master.findUnique({ + where: { key_id: keyId }, + }); - if (checkResult.rows.length === 0) { + if (!existingKey) { throw new Error(`다국어 키를 찾을 수 없습니다: ${keyId}`); } - // 트랜잭션 시작 - await this.client.query("BEGIN"); - - try { + // 트랜잭션으로 키와 연관된 텍스트 모두 삭제 + await prisma.$transaction(async (tx) => { // 관련된 다국어 텍스트 삭제 - const deleteTextsQuery = ` - DELETE FROM multi_lang_text WHERE key_id = $1 - `; - await this.client.query(deleteTextsQuery, [keyId]); + await tx.multi_lang_text.deleteMany({ + where: { key_id: keyId }, + }); // 다국어 키 삭제 - const deleteKeyQuery = ` - DELETE FROM multi_lang_key_master WHERE key_id = $1 - `; - await this.client.query(deleteKeyQuery, [keyId]); + await tx.multi_lang_key_master.delete({ + where: { key_id: keyId }, + }); + }); - // 트랜잭션 커밋 - await this.client.query("COMMIT"); - - logger.info("다국어 키 삭제 완료", { keyId }); - } catch (error) { - // 트랜잭션 롤백 - await this.client.query("ROLLBACK"); - throw error; - } + logger.info("다국어 키 삭제 완료", { keyId }); } catch (error) { logger.error("다국어 키 삭제 중 오류 발생:", error); throw new Error( @@ -537,27 +486,26 @@ export class MultiLangService { try { logger.info("다국어 키 상태 토글 시작", { keyId }); - // 현재 상태 조회 - const currentQuery = ` - SELECT is_active FROM multi_lang_key_master WHERE key_id = $1 - `; - const currentResult = await this.client.query(currentQuery, [keyId]); + // 현재 키 조회 + const currentKey = await prisma.multi_lang_key_master.findUnique({ + where: { key_id: keyId }, + select: { is_active: true }, + }); - if (currentResult.rows.length === 0) { + if (!currentKey) { throw new Error(`다국어 키를 찾을 수 없습니다: ${keyId}`); } - const currentStatus = currentResult.rows[0].is_active; - const newStatus = currentStatus === "Y" ? "N" : "Y"; + const newStatus = currentKey.is_active === "Y" ? "N" : "Y"; // 상태 업데이트 - const updateQuery = ` - UPDATE multi_lang_key_master - SET is_active = $2, updated_date = now(), updated_by = 'system' - WHERE key_id = $1 - `; - - await this.client.query(updateQuery, [keyId, newStatus]); + await prisma.multi_lang_key_master.update({ + where: { key_id: keyId }, + data: { + is_active: newStatus, + updated_by: "system", + }, + }); const result = newStatus === "Y" ? "활성화" : "비활성화"; logger.info("다국어 키 상태 토글 완료", { keyId, result }); @@ -585,58 +533,40 @@ export class MultiLangService { }); // 기존 키 확인 - const checkQuery = ` - SELECT key_id FROM multi_lang_key_master WHERE key_id = $1 - `; - const checkResult = await this.client.query(checkQuery, [keyId]); + const existingKey = await prisma.multi_lang_key_master.findUnique({ + where: { key_id: keyId }, + }); - if (checkResult.rows.length === 0) { + if (!existingKey) { throw new Error(`다국어 키를 찾을 수 없습니다: ${keyId}`); } - // 트랜잭션 시작 - await this.client.query("BEGIN"); - - try { + // 트랜잭션으로 기존 텍스트 삭제 후 새로 생성 + await prisma.$transaction(async (tx) => { // 기존 텍스트 삭제 - const deleteTextsQuery = ` - DELETE FROM multi_lang_text WHERE key_id = $1 - `; - await this.client.query(deleteTextsQuery, [keyId]); + await tx.multi_lang_text.deleteMany({ + where: { key_id: keyId }, + }); // 새로운 텍스트 삽입 - for (const text of textData.texts) { - const insertTextQuery = ` - INSERT INTO multi_lang_text ( - key_id, lang_code, lang_text, is_active, - created_date, created_by, updated_date, updated_by - ) VALUES ($1, $2, $3, $4, now(), $5, now(), $6) - `; - - const insertValues = [ - keyId, - text.langCode, - text.langText, - text.isActive || "Y", - text.createdBy || "system", - text.updatedBy || "system", - ]; - - await this.client.query(insertTextQuery, insertValues); + if (textData.texts.length > 0) { + await tx.multi_lang_text.createMany({ + data: textData.texts.map((text) => ({ + key_id: keyId, + lang_code: text.langCode, + lang_text: text.langText, + is_active: text.isActive || "Y", + created_by: text.createdBy || "system", + updated_by: text.updatedBy || "system", + })), + }); } + }); - // 트랜잭션 커밋 - await this.client.query("COMMIT"); - - logger.info("다국어 텍스트 저장 완료", { - keyId, - savedCount: textData.texts.length, - }); - } catch (error) { - // 트랜잭션 롤백 - await this.client.query("ROLLBACK"); - throw error; - } + logger.info("다국어 텍스트 저장 완료", { + keyId, + savedCount: textData.texts.length, + }); } catch (error) { logger.error("다국어 텍스트 저장 중 오류 발생:", error); throw new Error( @@ -652,35 +582,33 @@ export class MultiLangService { try { logger.info("사용자별 다국어 텍스트 조회 시작", { params }); - const query = ` - SELECT t.lang_text as "langText" - FROM multi_lang_key_master km - JOIN multi_lang_text t ON km.key_id = t.key_id - WHERE km.company_code = $1 - AND km.menu_name = $2 - AND km.lang_key = $3 - AND t.lang_code = $4 - AND km.is_active = 'Y' - AND t.is_active = 'Y' - LIMIT 1 - `; + const result = await prisma.multi_lang_text.findFirst({ + where: { + lang_code: params.userLang, + is_active: "Y", + multi_lang_key_master: { + company_code: params.companyCode, + menu_name: params.menuCode, + lang_key: params.langKey, + is_active: "Y", + }, + }, + select: { + lang_text: true, + }, + }); - const result = await this.client.query(query, [ - params.companyCode, - params.menuCode, - params.langKey, - params.userLang, - ]); - - if (result.rows.length === 0) { + if (!result) { logger.warn("사용자별 다국어 텍스트를 찾을 수 없음", { params }); return params.langKey; // 기본값으로 키 반환 } - const langText = result.rows[0].langText; - logger.info("사용자별 다국어 텍스트 조회 완료", { params, langText }); + logger.info("사용자별 다국어 텍스트 조회 완료", { + params, + langText: result.lang_text, + }); - return langText; + return result.lang_text; } catch (error) { logger.error("사용자별 다국어 텍스트 조회 중 오류 발생:", error); throw new Error( @@ -704,24 +632,22 @@ export class MultiLangService { langCode, }); - const query = ` - SELECT t.lang_text as "langText" - FROM multi_lang_text t - JOIN multi_lang_key_master k ON t.key_id = k.key_id - WHERE k.company_code = $1 - AND k.lang_key = $2 - AND t.lang_code = $3 - AND t.is_active = 'Y' - AND k.is_active = 'Y' - `; + const result = await prisma.multi_lang_text.findFirst({ + where: { + lang_code: langCode, + is_active: "Y", + multi_lang_key_master: { + company_code: companyCode, + lang_key: langKey, + is_active: "Y", + }, + }, + select: { + lang_text: true, + }, + }); - const result = await this.client.query(query, [ - companyCode, - langKey, - langCode, - ]); - - if (result.rows.length === 0) { + if (!result) { logger.warn("특정 키의 다국어 텍스트를 찾을 수 없음", { companyCode, langKey, @@ -730,15 +656,14 @@ export class MultiLangService { return langKey; // 기본값으로 키 반환 } - const langText = result.rows[0].langText; logger.info("특정 키의 다국어 텍스트 조회 완료", { companyCode, langKey, langCode, - langText, + langText: result.lang_text, }); - return langText; + return result.lang_text; } catch (error) { logger.error("특정 키의 다국어 텍스트 조회 중 오류 발생:", error); throw new Error( @@ -765,69 +690,51 @@ export class MultiLangService { return {}; } - // 모든 키에 대한 마스터 정보를 한번에 조회 - const langKeyMastersQuery = ` - SELECT key_id, lang_key, company_code - FROM multi_lang_key_master - WHERE lang_key = ANY($1::varchar[]) - AND (company_code = $2::varchar OR company_code = '*') - ORDER BY - CASE WHEN company_code = $2::varchar THEN 1 ELSE 2 END, - lang_key, - company_code - `; + // 모든 키에 대한 번역 조회 + const translations = await prisma.multi_lang_text.findMany({ + where: { + lang_code: params.userLang, + is_active: "Y", + multi_lang_key_master: { + lang_key: { in: params.langKeys }, + company_code: { in: [params.companyCode, "*"] }, + is_active: "Y", + }, + }, + select: { + lang_text: true, + multi_lang_key_master: { + select: { + lang_key: true, + company_code: true, + }, + }, + }, + orderBy: { + multi_lang_key_master: { + company_code: "asc", // 회사별 우선, '*' 는 기본값 + }, + }, + }); - const langKeyMasters = await this.client.query(langKeyMastersQuery, [ - params.langKeys, - params.companyCode, - ]); - - if (langKeyMasters.rows.length === 0) { - logger.warn("배치 번역: 언어키 마스터를 찾을 수 없음", { params }); - return this.createDefaultTranslations(params.langKeys); - } - - // 찾은 키들의 ID 목록 - const keyIds = langKeyMasters.rows.map((row) => row.key_id); - const foundKeys = langKeyMasters.rows.map((row) => row.lang_key); - - // 누락된 키들 (기본값으로 설정) - const missingKeys = params.langKeys.filter( - (key) => !foundKeys.includes(key) - ); const result: Record = {}; - // 기본값으로 누락된 키들 설정 - missingKeys.forEach((key) => { + // 기본값으로 모든 키 설정 + params.langKeys.forEach((key) => { result[key] = key; }); - // 실제 번역 텍스트 조회 - if (keyIds.length > 0) { - const textsQuery = ` - SELECT t.key_id, t.lang_text, km.lang_key - FROM multi_lang_text t - JOIN multi_lang_key_master km ON t.key_id = km.key_id - WHERE t.key_id = ANY($1::int[]) - AND t.lang_code = $2 - AND t.is_active = 'Y' - `; - - const texts = await this.client.query(textsQuery, [ - keyIds, - params.userLang, - ]); - - // 결과 매핑 - texts.rows.forEach((row) => { - result[row.lang_key] = row.lang_text; - }); - } + // 실제 번역으로 덮어쓰기 (회사별 우선) + translations.forEach((translation) => { + const langKey = translation.multi_lang_key_master.lang_key; + if (params.langKeys.includes(langKey)) { + result[langKey] = translation.lang_text; + } + }); logger.info("배치 번역 조회 완료", { totalKeys: params.langKeys.length, - foundKeys: foundKeys.length, - missingKeys: missingKeys.length, + foundTranslations: translations.length, resultKeys: Object.keys(result).length, }); @@ -848,46 +755,32 @@ export class MultiLangService { logger.info("언어 삭제 시작", { langCode }); // 기존 언어 확인 - const checkQuery = ` - SELECT lang_code FROM language_master WHERE lang_code = $1 - `; - const checkResult = await this.client.query(checkQuery, [langCode]); + const existingLanguage = await prisma.language_master.findUnique({ + where: { lang_code: langCode }, + }); - if (checkResult.rows.length === 0) { + if (!existingLanguage) { throw new Error(`언어를 찾을 수 없습니다: ${langCode}`); } - // 트랜잭션 시작 - await this.client.query("BEGIN"); + // 트랜잭션으로 언어와 관련 텍스트 삭제 + await prisma.$transaction(async (tx) => { + // 해당 언어의 다국어 텍스트 삭제 + const deleteResult = await tx.multi_lang_text.deleteMany({ + where: { lang_code: langCode }, + }); - try { - // 해당 언어의 다국어 텍스트만 삭제 - const deleteTextsQuery = ` - DELETE FROM multi_lang_text - WHERE lang_code = $1 - `; - const deleteResult = await this.client.query(deleteTextsQuery, [ - langCode, - ]); - logger.info(`삭제된 다국어 텍스트 수: ${deleteResult.rowCount}`, { + logger.info(`삭제된 다국어 텍스트 수: ${deleteResult.count}`, { langCode, }); // 언어 마스터 삭제 - const deleteLanguageQuery = ` - DELETE FROM language_master WHERE lang_code = $1 - `; - await this.client.query(deleteLanguageQuery, [langCode]); + await tx.language_master.delete({ + where: { lang_code: langCode }, + }); + }); - // 트랜잭션 커밋 - await this.client.query("COMMIT"); - - logger.info("언어 삭제 완료", { langCode }); - } catch (error) { - // 트랜잭션 롤백 - await this.client.query("ROLLBACK"); - throw error; - } + logger.info("언어 삭제 완료", { langCode }); } catch (error) { logger.error("언어 삭제 중 오류 발생:", error); throw new Error( @@ -895,17 +788,4 @@ export class MultiLangService { ); } } - - /** - * 기본 번역 생성 (키를 그대로 반환) - */ - private createDefaultTranslations( - langKeys: string[] - ): Record { - const result: Record = {}; - langKeys.forEach((key) => { - result[key] = key; - }); - return result; - } } diff --git a/backend-node/src/services/tableManagementService.ts b/backend-node/src/services/tableManagementService.ts index 863ab691..6c4cada4 100644 --- a/backend-node/src/services/tableManagementService.ts +++ b/backend-node/src/services/tableManagementService.ts @@ -1,4 +1,4 @@ -import { Client } from "pg"; +import { PrismaClient } from "@prisma/client"; import { logger } from "../utils/logger"; import { TableInfo, @@ -8,21 +8,21 @@ import { ColumnLabels, } from "../types/tableManagement"; -export class TableManagementService { - private client: Client; +const prisma = new PrismaClient(); - constructor(client: Client) { - this.client = client; - } +export class TableManagementService { + constructor() {} /** * 테이블 목록 조회 (PostgreSQL information_schema 활용) + * 메타데이터 조회는 Prisma로 변경 불가 */ async getTableList(): Promise { try { logger.info("테이블 목록 조회 시작"); - const query = ` + // information_schema는 여전히 $queryRaw 사용 + const tables = await prisma.$queryRaw` SELECT t.table_name as "tableName", COALESCE(tl.table_label, t.table_name) as "displayName", @@ -38,10 +38,8 @@ export class TableManagementService { ORDER BY t.table_name `; - const result = await this.client.query(query); - logger.info(`테이블 목록 조회 완료: ${result.rows.length}개`); - - return result.rows; + logger.info(`테이블 목록 조회 완료: ${tables.length}개`); + return tables; } catch (error) { logger.error("테이블 목록 조회 중 오류 발생:", error); throw new Error( @@ -52,12 +50,14 @@ export class TableManagementService { /** * 테이블 컬럼 정보 조회 + * 메타데이터 조회는 Prisma로 변경 불가 */ async getColumnList(tableName: string): Promise { try { logger.info(`컬럼 정보 조회 시작: ${tableName}`); - const query = ` + // information_schema는 여전히 $queryRaw 사용 + const columns = await prisma.$queryRaw` SELECT c.column_name as "columnName", COALESCE(cl.column_label, c.column_name) as "displayName", @@ -78,14 +78,12 @@ export class TableManagementService { cl.is_visible as "isVisible" FROM information_schema.columns c LEFT JOIN column_labels cl ON c.table_name = cl.table_name AND c.column_name = cl.column_name - WHERE c.table_name = $1 + WHERE c.table_name = ${tableName} ORDER BY c.ordinal_position `; - const result = await this.client.query(query, [tableName]); - logger.info(`컬럼 정보 조회 완료: ${tableName}, ${result.rows.length}개`); - - return result.rows; + logger.info(`컬럼 정보 조회 완료: ${tableName}, ${columns.length}개`); + return columns; } catch (error) { logger.error(`컬럼 정보 조회 중 오류 발생: ${tableName}`, error); throw new Error( @@ -96,18 +94,22 @@ export class TableManagementService { /** * 테이블이 table_labels에 없으면 자동 추가 + * Prisma ORM으로 변경 */ async insertTableIfNotExists(tableName: string): Promise { try { logger.info(`테이블 라벨 자동 추가 시작: ${tableName}`); - const query = ` - INSERT INTO table_labels (table_name, table_label, description) - VALUES ($1, $1, '') - ON CONFLICT (table_name) DO NOTHING - `; + await prisma.table_labels.upsert({ + where: { table_name: tableName }, + update: {}, // 이미 존재하면 변경하지 않음 + create: { + table_name: tableName, + table_label: tableName, + description: "", + }, + }); - await this.client.query(query, [tableName]); logger.info(`테이블 라벨 자동 추가 완료: ${tableName}`); } catch (error) { logger.error(`테이블 라벨 자동 추가 중 오류 발생: ${tableName}`, error); @@ -119,6 +121,7 @@ export class TableManagementService { /** * 컬럼 설정 업데이트 (UPSERT 방식) + * Prisma ORM으로 변경 */ async updateColumnSettings( tableName: string, @@ -131,38 +134,42 @@ export class TableManagementService { // 테이블이 table_labels에 없으면 자동 추가 await this.insertTableIfNotExists(tableName); - const query = ` - INSERT INTO column_labels ( - table_name, column_name, column_label, web_type, - detail_settings, code_category, code_value, - reference_table, reference_column, display_order, is_visible - ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) - ON CONFLICT (table_name, column_name) DO UPDATE SET - column_label = EXCLUDED.column_label, - web_type = EXCLUDED.web_type, - detail_settings = EXCLUDED.detail_settings, - code_category = EXCLUDED.code_category, - code_value = EXCLUDED.code_value, - reference_table = EXCLUDED.reference_table, - reference_column = EXCLUDED.reference_column, - display_order = EXCLUDED.display_order, - is_visible = EXCLUDED.is_visible, - updated_date = now() - `; - - await this.client.query(query, [ - tableName, - columnName, - settings.columnLabel, - settings.webType, - settings.detailSettings, - settings.codeCategory, - settings.codeValue, - settings.referenceTable, - settings.referenceColumn, - settings.displayOrder || 0, - settings.isVisible !== undefined ? settings.isVisible : true, - ]); + // column_labels 업데이트 또는 생성 + await prisma.column_labels.upsert({ + where: { + table_name_column_name: { + table_name: tableName, + column_name: columnName, + }, + }, + update: { + column_label: settings.columnLabel, + web_type: settings.webType, + detail_settings: settings.detailSettings, + code_category: settings.codeCategory, + code_value: settings.codeValue, + reference_table: settings.referenceTable, + reference_column: settings.referenceColumn, + display_order: settings.displayOrder || 0, + is_visible: + settings.isVisible !== undefined ? settings.isVisible : true, + updated_date: new Date(), + }, + create: { + table_name: tableName, + column_name: columnName, + column_label: settings.columnLabel, + web_type: settings.webType, + detail_settings: settings.detailSettings, + code_category: settings.codeCategory, + code_value: settings.codeValue, + reference_table: settings.referenceTable, + reference_column: settings.referenceColumn, + display_order: settings.displayOrder || 0, + is_visible: + settings.isVisible !== undefined ? settings.isVisible : true, + }, + }); logger.info(`컬럼 설정 업데이트 완료: ${tableName}.${columnName}`); } catch (error) { @@ -178,6 +185,7 @@ export class TableManagementService { /** * 전체 컬럼 설정 일괄 업데이트 + * Prisma 트랜잭션으로 변경 */ async updateAllColumnSettings( tableName: string, @@ -188,10 +196,8 @@ export class TableManagementService { `전체 컬럼 설정 일괄 업데이트 시작: ${tableName}, ${columnSettings.length}개` ); - // 트랜잭션 시작 - await this.client.query("BEGIN"); - - try { + // Prisma 트랜잭션 사용 + await prisma.$transaction(async (tx) => { // 테이블이 table_labels에 없으면 자동 추가 await this.insertTableIfNotExists(tableName); @@ -207,15 +213,9 @@ export class TableManagementService { ); } } + }); - // 트랜잭션 커밋 - await this.client.query("COMMIT"); - logger.info(`전체 컬럼 설정 일괄 업데이트 완료: ${tableName}`); - } catch (error) { - // 트랜잭션 롤백 - await this.client.query("ROLLBACK"); - throw error; - } + logger.info(`전체 컬럼 설정 일괄 업데이트 완료: ${tableName}`); } catch (error) { logger.error( `전체 컬럼 설정 일괄 업데이트 중 오류 발생: ${tableName}`, @@ -229,30 +229,37 @@ export class TableManagementService { /** * 테이블 라벨 정보 조회 + * Prisma ORM으로 변경 */ async getTableLabels(tableName: string): Promise { try { logger.info(`테이블 라벨 정보 조회 시작: ${tableName}`); - const query = ` - SELECT - table_name as "tableName", - table_label as "tableLabel", - description, - created_date as "createdDate", - updated_date as "updatedDate" - FROM table_labels - WHERE table_name = $1 - `; + const tableLabel = await prisma.table_labels.findUnique({ + where: { table_name: tableName }, + select: { + table_name: true, + table_label: true, + description: true, + created_date: true, + updated_date: true, + }, + }); - const result = await this.client.query(query, [tableName]); - - if (result.rows.length === 0) { + if (!tableLabel) { return null; } + const result: TableLabels = { + tableName: tableLabel.table_name, + tableLabel: tableLabel.table_label || undefined, + description: tableLabel.description || undefined, + createdDate: tableLabel.created_date || undefined, + updatedDate: tableLabel.updated_date || undefined, + }; + logger.info(`테이블 라벨 정보 조회 완료: ${tableName}`); - return result.rows[0]; + return result; } catch (error) { logger.error(`테이블 라벨 정보 조회 중 오류 발생: ${tableName}`, error); throw new Error( @@ -263,6 +270,7 @@ export class TableManagementService { /** * 컬럼 라벨 정보 조회 + * Prisma ORM으로 변경 */ async getColumnLabels( tableName: string, @@ -271,35 +279,56 @@ export class TableManagementService { try { logger.info(`컬럼 라벨 정보 조회 시작: ${tableName}.${columnName}`); - const query = ` - SELECT - id, - table_name as "tableName", - column_name as "columnName", - column_label as "columnLabel", - web_type as "webType", - detail_settings as "detailSettings", - description, - display_order as "displayOrder", - is_visible as "isVisible", - code_category as "codeCategory", - code_value as "codeValue", - reference_table as "referenceTable", - reference_column as "referenceColumn", - created_date as "createdDate", - updated_date as "updatedDate" - FROM column_labels - WHERE table_name = $1 AND column_name = $2 - `; + const columnLabel = await prisma.column_labels.findUnique({ + where: { + table_name_column_name: { + table_name: tableName, + column_name: columnName, + }, + }, + select: { + id: true, + table_name: true, + column_name: true, + column_label: true, + web_type: true, + detail_settings: true, + description: true, + display_order: true, + is_visible: true, + code_category: true, + code_value: true, + reference_table: true, + reference_column: true, + created_date: true, + updated_date: true, + }, + }); - const result = await this.client.query(query, [tableName, columnName]); - - if (result.rows.length === 0) { + if (!columnLabel) { return null; } + const result: ColumnLabels = { + id: columnLabel.id, + tableName: columnLabel.table_name || "", + columnName: columnLabel.column_name || "", + columnLabel: columnLabel.column_label || undefined, + webType: columnLabel.web_type || undefined, + detailSettings: columnLabel.detail_settings || undefined, + description: columnLabel.description || undefined, + displayOrder: columnLabel.display_order || undefined, + isVisible: columnLabel.is_visible || undefined, + codeCategory: columnLabel.code_category || undefined, + codeValue: columnLabel.code_value || undefined, + referenceTable: columnLabel.reference_table || undefined, + referenceColumn: columnLabel.reference_column || undefined, + createdDate: columnLabel.created_date || undefined, + updatedDate: columnLabel.updated_date || undefined, + }; + logger.info(`컬럼 라벨 정보 조회 완료: ${tableName}.${columnName}`); - return result.rows[0]; + return result; } catch (error) { logger.error( `컬럼 라벨 정보 조회 중 오류 발생: ${tableName}.${columnName}`, From bde5f0884ac5ee6987c56bf820f6b4940a5f4fb7 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Mon, 1 Sep 2025 11:18:25 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EA=B0=84=EB=8B=A8=ED=95=9C=20crud=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20prisma=20orm=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controllers/adminController.ts | 464 +++++++----------- 1 file changed, 190 insertions(+), 274 deletions(-) diff --git a/backend-node/src/controllers/adminController.ts b/backend-node/src/controllers/adminController.ts index 4ca152ec..6b480304 100644 --- a/backend-node/src/controllers/adminController.ts +++ b/backend-node/src/controllers/adminController.ts @@ -547,61 +547,48 @@ export const getCompanyList = async ( user: req.user, }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM을 사용한 회사 목록 조회 + const companies = await prisma.company_mng.findMany({ + where: { + OR: [{ status: "active" }, { status: null }], + }, + orderBy: { + company_name: "asc", + }, + select: { + company_code: true, + company_name: true, + status: true, + writer: true, + regdate: true, + }, }); - await client.connect(); + // 프론트엔드에서 기대하는 응답 형식으로 변환 + const response = { + success: true, + data: companies.map((company) => ({ + company_code: company.company_code, + company_name: company.company_name, + status: company.status || "active", + writer: company.writer, + regdate: company.regdate + ? company.regdate.toISOString() + : new Date().toISOString(), + data_type: "company", + })), + message: "회사 목록 조회 성공", + }; - try { - // 회사 목록 조회 쿼리 - const query = ` - SELECT - company_code, - company_name, - status, - writer, - regdate, - 'company' as data_type - FROM company_mng - WHERE status = 'active' OR status IS NULL - ORDER BY company_name - `; + logger.info("회사 목록 조회 성공", { + totalCount: companies.length, + companies: companies.map((c) => ({ + code: c.company_code, + name: c.company_name, + })), + }); - const result = await client.query(query); - const companies = result.rows; - - // 프론트엔드에서 기대하는 응답 형식으로 변환 - const response = { - success: true, - data: companies.map((company) => ({ - company_code: company.company_code, - company_name: company.company_name, - status: company.status || "active", - writer: company.writer, - regdate: company.regdate - ? company.regdate.toISOString() - : new Date().toISOString(), - data_type: company.data_type, - })), - message: "회사 목록 조회 성공", - }; - - logger.info("회사 목록 조회 성공", { - totalCount: companies.length, - companies: companies.map((c) => ({ - code: c.company_code, - name: c.company_name, - })), - }); - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("회사 목록 조회 실패", { error }); res.status(500).json({ @@ -1433,78 +1420,89 @@ export const getDepartmentList = async ( const { companyCode, status, search } = req.query; - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM을 사용한 부서 목록 조회 + const whereConditions: any = {}; + + // 회사 코드 필터 + if (companyCode) { + whereConditions.company_name = companyCode; + } + + // 상태 필터 + if (status) { + whereConditions.status = status; + } + + // 검색 조건 + if (search) { + whereConditions.OR = [ + { dept_name: { contains: search as string, mode: "insensitive" } }, + { dept_code: { contains: search as string, mode: "insensitive" } }, + { location_name: { contains: search as string, mode: "insensitive" } }, + ]; + } + + const departments = await prisma.dept_info.findMany({ + where: whereConditions, + orderBy: [{ parent_dept_code: "asc" }, { dept_name: "asc" }], + select: { + dept_code: true, + parent_dept_code: true, + dept_name: true, + master_sabun: true, + master_user_id: true, + location: true, + location_name: true, + regdate: true, + data_type: true, + status: true, + sales_yn: true, + company_name: true, + }, }); - await client.connect(); + // 부서 트리 구조 생성 + const deptMap = new Map(); + const rootDepartments: any[] = []; - try { - // 부서 목록 조회 쿼리 - let query = ` - SELECT - dept_code, - parent_dept_code, - dept_name, - master_sabun, - master_user_id, - location, - location_name, - regdate, - data_type, - status, - sales_yn, - company_name - FROM dept_info - WHERE 1=1 - `; + // 모든 부서를 맵에 저장 + departments.forEach((dept) => { + deptMap.set(dept.dept_code, { + deptCode: dept.dept_code, + deptName: dept.dept_name, + parentDeptCode: dept.parent_dept_code, + masterSabun: dept.master_sabun, + masterUserId: dept.master_user_id, + location: dept.location, + locationName: dept.location_name, + regdate: dept.regdate ? dept.regdate.toISOString() : null, + dataType: dept.data_type, + status: dept.status || "active", + salesYn: dept.sales_yn, + companyName: dept.company_name, + children: [], + }); + }); - const queryParams: any[] = []; - let paramIndex = 1; + // 부서 트리 구조 생성 + departments.forEach((dept) => { + const deptNode = deptMap.get(dept.dept_code); - // 회사 코드 필터 - if (companyCode) { - query += ` AND company_name = $${paramIndex}`; - queryParams.push(companyCode); - paramIndex++; + if (dept.parent_dept_code && deptMap.has(dept.parent_dept_code)) { + // 상위 부서가 있으면 children에 추가 + const parentDept = deptMap.get(dept.parent_dept_code); + parentDept.children.push(deptNode); + } else { + // 상위 부서가 없으면 루트 부서로 추가 + rootDepartments.push(deptNode); } + }); - // 상태 필터 - if (status) { - query += ` AND status = $${paramIndex}`; - queryParams.push(status); - paramIndex++; - } - - // 검색 조건 - if (search) { - query += ` AND ( - dept_name ILIKE $${paramIndex} OR - dept_code ILIKE $${paramIndex} OR - location_name ILIKE $${paramIndex} - )`; - queryParams.push(`%${search}%`); - paramIndex++; - } - - // 정렬 (상위 부서 먼저, 그 다음 부서명 순) - query += ` ORDER BY - CASE WHEN parent_dept_code IS NULL OR parent_dept_code = '' THEN 0 ELSE 1 END, - dept_name`; - - const result = await client.query(query, queryParams); - const departments = result.rows; - - // 부서 트리 구조 생성 - const deptMap = new Map(); - const rootDepartments: any[] = []; - - // 모든 부서를 맵에 저장 - departments.forEach((dept) => { - deptMap.set(dept.dept_code, { + const response = { + success: true, + data: { + departments: rootDepartments, + flatList: departments.map((dept) => ({ deptCode: dept.dept_code, deptName: dept.dept_name, parentDeptCode: dept.parent_dept_code, @@ -1517,56 +1515,18 @@ export const getDepartmentList = async ( status: dept.status || "active", salesYn: dept.sales_yn, companyName: dept.company_name, - children: [], - }); - }); + })), + }, + message: "부서 목록 조회 성공", + total: departments.length, + }; - // 부서 트리 구조 생성 - departments.forEach((dept) => { - const deptNode = deptMap.get(dept.dept_code); + logger.info("부서 목록 조회 성공", { + totalCount: departments.length, + rootCount: rootDepartments.length, + }); - if (dept.parent_dept_code && deptMap.has(dept.parent_dept_code)) { - // 상위 부서가 있으면 children에 추가 - const parentDept = deptMap.get(dept.parent_dept_code); - parentDept.children.push(deptNode); - } else { - // 상위 부서가 없으면 루트 부서로 추가 - rootDepartments.push(deptNode); - } - }); - - const response = { - success: true, - data: { - departments: rootDepartments, - flatList: departments.map((dept) => ({ - deptCode: dept.dept_code, - deptName: dept.dept_name, - parentDeptCode: dept.parent_dept_code, - masterSabun: dept.master_sabun, - masterUserId: dept.master_user_id, - location: dept.location, - locationName: dept.location_name, - regdate: dept.regdate ? dept.regdate.toISOString() : null, - dataType: dept.data_type, - status: dept.status || "active", - salesYn: dept.sales_yn, - companyName: dept.company_name, - })), - }, - message: "부서 목록 조회 성공", - total: departments.length, - }; - - logger.info("부서 목록 조회 성공", { - totalCount: departments.length, - rootCount: rootDepartments.length, - }); - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("부서 목록 조회 실패", { error }); res.status(500).json({ @@ -2122,121 +2082,77 @@ export const saveUser = async (req: AuthenticatedRequest, res: Response) => { } } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // 비밀번호 암호화 + const encryptedPassword = await EncryptUtil.encrypt(userData.userPassword); + + // Prisma ORM을 사용한 사용자 저장 (upsert) + const savedUser = await prisma.user_info.upsert({ + where: { + user_id: userData.userId, + }, + create: { + user_id: userData.userId, + user_name: userData.userName, + user_name_eng: userData.userNameEng || null, + user_password: encryptedPassword, + dept_code: userData.deptCode || null, + dept_name: userData.deptName || null, + position_code: userData.positionCode || null, + position_name: userData.positionName || null, + email: userData.email || null, + tel: userData.tel || null, + cell_phone: userData.cellPhone || null, + user_type: userData.userType || null, + user_type_name: userData.userTypeName || null, + sabun: userData.sabun || null, + company_code: userData.companyCode || null, + status: userData.status || "active", + locale: userData.locale || null, + regdate: new Date(), + }, + update: { + user_name: userData.userName, + user_name_eng: userData.userNameEng || null, + user_password: encryptedPassword, + dept_code: userData.deptCode || null, + dept_name: userData.deptName || null, + position_code: userData.positionCode || null, + position_name: userData.positionName || null, + email: userData.email || null, + tel: userData.tel || null, + cell_phone: userData.cellPhone || null, + user_type: userData.userType || null, + user_type_name: userData.userTypeName || null, + sabun: userData.sabun || null, + company_code: userData.companyCode || null, + status: userData.status || "active", + locale: userData.locale || null, + }, }); - await client.connect(); + // 기존 사용자인지 새 사용자인지 확인 + const isUpdate = + (await prisma.user_info.count({ + where: { user_id: userData.userId }, + })) > 0; - try { - // 기존 사용자 확인 - const checkQuery = ` - SELECT user_id FROM user_info WHERE user_id = $1 - `; - const checkResult = await client.query(checkQuery, [userData.userId]); - const isUpdate = checkResult.rows.length > 0; + logger.info(isUpdate ? "사용자 정보 수정 완료" : "새 사용자 등록 완료", { + userId: userData.userId, + }); - if (isUpdate) { - // 기존 사용자 수정 - const updateQuery = ` - UPDATE user_info SET - user_name = $1, - user_name_eng = $2, - user_password = $3, - dept_code = $4, - dept_name = $5, - position_code = $6, - position_name = $7, - email = $8, - tel = $9, - cell_phone = $10, - user_type = $11, - user_type_name = $12, - sabun = $13, - company_code = $14, - status = $15, - locale = $16 - WHERE user_id = $17 - `; + const response = { + success: true, + result: true, + message: isUpdate + ? "사용자 정보가 수정되었습니다." + : "사용자가 등록되었습니다.", + data: { + userId: userData.userId, + isUpdate, + }, + }; - const updateValues = [ - userData.userName, - userData.userNameEng || null, - await EncryptUtil.encrypt(userData.userPassword), // 비밀번호 암호화 - userData.deptCode || null, - userData.deptName || null, - userData.positionCode || null, - userData.positionName || null, - userData.email || null, - userData.tel || null, - userData.cellPhone || null, - userData.userType || null, - userData.userTypeName || null, - userData.sabun || null, - userData.companyCode || null, - userData.status || "active", - userData.locale || null, - userData.userId, - ]; - - await client.query(updateQuery, updateValues); - logger.info("사용자 정보 수정 완료", { userId: userData.userId }); - } else { - // 새 사용자 등록 - const insertQuery = ` - INSERT INTO user_info ( - user_id, user_name, user_name_eng, user_password, dept_code, dept_name, - position_code, position_name, email, tel, cell_phone, user_type, - user_type_name, sabun, company_code, status, locale, regdate - ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18 - ) - `; - - const insertValues = [ - userData.userId, - userData.userName, - userData.userNameEng || null, - await EncryptUtil.encrypt(userData.userPassword), // 비밀번호 암호화 - userData.deptCode || null, - userData.deptName || null, - userData.positionCode || null, - userData.positionName || null, - userData.email || null, - userData.tel || null, - userData.cellPhone || null, - userData.userType || null, - userData.userTypeName || null, - userData.sabun || null, - userData.companyCode || null, - userData.status || "active", - userData.locale || null, - new Date(), - ]; - - await client.query(insertQuery, insertValues); - logger.info("새 사용자 등록 완료", { userId: userData.userId }); - } - - const response = { - success: true, - result: true, - message: isUpdate - ? "사용자 정보가 수정되었습니다." - : "사용자가 등록되었습니다.", - data: { - userId: userData.userId, - isUpdate, - }, - }; - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("사용자 저장 실패", { error, userData: req.body }); res.status(500).json({ From b365969c72e7bf3f256c56f6dd1c8571df16c9db Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Mon, 1 Sep 2025 14:52:00 +0900 Subject: [PATCH 3/3] =?UTF-8?q?Raw=20SQL=EC=9D=84=20Prisma=20ORM=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=85=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend-node/prisma/schema.prisma | 1889 +---------------- .../src/controllers/adminController.ts | 773 +++---- backend-node/src/services/adminService.ts | 39 +- backend-node/src/services/authService.ts | 50 +- 4 files changed, 384 insertions(+), 2367 deletions(-) diff --git a/backend-node/prisma/schema.prisma b/backend-node/prisma/schema.prisma index 31cbe566..1a2ab31b 100644 --- a/backend-node/prisma/schema.prisma +++ b/backend-node/prisma/schema.prisma @@ -10,7 +10,6 @@ datasource db { // 테이블 타입관리 관련 모델은 이미 정의되어 있음 (line 11, 717) -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model admin_supply_mng { objid Decimal @id @default(0) @db.Decimal supply_code String? @default("NULL::character varying") @db.VarChar(100) @@ -60,7 +59,6 @@ model admin_supply_mng_history { status String? @db.VarChar(32) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model approval { objid Decimal @default(0) @db.Decimal target_objid Decimal? @db.Decimal @@ -76,33 +74,18 @@ model approval { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model approval_240704 { - objid Decimal? @db.Decimal - target_objid Decimal? @db.Decimal - target_type String? @db.VarChar(128) - approval_seq String? @db.VarChar(64) - regdate DateTime? @db.Timestamp(6) - complete_date DateTime? @db.Timestamp(6) - status String? @db.VarChar(32) - system_type String? @db.VarChar(32) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model approval_kind { - target_type String? @db.VarChar + target_type String @db.VarChar target_name String? @db.VarChar regdate DateTime? @db.Timestamp(6) status String? @db.VarChar - @@ignore + @@id([target_type]) + @@index([status]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments -/// This model contains an expression index which requires additional setup for migrations. Visit https://pris.ly/d/expression-indexes for more info. model approval_target { objid Decimal @default(0) @db.Decimal master_target_objid Decimal @default(0) @db.Decimal @@ -117,7 +100,6 @@ model approval_target { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model arrival_plan { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -153,41 +135,8 @@ model arrival_plan { @@index([part_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model arrival_plan_240704 { - objid String? @db.VarChar - parent_objid String? @db.VarChar - order_part_objid String? @db.VarChar - part_objid String? @db.VarChar - arrival_plan_date String? @db.VarChar - re_arrival_plan_date String? @db.VarChar - arrival_qty String? @db.VarChar - receipt_qty String? @db.VarChar - genuine_qty String? @db.VarChar - receipt_date String? @db.VarChar - inspection_date String? @db.VarChar - location String? @db.VarChar - error_qty String? @db.VarChar - error_reason String? @db.VarChar - attribution String? @db.VarChar - status String? @db.VarChar - assembly_status String? @db.VarChar - writer String? @db.VarChar - group_seq String? @db.VarChar - seq String? @db.VarChar - defect_content String? @db.VarChar - defect_action String? @db.VarChar - defect_note String? @db.VarChar - defect_action_date String? @db.VarChar - defect_action_title String? @db.VarChar - inventory_status String? @db.VarChar - sub_location String? @db.VarChar - receiver_id String? @db.VarChar - @@ignore -} -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model as_mng { objid Int @id as_no String? @db.VarChar @@ -241,7 +190,6 @@ model as_part_mng { note String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model assembly_cost { objid Decimal @id @db.Decimal target_objid Decimal? @db.Decimal @@ -279,8 +227,6 @@ model assembly_wbs_task { @@index([parent_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model attach_file_info { objid Decimal @default(0) @db.Decimal target_objid String? @db.VarChar @@ -301,61 +247,10 @@ model attach_file_info { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model attach_file_info_230510 { - objid Decimal? @db.Decimal - target_objid Decimal? @db.Decimal - saved_file_name String? @db.VarChar(128) - real_file_name String? @db.VarChar(128) - doc_type String? @db.VarChar(128) - doc_type_name String? @db.VarChar(128) - file_size Decimal? @db.Decimal - file_ext String? @db.VarChar(32) - file_path String? @db.VarChar(512) - writer String? @db.VarChar(32) - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar(32) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model attach_file_info_240628 { - objid Decimal? @db.Decimal - target_objid String? @db.VarChar - saved_file_name String? @db.VarChar(128) - real_file_name String? @db.VarChar(128) - doc_type String? @db.VarChar(128) - doc_type_name String? @db.VarChar(128) - file_size Decimal? @db.Decimal - file_ext String? @db.VarChar(32) - file_path String? @db.VarChar(512) - writer String? @db.VarChar(32) - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar(32) - parent_target_objid String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model attach_file_info_240701 { - objid Decimal? @db.Decimal - target_objid String? @db.VarChar - saved_file_name String? @db.VarChar(128) - real_file_name String? @db.VarChar(128) - doc_type String? @db.VarChar(128) - doc_type_name String? @db.VarChar(128) - file_size Decimal? @db.Decimal - file_ext String? @db.VarChar(32) - file_path String? @db.VarChar(512) - writer String? @db.VarChar(32) - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar(32) - parent_target_objid String? @db.VarChar - - @@ignore -} model authority_master { objid Decimal @id @default(0) @db.Decimal @@ -364,6 +259,9 @@ model authority_master { writer String? @default("NULL::character varying") @db.VarChar(32) regdate DateTime? @db.Timestamp(6) status String? @default("NULL::character varying") @db.VarChar(32) + + // 관계 설정 + sub_users authority_sub_user[] } model authority_master_history { @@ -378,18 +276,22 @@ model authority_master_history { reg_date DateTime? @db.Timestamp(6) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model authority_sub_user { - objid Decimal? @db.Decimal + objid Decimal @id @default(0) @db.Decimal master_objid Decimal? @db.Decimal user_id String? @default("NULL::character varying") @db.VarChar(64) writer String? @default("NULL::character varying") @db.VarChar(64) regdate DateTime? @db.Timestamp(6) - @@ignore + // 관계 설정 + authority_master authority_master? @relation(fields: [master_objid], references: [objid]) + user user_info? @relation(fields: [user_id], references: [user_id]) + + @@index([master_objid]) + @@index([user_id]) + @@index([master_objid, user_id]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model board { objid String @id @db.VarChar system_type String? @db.VarChar(16) @@ -416,7 +318,6 @@ model board { email String? @db.VarChar(50) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model bom_part_qty { bom_report_objid String @db.VarChar(64) objid String @id @db.VarChar(64) @@ -442,157 +343,13 @@ model bom_part_qty { @@index([parent_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model bom_part_qty_240612 { - bom_report_objid String? @db.VarChar(64) - objid String? @db.VarChar(64) - parent_objid String? @db.VarChar(64) - child_objid String? @db.VarChar(64) - parent_part_no String? @db.VarChar(64) - part_no String? @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? - status String? @db.VarChar - deploy_date String? @db.VarChar - deploy_user_id String? @db.VarChar - edit_date String? @db.VarChar - writer String? @db.VarChar - qty_temp String? @db.VarChar - last_part_objid String? @db.VarChar - editer String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model bom_part_qty_240708 { - bom_report_objid String? @db.VarChar(64) - objid String? @db.VarChar(64) - parent_objid String? @db.VarChar(64) - child_objid String? @db.VarChar(64) - parent_part_no String? @db.VarChar(64) - part_no String? @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? - status String? @db.VarChar - deploy_date String? @db.VarChar - deploy_user_id String? @db.VarChar - edit_date String? @db.VarChar - writer String? @db.VarChar - qty_temp String? @db.VarChar - last_part_objid String? @db.VarChar - editer String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model bom_part_qty_240715 { - bom_report_objid String? @db.VarChar(64) - objid String? @db.VarChar(64) - parent_objid String? @db.VarChar(64) - child_objid String? @db.VarChar(64) - parent_part_no String? @db.VarChar(64) - part_no String? @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? - status String? @db.VarChar - deploy_date String? @db.VarChar - deploy_user_id String? @db.VarChar - edit_date String? @db.VarChar - writer String? @db.VarChar - qty_temp String? @db.VarChar - last_part_objid String? @db.VarChar - editer String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model bom_part_qty_240718 { - bom_report_objid String? @db.VarChar(64) - objid String? @db.VarChar(64) - parent_objid String? @db.VarChar(64) - child_objid String? @db.VarChar(64) - parent_part_no String? @db.VarChar(64) - part_no String? @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? - status String? @db.VarChar - deploy_date String? @db.VarChar - deploy_user_id String? @db.VarChar - edit_date String? @db.VarChar - writer String? @db.VarChar - qty_temp String? @db.VarChar - last_part_objid String? @db.VarChar - editer String? @db.VarChar - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model bom_part_qty_241119 { - bom_report_objid String? @db.VarChar(64) - objid String? @db.VarChar(64) - parent_objid String? @db.VarChar(64) - child_objid String? @db.VarChar(64) - parent_part_no String? @db.VarChar(64) - part_no String? @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? - status String? @db.VarChar - deploy_date String? @db.VarChar - deploy_user_id String? @db.VarChar - edit_date String? @db.VarChar - writer String? @db.VarChar - qty_temp String? @db.VarChar - last_part_objid String? @db.VarChar - editer String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model bom_part_qty_del { - bom_report_objid String? @db.VarChar(64) - objid String? @db.VarChar(64) - parent_objid String? @db.VarChar(64) - child_objid String? @db.VarChar(64) - parent_part_no String? @db.VarChar(64) - part_no String? @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? - status String? @db.VarChar - deploy_date String? @db.VarChar - deploy_user_id String? @db.VarChar - edit_date String? @db.VarChar - writer String? @db.VarChar - qty_temp String? @db.VarChar - last_part_objid String? @db.VarChar - editer String? @db.VarChar - - @@ignore -} - -model bom_part_qty_temp { - bom_report_objid String @db.VarChar(64) - objid String @id @db.VarChar(64) - parent_objid String? @default("NULL::character varying") @db.VarChar(64) - child_objid String? @default("NULL::character varying") @db.VarChar(64) - parent_part_no String? @default("NULL::character varying") @db.VarChar(64) - part_no String? @default("NULL::character varying") @db.VarChar(64) - qty String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - seq Int? -} - -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model car_distribute_member { objid Decimal @db.Decimal car_objid Decimal @db.Decimal @@ -606,7 +363,6 @@ model car_distribute_member { @@id([car_objid, member_user_id]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model car_milestone_mng { objid Decimal @db.Decimal car_objid Decimal @db.Decimal @@ -619,7 +375,6 @@ model car_milestone_mng { @@id([milestone_objid, car_objid]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model car_mng { objid Decimal @id @db.Decimal car_code String? @db.VarChar(32) @@ -639,7 +394,6 @@ model chartmgmt { objid String @id @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model check_report_mng { objid Decimal @id @default(0) @db.Decimal parent_objid Decimal? @default(0) @db.Decimal @@ -729,8 +483,6 @@ model comm_code_history { status String? @default("null::character varying") @db.VarChar(32) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model comm_exchange_rate { yyyy_mm String @db.VarChar regdate DateTime? @db.Timestamp(6) @@ -777,8 +529,10 @@ model company_mng { writer String? @db.VarChar(32) regdate DateTime? @db.Timestamp(6) status String? @db.VarChar(32) + + // 관계 설정 + menus menu_info[] } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model contract_mgmt { objid String @id @db.VarChar category_cd String? @db.VarChar @@ -833,27 +587,20 @@ model contract_mgmt { overhaul_order String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model contract_mgmt_option { - objid Int + objid Int @id @default(autoincrement()) contract_objid Int option_objid Int? option_qty Int? price Int? note String? @db.VarChar - @@ignore + @@index([contract_objid]) + @@index([option_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model corsetemp { - corse String? @db.VarChar(5) - @@ignore -} -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model counselingmgmt { objid String @id @db.VarChar reg_date String? @db.VarChar @@ -878,18 +625,8 @@ model counselingmgmt { parent_seq String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model crud { - objid String? @db.VarChar(20) - title String? @db.VarChar(50) - detail String? @db.VarChar(200) - writer String? @db.VarChar(15) - regdate DateTime? @db.Date - @@ignore -} -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model customer_service_mgmt { objid String @id @db.VarChar service_no String? @db.VarChar @@ -916,7 +653,6 @@ model customer_service_mgmt { total_expenses String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model customer_service_part { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -929,7 +665,6 @@ model customer_service_part { sup_price String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model customer_service_workingtime { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -943,7 +678,6 @@ model customer_service_workingtime { expenses String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model delivery_history { objid String @id @db.VarChar part_objid String? @db.VarChar @@ -976,7 +710,6 @@ model delivery_history { @@index([part_objid]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model delivery_history_defect { objid String @id @db.VarChar purchase_order_part_objid String? @db.VarChar @@ -1001,7 +734,6 @@ model delivery_part_price { regdate DateTime? @db.Timestamp(6) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model dept_info { dept_code String @id(map: "dept_code") @db.VarChar(100) parent_dept_code String? @db.VarChar(100) @@ -1017,7 +749,6 @@ model dept_info { company_name String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model dept_info_history { objid Decimal @id @db.Decimal parent_name String? @db.VarChar(64) @@ -1046,7 +777,6 @@ model ecr_mng { check_date DateTime? @db.Timestamp(6) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model eo_change_history { objid Decimal @id @db.Decimal project_objid String? @db.VarChar(64) @@ -1079,7 +809,6 @@ model eo_change_history { regdate DateTime? @db.Date } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model eo_mng { objid Decimal @id @db.Decimal eo_gubun String? @default("NULL::character varying") @db.VarChar(100) @@ -1153,7 +882,6 @@ model estimate_mgmt { status String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model expense_detail { expense_detail_objid String @default("0") @db.VarChar expense_master_objid String @default("0") @db.VarChar @@ -1167,7 +895,6 @@ model expense_detail { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model expense_master { expense_master_objid String @id @db.VarChar project_mgmt_objid String @db.VarChar @@ -1193,7 +920,6 @@ model expense_master { remark String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model external_work_review_info { objid String @id @db.VarChar(64) project_objid String? @db.VarChar(64) @@ -1227,7 +953,6 @@ model facility_assembly_plan { reg_date DateTime? @db.Timestamp(6) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model file_down_log { objid Decimal? @db.Decimal log_time DateTime? @db.Timestamp(6) @@ -1239,7 +964,6 @@ model file_down_log { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model fund_mgmt { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -1264,8 +988,6 @@ model fund_mgmt { balance_cost_result String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model inboxtask { objid Decimal? @db.Decimal seq Decimal? @db.Decimal @@ -1286,7 +1008,6 @@ model inboxtask { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model injection_cost { objid Decimal @id @db.Decimal target_objid Decimal? @db.Decimal @@ -1313,7 +1034,6 @@ model injection_cost { regdate DateTime? @db.Timestamp(6) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model input_cost_goal { objid String? @unique(map: "idx_unq_input_cost_goal") @db.VarChar contract_objid String? @db.VarChar @@ -1326,7 +1046,6 @@ model input_cost_goal { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model input_resource { objid Decimal @id @db.Decimal parent_objid Decimal @db.Decimal @@ -1428,7 +1147,6 @@ model inventory_mgmt { @@index([part_objid]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model inventory_mgmt_history { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -1440,7 +1158,6 @@ model inventory_mgmt_history { successor_user String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model inventory_mgmt_in { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -1464,39 +1181,8 @@ model inventory_mgmt_in { @@index([parent_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model inventory_mgmt_in_240513 { - objid String? @db.VarChar - parent_objid String? @db.VarChar - receipt_qty String? @db.VarChar - location String? @db.VarChar - sub_location String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - contract_mgmt_objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - purchase_order_sub_objid String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model inventory_mgmt_in_240704 { - objid String? @db.VarChar - parent_objid String? @db.VarChar - receipt_qty String? @db.VarChar - location String? @db.VarChar - sub_location String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - contract_mgmt_objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - purchase_order_sub_objid String? @db.VarChar - - @@ignore -} - -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model inventory_mgmt_out { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -1514,7 +1200,6 @@ model inventory_mgmt_out { @@index([parent_objid]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model inventory_mgmt_out_master { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -1532,7 +1217,6 @@ model inventory_mgmt_out_master { sign String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model inventory_mng { objid Decimal @id @default(0) @db.Decimal parent_objid Decimal @db.Decimal @@ -1593,7 +1277,6 @@ model invoice_mgmt_part { receipt_date String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model irregular_drawing_distribute { objid Decimal @id @db.Decimal distribute_type String? @db.VarChar(64) @@ -1609,7 +1292,6 @@ model irregular_drawing_distribute { regdate DateTime? @db.Date } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model issue_mgmt { objid Decimal @default(0) @db.Decimal parent_objid Decimal @default(0) @db.Decimal @@ -1672,8 +1354,6 @@ model language_master { multi_lang_text multi_lang_text[] } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model login_access_log { log_time DateTime? @db.Timestamp(6) system_name String? @default("NULL::character varying") @db.VarChar(32) @@ -1689,7 +1369,6 @@ model login_access_log { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model mail_log { objid String? @db.VarChar system_name String? @db.VarChar(32) @@ -1707,7 +1386,6 @@ model mail_log { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model material_cost { objid Decimal @id @db.Decimal target_objid Decimal? @db.Decimal @@ -1727,8 +1405,6 @@ model material_cost { regdate DateTime? @db.Timestamp(6) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model material_detail_mgmt { material_detail_objid Decimal @default(0) @db.Decimal material_master_objid Decimal @default(0) @db.Decimal @@ -1763,7 +1439,6 @@ model material_detail_mgmt { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model material_master_mgmt { material_master_objid Decimal @id @default(0) @db.Decimal project_mgmt_objid Decimal? @default(0) @db.Decimal @@ -1789,18 +1464,17 @@ model material_master_mgmt { rels_cd String? @db.VarChar(100) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model material_mng { - objid Decimal? @db.Decimal + objid Decimal @id @default(0) @db.Decimal material_name String? @db.VarChar(256) writer String? @db.VarChar(32) regdate DateTime? @db.Timestamp(6) status String? @db.VarChar(32) - @@ignore + @@index([material_name]) + @@index([status]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model material_release { material_release_objid Decimal @default(0) @db.Decimal inventory_mgmt_objid Decimal @default(0) @db.Decimal @@ -1815,9 +1489,8 @@ model material_release { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model menu_info { - objid Decimal @default(0) @db.Decimal + objid Decimal @id @default(0) @db.Decimal menu_type Decimal? @db.Decimal parent_obj_id Decimal? @db.Decimal menu_name_kor String? @db.VarChar(64) @@ -1833,10 +1506,14 @@ model menu_info { lang_key String? @db.VarChar(100) lang_key_desc String? @db.VarChar(100) - @@ignore + // 관계 설정 (나중에 활용 가능) + company company_mng? @relation(fields: [company_code], references: [company_code]) + + @@index([parent_obj_id]) + @@index([company_code]) + @@index([system_name]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model mold_dev_request_info { objid String @id @db.VarChar(64) project_objid String? @db.VarChar(64) @@ -1860,14 +1537,7 @@ model mold_dev_request_info { status String? @db.VarChar(50) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model mtemp { - ayprodcd String? @db.VarChar(15) - aycd String? @db.VarChar(15) - ayqty Int? @db.SmallInt - @@ignore -} model multi_lang_key_master { key_id Int @id @default(autoincrement()) @@ -1933,7 +1603,6 @@ model nswos100_tbl { @@id([suvndcd, issuedt, issueno, isno], map: "pk_nswos100_tbl") } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model oem_factory_mng { objid Decimal @default(0) @db.Decimal(10, 0) factory_name String? @db.VarChar(128) @@ -1944,8 +1613,6 @@ model oem_factory_mng { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model oem_milestone_mng { objid Decimal @db.Decimal seq String? @db.VarChar(32) @@ -1958,7 +1625,6 @@ model oem_milestone_mng { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model oem_mng { objid Decimal @id @db.Decimal oem_code String? @db.VarChar(64) @@ -1968,7 +1634,6 @@ model oem_mng { status String? @db.VarChar(32) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model option_mng { objid String @id @default("") @db.VarChar option_no String? @db.VarChar @@ -1984,7 +1649,6 @@ model option_mng { price String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model option_price_history { objid String @default("") @db.VarChar option_objid String @default("") @db.VarChar @@ -2025,7 +1689,6 @@ model order_mgmt { spec_cd String? @db.VarChar(32) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model order_mgmt_example { objid Int? order_mgmt_objid Int? @@ -2068,7 +1731,6 @@ model order_mng_sub { writer String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model order_plan_mgmt { objid Int parent_objid Int @id @@ -2122,7 +1784,6 @@ model order_spec_mng { writer String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model order_spec_mng_history { objid String @db.VarChar seq String @db.VarChar @@ -2140,25 +1801,7 @@ model order_spec_mng_history { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model order_spec_mng_temp { - objid String @db.VarChar - seq String @db.VarChar - part_objid String @db.VarChar - partner_rank String? @db.VarChar - partner_objid String? @db.VarChar - partner_price String? @db.VarChar - partner_qty String? @db.VarChar - apply_date String? @db.VarChar - remark String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - is_last String? @db.VarChar - writer String? @db.VarChar - @@ignore -} - -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model part_bom_qty { bom_report_objid Decimal @db.Decimal objid Decimal @id @db.Decimal @@ -2169,7 +1812,6 @@ model part_bom_qty { regdate DateTime? @db.Timestamp(6) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model part_bom_report { objid String @id @default("") @db.VarChar customer_objid String? @db.VarChar @@ -2195,44 +1837,8 @@ model part_bom_report { @@index([unit_code, contract_objid], map: "part_bom_report_unit_code_idx") } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model part_bom_report_bak { - objid Decimal? @db.Decimal - oem_objid Decimal? @db.Decimal - car_objid Decimal? @db.Decimal - product_group_objid String? @db.VarChar(64) - product_objid String? @db.VarChar(64) - region_objid String? @db.VarChar(64) - writer String? @db.VarChar(64) - regdate DateTime? @db.Timestamp(6) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model part_bom_report_del { - objid String? @db.VarChar - customer_objid String? @db.VarChar - contract_objid String? @db.VarChar - unit_code String? @db.VarChar - revision String? @db.VarChar - writer String? @db.VarChar(64) - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar(64) - deploy_date String? @db.VarChar(64) - eo_no String? @db.VarChar(100) - eo_date String? @db.VarChar(100) - note String? @db.VarChar(2000) - edit_date DateTime? @db.Timestamp(6) - editer String? @db.VarChar - unit_code_old String? @db.VarChar - multi_yn String? @db.VarChar - multi_break_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - - @@ignore -} model part_distribution_list { part_objid Decimal @db.Decimal @@ -2270,7 +1876,6 @@ model part_distribution_list { objid Int @id } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model part_mgmt { part_mgmt_objid Decimal @unique(map: "part_pk") @default(0) @db.Decimal part_mgmt_parent_objid Decimal? @db.Decimal @@ -2297,7 +1902,6 @@ model part_mgmt { material String? @db.VarChar(100) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model part_mng { objid String @id @db.VarChar product_mgmt_objid String? @db.VarChar(100) @@ -2355,67 +1959,7 @@ model part_mng { @@index([part_no]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model part_mng_del { - objid String? @db.VarChar - product_mgmt_objid String? @db.VarChar(100) - upg_no String? @db.VarChar(100) - part_no String? @db.VarChar(100) - part_name String? @db.VarChar(100) - unit String? @db.VarChar(50) - qty String? @db.VarChar(50) - spec String? @db.VarChar(100) - material String? @db.VarChar(100) - weight String? @db.VarChar(50) - part_type String? @db.VarChar(100) - remark String? @db.VarChar(1000) - es_spec String? @db.VarChar(100) - ms_spec String? @db.VarChar(100) - change_option String? @db.VarChar(50) - design_apply_point String? @db.VarChar(50) - management_flag String? @db.VarChar(50) - revision String? @db.VarChar(50) - status String? @db.VarChar(30) - reg_date DateTime? @db.Timestamp(6) - edit_date DateTime? @db.Timestamp(6) - writer String? @db.VarChar(30) - is_last String? @db.VarChar(5) - eo_no String? @db.VarChar - eo_temp String? @db.VarChar - excel_upload_seq Int? - sourcing_code String? @db.VarChar - sub_material String? @db.VarChar(100) - parent_part_no String? @db.VarChar - design_date String? @db.VarChar - eo_date String? @db.VarChar - deploy_date DateTime? @db.Timestamp(6) - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - in_diameter String? @db.VarChar - length String? @db.VarChar - supply_code String? @db.VarChar - change_type String? @db.VarChar - contract_objid String? @db.VarChar - maker String? @db.VarChar - post_processing String? @db.VarChar - material_code String? @db.VarChar - code1 String? @db.VarChar - code2 String? @db.VarChar - code3 String? @db.VarChar - code4 String? @db.VarChar - code5 String? @db.VarChar - major_category String? @db.VarChar - sub_category String? @db.VarChar - is_new String? @db.VarChar - is_longd String? @db.VarChar - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model part_mng_history { objid Decimal @db.Decimal product_mgmt_objid String? @db.VarChar(100) @@ -2477,112 +2021,8 @@ model part_mng_history { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model part_mng_history_231222 { - objid Decimal? @db.Decimal - product_mgmt_objid String? @db.VarChar(100) - upg_no String? @db.VarChar(100) - part_no String? @db.VarChar(100) - part_name String? @db.VarChar(100) - unit String? @db.VarChar(50) - qty String? @db.VarChar(50) - spec String? @db.VarChar(100) - material String? @db.VarChar(100) - weight String? @db.VarChar(50) - part_type String? @db.VarChar(100) - remark String? @db.VarChar(1000) - es_spec String? @db.VarChar(100) - ms_spec String? @db.VarChar(100) - change_option String? @db.VarChar(50) - design_apply_point String? @db.VarChar(50) - management_flag String? @db.VarChar(50) - revision String? @db.VarChar(50) - status String? @db.VarChar(30) - reg_date DateTime? @db.Timestamp(6) - edit_date DateTime? @db.Timestamp(6) - writer String? @db.VarChar(30) - is_last String? @db.VarChar(5) - eo_no String? @db.VarChar - eo_temp String? @db.VarChar - excel_upload_seq String? @db.VarChar - sourcing_code String? @db.VarChar - sub_material String? @db.VarChar(100) - parent_part_no String? @db.VarChar - design_date String? @db.VarChar - eo_date String? @db.VarChar - deploy_date DateTime? @db.Timestamp(6) - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - in_diameter String? @db.VarChar - length String? @db.VarChar - supply_code String? @db.VarChar - change_type String? @db.VarChar - contract_objid String? @db.VarChar - maker String? @db.VarChar - qty_temp String? @db.VarChar - bom_report_objid String? @db.VarChar - parent_part_objid String? @db.VarChar - parent_qty_child_objid String? @db.VarChar - bom_qty_status String? @db.VarChar - his_reg_date DateTime? @db.Timestamp(6) - his_writer String? @db.VarChar - his_status String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model part_mng_history_copy { - objid Decimal @db.Decimal - product_mgmt_objid String? @db.VarChar(100) - upg_no String? @default("NULL::character varying") @db.VarChar(100) - part_no String? @db.VarChar(100) - part_name String? @db.VarChar(100) - unit String? @db.VarChar(50) - qty String? @db.VarChar(50) - spec String? @db.VarChar(100) - material String? @db.VarChar(100) - weight String? @db.VarChar(50) - part_type String? @db.VarChar(100) - remark String? @db.VarChar(1000) - es_spec String? @db.VarChar(100) - ms_spec String? @db.VarChar(100) - change_option String? @db.VarChar(50) - design_apply_point String? @db.VarChar(50) - management_flag String? @db.VarChar(50) - revision String? @db.VarChar(50) - status String? @db.VarChar(30) - reg_date DateTime? @db.Timestamp(6) - edit_date DateTime? @db.Timestamp(6) - writer String? @db.VarChar(30) - is_last String? @db.VarChar(5) - history_status String? @db.VarChar(30) - sub_material String? @db.VarChar - design_date String? @db.VarChar - eo_date String? @db.VarChar - deploy_date DateTime? @db.Timestamp(6) - - @@ignore -} - -model part_mng_temp { - part_report_objid Decimal? @db.Decimal - objid Decimal @id @db.Decimal - part_no String? @db.VarChar(100) - part_name String? @db.VarChar(100) - unit String? @db.VarChar(50) - qty String? @db.VarChar(50) - spec String? @db.VarChar(100) - material String? @db.VarChar(100) - weight String? @db.VarChar(50) - part_type String? @db.VarChar(100) - remark String? @db.VarChar(1000) - seq String? @db.VarChar - sub_material String? @db.VarChar - parent_part_no String? @db.VarChar -} model planning_issue { objid String @id @db.VarChar @@ -2610,7 +2050,6 @@ model planning_issue { status String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_invest_cost_mng { objid Decimal @db.Decimal seq String? @db.VarChar(32) @@ -2625,8 +2064,6 @@ model pms_invest_cost_mng { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model pms_pjt_concept_info { objid Decimal @default(0) @db.Decimal(10, 0) foreign_type String? @db.VarChar(32) @@ -2648,7 +2085,6 @@ model pms_pjt_concept_info { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_pjt_info { objid Decimal? @db.Decimal foreign_type String? @db.VarChar(32) @@ -2670,7 +2106,6 @@ model pms_pjt_info { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_pjt_year_goal { objid String? @unique(map: "idx_unq_pms_pjt_year_goal") @db.VarChar year String? @db.VarChar @@ -2682,7 +2117,6 @@ model pms_pjt_year_goal { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_rel_pjt_concept_milestone { objid Decimal? @db.Decimal target_objid Decimal? @db.Decimal @@ -2693,7 +2127,6 @@ model pms_rel_pjt_concept_milestone { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model pms_rel_pjt_concept_prod { objid Decimal @id @default(0) @db.Decimal(10, 0) target_objid Decimal? @db.Decimal(10, 0) @@ -2711,7 +2144,6 @@ model pms_rel_pjt_concept_prod { regdate DateTime? @db.Date } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_rel_pjt_prod { objid Decimal @db.Decimal target_objid Decimal? @db.Decimal @@ -2721,7 +2153,6 @@ model pms_rel_pjt_prod { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_rel_prod_ref_dept { objid Decimal @default(0) @db.Decimal target_objid Decimal? @db.Decimal @@ -2732,8 +2163,6 @@ model pms_rel_prod_ref_dept { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model pms_wbs_task { objid String? @unique(map: "wbs_task_pk") @db.VarChar contract_objid String? @db.VarChar @@ -2792,231 +2221,10 @@ model pms_wbs_task { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model pms_wbs_task_240207 { - objid String? @db.VarChar - contract_objid String? @db.VarChar - parent_objid String? @db.VarChar - task_name String? @db.VarChar(1000) - task_seq String? @db.VarChar - design_user_id String? @db.VarChar - design_plan_start String? @db.VarChar - design_plan_end String? @db.VarChar - design_act_start String? @db.VarChar - design_act_end String? @db.VarChar - purchase_user_id String? @db.VarChar - purchase_plan_start String? @db.VarChar - purchase_plan_end String? @db.VarChar - purchase_act_start String? @db.VarChar - purchase_act_end String? @db.VarChar - produce_user_id String? @db.VarChar - produce_plan_start String? @db.VarChar - produce_plan_end String? @db.VarChar - produce_act_start String? @db.VarChar - produce_act_end String? @db.VarChar - selfins_user_id String? @db.VarChar - selfins_plan_start String? @db.VarChar - selfins_plan_end String? @db.VarChar - selfins_act_start String? @db.VarChar - selfins_act_end String? @db.VarChar - finalins_user_id String? @db.VarChar - finalins_plan_start String? @db.VarChar - finalins_plan_end String? @db.VarChar - finalins_act_start String? @db.VarChar - finalins_act_end String? @db.VarChar - ship_user_id String? @db.VarChar - ship_plan_start String? @db.VarChar - ship_plan_end String? @db.VarChar - ship_act_start String? @db.VarChar - ship_act_end String? @db.VarChar - setup_user_id String? @db.VarChar - setup_plan_start String? @db.VarChar - setup_plan_end String? @db.VarChar - setup_act_start String? @db.VarChar - setup_act_end String? @db.VarChar - writer String? @db.VarChar - design_rate String? @db.VarChar - purchase_rate String? @db.VarChar - produce_rate String? @db.VarChar - selfins_rate String? @db.VarChar - finalins_rate String? @db.VarChar - ship_rate String? @db.VarChar - setup_rate String? @db.VarChar - unit_no String? @db.VarChar - reg_date DateTime? @db.Timestamp(6) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model pms_wbs_task_240327 { - objid String? @db.VarChar - contract_objid String? @db.VarChar - parent_objid String? @db.VarChar - task_name String? @db.VarChar(1000) - task_seq String? @db.VarChar - design_user_id String? @db.VarChar - design_plan_start String? @db.VarChar - design_plan_end String? @db.VarChar - design_act_start String? @db.VarChar - design_act_end String? @db.VarChar - purchase_user_id String? @db.VarChar - purchase_plan_start String? @db.VarChar - purchase_plan_end String? @db.VarChar - purchase_act_start String? @db.VarChar - purchase_act_end String? @db.VarChar - produce_user_id String? @db.VarChar - produce_plan_start String? @db.VarChar - produce_plan_end String? @db.VarChar - produce_act_start String? @db.VarChar - produce_act_end String? @db.VarChar - selfins_user_id String? @db.VarChar - selfins_plan_start String? @db.VarChar - selfins_plan_end String? @db.VarChar - selfins_act_start String? @db.VarChar - selfins_act_end String? @db.VarChar - finalins_user_id String? @db.VarChar - finalins_plan_start String? @db.VarChar - finalins_plan_end String? @db.VarChar - finalins_act_start String? @db.VarChar - finalins_act_end String? @db.VarChar - ship_user_id String? @db.VarChar - ship_plan_start String? @db.VarChar - ship_plan_end String? @db.VarChar - ship_act_start String? @db.VarChar - ship_act_end String? @db.VarChar - setup_user_id String? @db.VarChar - setup_plan_start String? @db.VarChar - setup_plan_end String? @db.VarChar - setup_act_start String? @db.VarChar - setup_act_end String? @db.VarChar - writer String? @db.VarChar - design_rate String? @db.VarChar - purchase_rate String? @db.VarChar - produce_rate String? @db.VarChar - selfins_rate String? @db.VarChar - finalins_rate String? @db.VarChar - ship_rate String? @db.VarChar - setup_rate String? @db.VarChar - unit_no String? @db.VarChar - reg_date DateTime? @db.Timestamp(6) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model pms_wbs_task_240701 { - objid String? @db.VarChar - contract_objid String? @db.VarChar - parent_objid String? @db.VarChar - task_name String? @db.VarChar(1000) - task_seq String? @db.VarChar - design_user_id String? @db.VarChar - design_plan_start String? @db.VarChar - design_plan_end String? @db.VarChar - design_act_start String? @db.VarChar - design_act_end String? @db.VarChar - purchase_user_id String? @db.VarChar - purchase_plan_start String? @db.VarChar - purchase_plan_end String? @db.VarChar - purchase_act_start String? @db.VarChar - purchase_act_end String? @db.VarChar - produce_user_id String? @db.VarChar - produce_plan_start String? @db.VarChar - produce_plan_end String? @db.VarChar - produce_act_start String? @db.VarChar - produce_act_end String? @db.VarChar - selfins_user_id String? @db.VarChar - selfins_plan_start String? @db.VarChar - selfins_plan_end String? @db.VarChar - selfins_act_start String? @db.VarChar - selfins_act_end String? @db.VarChar - finalins_user_id String? @db.VarChar - finalins_plan_start String? @db.VarChar - finalins_plan_end String? @db.VarChar - finalins_act_start String? @db.VarChar - finalins_act_end String? @db.VarChar - ship_user_id String? @db.VarChar - ship_plan_start String? @db.VarChar - ship_plan_end String? @db.VarChar - ship_act_start String? @db.VarChar - ship_act_end String? @db.VarChar - setup_user_id String? @db.VarChar - setup_plan_start String? @db.VarChar - setup_plan_end String? @db.VarChar - setup_act_start String? @db.VarChar - setup_act_end String? @db.VarChar - writer String? @db.VarChar - design_rate String? @db.VarChar - purchase_rate String? @db.VarChar - produce_rate String? @db.VarChar - selfins_rate String? @db.VarChar - finalins_rate String? @db.VarChar - ship_rate String? @db.VarChar - setup_rate String? @db.VarChar - unit_no String? @db.VarChar - reg_date DateTime? @db.Timestamp(6) - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model pms_wbs_task_240701_2 { - objid String? @db.VarChar - contract_objid String? @db.VarChar - parent_objid String? @db.VarChar - task_name String? @db.VarChar(1000) - task_seq String? @db.VarChar - design_user_id String? @db.VarChar - design_plan_start String? @db.VarChar - design_plan_end String? @db.VarChar - design_act_start String? @db.VarChar - design_act_end String? @db.VarChar - purchase_user_id String? @db.VarChar - purchase_plan_start String? @db.VarChar - purchase_plan_end String? @db.VarChar - purchase_act_start String? @db.VarChar - purchase_act_end String? @db.VarChar - produce_user_id String? @db.VarChar - produce_plan_start String? @db.VarChar - produce_plan_end String? @db.VarChar - produce_act_start String? @db.VarChar - produce_act_end String? @db.VarChar - selfins_user_id String? @db.VarChar - selfins_plan_start String? @db.VarChar - selfins_plan_end String? @db.VarChar - selfins_act_start String? @db.VarChar - selfins_act_end String? @db.VarChar - finalins_user_id String? @db.VarChar - finalins_plan_start String? @db.VarChar - finalins_plan_end String? @db.VarChar - finalins_act_start String? @db.VarChar - finalins_act_end String? @db.VarChar - ship_user_id String? @db.VarChar - ship_plan_start String? @db.VarChar - ship_plan_end String? @db.VarChar - ship_act_start String? @db.VarChar - ship_act_end String? @db.VarChar - setup_user_id String? @db.VarChar - setup_plan_start String? @db.VarChar - setup_plan_end String? @db.VarChar - setup_act_start String? @db.VarChar - setup_act_end String? @db.VarChar - writer String? @db.VarChar - design_rate String? @db.VarChar - purchase_rate String? @db.VarChar - produce_rate String? @db.VarChar - selfins_rate String? @db.VarChar - finalins_rate String? @db.VarChar - ship_rate String? @db.VarChar - setup_rate String? @db.VarChar - unit_no String? @db.VarChar - reg_date DateTime? @db.Timestamp(6) - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model pms_wbs_task_confirm { objid Decimal? @db.Decimal target_objid Decimal? @db.Decimal @@ -3029,7 +2237,6 @@ model pms_wbs_task_confirm { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model pms_wbs_task_info { objid String @id @db.VarChar(64) target_objid String? @db.VarChar(64) @@ -3066,8 +2273,6 @@ model pms_wbs_task_standard { unit_no String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model pms_wbs_task_standard2 { task_step String? @db.VarChar(32) task_name String? @db.VarChar(256) @@ -3102,8 +2307,6 @@ model pms_wbs_template { customer_product String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model problem_mng { objid Decimal @db.Decimal project_objid String? @db.VarChar(64) @@ -3123,7 +2326,6 @@ model problem_mng { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model procurement_standard { objid String @id @db.VarChar code_name String @db.VarChar @@ -3137,7 +2339,6 @@ model procurement_standard { edit_user String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model product_group_mng { objid Decimal @db.Decimal product_group_name String? @db.VarChar(128) @@ -3148,7 +2349,6 @@ model product_group_mng { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model product_kind_spec { objid String @db.VarChar objid_parent String @db.VarChar @@ -3168,7 +2368,6 @@ model product_kind_spec { @@unique([product, mechanical_type, unit_objid, vc_code, project_no], map: "ui_product_kind_spec_01") } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model product_kind_spec_main { objid String @id @unique(map: "ui_product_kind_spec_main_01") @db.VarChar objid_contract String @db.VarChar @@ -3181,7 +2380,6 @@ model product_kind_spec_main { editer String? @db.VarChar(64) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model product_mgmt { objid Decimal @id @db.Decimal product_category String? @db.VarChar(100) @@ -3201,7 +2399,6 @@ model product_mgmt { note String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model product_mgmt_model { objid Int @id product_category String? @default("NULL::character varying") @db.VarChar(100) @@ -3215,7 +2412,6 @@ model product_mgmt_model { reg_date DateTime? @db.Date } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model product_mgmt_price_history { objid String @default("") @db.VarChar product_objid String @default("") @db.VarChar @@ -3225,7 +2421,6 @@ model product_mgmt_price_history { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model product_mgmt_upg_detail { objid Int @id target_objid Int? @@ -3236,7 +2431,6 @@ model product_mgmt_upg_detail { product_objid Int? } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model product_mgmt_upg_master { objid Int target_objid Int @@ -3247,9 +2441,8 @@ model product_mgmt_upg_master { @@id([objid, target_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model product_mng { - objid Decimal @db.Decimal + objid Decimal @id @default(0) @db.Decimal product_group_objid Decimal? @db.Decimal product_code String? @db.VarChar(128) product_name String? @db.VarChar(128) @@ -3258,10 +2451,12 @@ model product_mng { regdate DateTime? @db.Date status String? @db.VarChar(32) - @@ignore + @@index([product_code]) + @@index([product_name]) + @@index([product_group_objid]) + @@index([status]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model product_spec { objid Decimal @default(0) @db.Decimal target_objid Decimal @default(0) @db.Decimal @@ -3297,7 +2492,6 @@ model production_task { seq Int? } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model profit_loss { objid Decimal @id @db.Decimal target_objid Decimal? @db.Decimal @@ -3362,8 +2556,6 @@ model profit_loss { labor_cost Decimal? @db.Decimal } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model profit_loss_coefficient { area String? @db.VarChar(100) from_value Decimal? @db.Decimal @@ -3373,8 +2565,6 @@ model profit_loss_coefficient { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model profit_loss_coolingtime { area String? @db.VarChar material String? @db.VarChar @@ -3383,7 +2573,6 @@ model profit_loss_coolingtime { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model profit_loss_depth { area String? @db.VarChar(100) from_value Decimal? @db.Decimal @@ -3393,7 +2582,6 @@ model profit_loss_depth { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model profit_loss_lossrate { area String? @db.VarChar(100) division String? @db.VarChar(100) @@ -3404,7 +2592,6 @@ model profit_loss_lossrate { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model profit_loss_machine { area String? @db.VarChar(100) from_value Decimal? @db.Decimal @@ -3414,8 +2601,6 @@ model profit_loss_machine { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model profit_loss_pretime { area String? @db.VarChar from_value Decimal? @db.Decimal @@ -3426,7 +2611,6 @@ model profit_loss_pretime { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model profit_loss_srrate { area String? @db.VarChar(100) from_value Decimal? @db.Decimal @@ -3436,7 +2620,6 @@ model profit_loss_srrate { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model profit_loss_total { objid Decimal @id @db.Decimal target_objid Decimal? @db.Decimal @@ -3490,8 +2673,6 @@ model profit_loss_total_addlist2 { sub_material_price Decimal? @db.Decimal } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model profit_loss_weight { area String? @db.VarChar from_value Decimal? @db.Decimal @@ -3501,7 +2682,6 @@ model profit_loss_weight { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model project_mgmt { objid String @id @db.VarChar contract_objid String @db.VarChar @@ -3555,7 +2735,6 @@ model project_mgmt { overhaul_order String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model purchase_order_master { objid String @id @db.VarChar purchase_order_no String? @db.VarChar @@ -3619,430 +2798,13 @@ model purchase_order_master { @@index([multi_master_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_230403 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_231026 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_240207 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - total_supply_price String? @db.VarChar - multi_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - delivery_plan_date String? @db.VarChar - delivery_plan_qty String? @db.VarChar - unit_code_old String? @db.VarChar - purchase_order_no_org String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_240319 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - total_supply_price String? @db.VarChar - multi_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - delivery_plan_date String? @db.VarChar - delivery_plan_qty String? @db.VarChar - unit_code_old String? @db.VarChar - purchase_order_no_org String? @db.VarChar - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_240326 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - total_supply_price String? @db.VarChar - multi_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - delivery_plan_date String? @db.VarChar - delivery_plan_qty String? @db.VarChar - unit_code_old String? @db.VarChar - purchase_order_no_org String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_240402 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - total_supply_price String? @db.VarChar - multi_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - delivery_plan_date String? @db.VarChar - delivery_plan_qty String? @db.VarChar - unit_code_old String? @db.VarChar - purchase_order_no_org String? @db.VarChar - reception_status String? @db.VarChar - sales_status String? @db.VarChar - reception_date String? @db.VarChar - - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_240509 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - total_supply_price String? @db.VarChar - multi_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - delivery_plan_date String? @db.VarChar - delivery_plan_qty String? @db.VarChar - unit_code_old String? @db.VarChar - purchase_order_no_org String? @db.VarChar - reception_status String? @db.VarChar - sales_status String? @db.VarChar - reception_date String? @db.VarChar - total_real_supply_price String? @db.VarChar - total_price_txt_all String? @db.VarChar - total_price_all String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_master_240520 { - objid String? @db.VarChar - purchase_order_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - my_company_objid String? @db.VarChar - partner_objid String? @db.VarChar - delivery_date String? @db.VarChar - delivery_place String? @db.VarChar - effective_date String? @db.VarChar - payment_terms String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - purchase_date String? @db.VarChar - product_code String? @db.VarChar - sales_request_objid String? @db.VarChar - sales_mng_user_id String? @db.VarChar - title String? @db.VarChar - contract_mgmt_objid String? @db.VarChar - type String? @db.VarChar - inspect_method String? @db.VarChar - vat_method String? @db.VarChar - discount_price String? @db.VarChar - total_supply_unit_price String? @db.VarChar - total_price String? @db.VarChar - nego_rate String? @db.VarChar - total_price_txt String? @db.VarChar - supply_bus_no String? @db.VarChar - supply_user_name String? @db.VarChar - supply_user_hp String? @db.VarChar - supply_user_tel String? @db.VarChar - supply_user_fax String? @db.VarChar - supply_user_email String? @db.VarChar - supply_addr String? @db.VarChar - unit_code String? @db.VarChar - bom_report_objid String? @db.VarChar - order_type_cd String? @db.VarChar - total_supply_price String? @db.VarChar - multi_yn String? @db.VarChar - multi_master_yn String? @db.VarChar - multi_master_objid String? @db.VarChar - delivery_plan_date String? @db.VarChar - delivery_plan_qty String? @db.VarChar - unit_code_old String? @db.VarChar - purchase_order_no_org String? @db.VarChar - reception_status String? @db.VarChar - sales_status String? @db.VarChar - reception_date String? @db.VarChar - total_real_supply_price String? @db.VarChar - total_price_txt_all String? @db.VarChar - total_price_all String? @db.VarChar - discount_price_all String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model purchase_order_master_241216 { objid String? @db.VarChar purchase_order_no String? @db.VarChar @@ -4103,7 +2865,6 @@ model purchase_order_master_241216 { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model purchase_order_multi { objid String @id @unique(map: "ui_purchase_order_multi_01") @db.VarChar purchase_order_master_objid String @db.VarChar @@ -4116,7 +2877,6 @@ model purchase_order_multi { editer String? @db.VarChar(64) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model purchase_order_part { objid String @id @db.VarChar purchase_order_master_objid String? @db.VarChar @@ -4160,274 +2920,13 @@ model purchase_order_part { @@index([purchase_order_master_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_230403 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_231026 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - supply_unit_vat_price String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_240116 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - supply_unit_vat_price String? @db.VarChar - price4 String? @db.VarChar - supply_unit_vat_sum_price String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_240329 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - supply_unit_vat_price String? @db.VarChar - price4 String? @db.VarChar - supply_unit_vat_sum_price String? @db.VarChar - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_240411 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - supply_unit_vat_price String? @db.VarChar - price4 String? @db.VarChar - supply_unit_vat_sum_price String? @db.VarChar - total_order_qty String? @db.VarChar - stock_qty String? @db.VarChar - real_order_qty String? @db.VarChar - update_date DateTime? @db.Timestamp(6) - modifier String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_240509 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - supply_unit_vat_price String? @db.VarChar - price4 String? @db.VarChar - supply_unit_vat_sum_price String? @db.VarChar - total_order_qty String? @db.VarChar - stock_qty String? @db.VarChar - real_order_qty String? @db.VarChar - update_date DateTime? @db.Timestamp(6) - modifier String? @db.VarChar - real_supply_price String? @db.VarChar - bom_qty String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model purchase_order_part_240527 { - objid String? @db.VarChar - purchase_order_master_objid String? @db.VarChar - part_objid String? @db.VarChar - order_qty String? @db.VarChar - partner_price String? @db.VarChar - remark String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - part_name String? @db.VarChar - do_no String? @db.VarChar - thickness String? @db.VarChar - width String? @db.VarChar - height String? @db.VarChar - out_diameter String? @db.VarChar - length String? @db.VarChar - in_diameter String? @db.VarChar - inven_total_qty String? @db.VarChar - ld_part_objid String? @db.VarChar - spec String? @db.VarChar - maker String? @db.VarChar - supply_unit_price String? @db.VarChar - unit String? @db.VarChar - price1 String? @db.VarChar - price2 String? @db.VarChar - price3 String? @db.VarChar - part_no String? @db.VarChar - supply_unit_vat_price String? @db.VarChar - price4 String? @db.VarChar - supply_unit_vat_sum_price String? @db.VarChar - total_order_qty String? @db.VarChar - stock_qty String? @db.VarChar - real_order_qty String? @db.VarChar - update_date DateTime? @db.Timestamp(6) - modifier String? @db.VarChar - real_supply_price String? @db.VarChar - bom_qty String? @db.VarChar - qty String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model ratecal_mgmt { ratecal_mgmt_objid Decimal @default(0) @db.Decimal position String? @db.VarChar(100) @@ -4445,15 +2944,7 @@ model ratecal_mgmt { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model ratecal_mgmt_history { - ratecal_mgmt_objid Decimal @default(0) @db.Decimal - old_data String? @db.VarChar(100) - new_data String? @db.VarChar(100) - reg_date DateTime? @db.Timestamp(6) - @@ignore -} model receive_history { objid String @id @db.VarChar @@ -4467,7 +2958,6 @@ model receive_history { regdate DateTime? @db.Timestamp(6) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model rel_eo_part { objid Decimal @db.Decimal parent_objid Decimal @db.Decimal @@ -4479,7 +2969,6 @@ model rel_eo_part { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model rel_menu_auth { objid Decimal? @db.Decimal menu_objid Decimal? @db.Decimal @@ -4494,7 +2983,6 @@ model rel_menu_auth { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model rel_sample_supply_plan { objid Decimal @id @db.Decimal target_objid String? @db.VarChar(64) @@ -4504,7 +2992,6 @@ model rel_sample_supply_plan { regdate DateTime? @db.Date } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model rel_sample_supply_result { objid Decimal @id @db.Decimal target_objid String? @db.VarChar(64) @@ -4516,7 +3003,6 @@ model rel_sample_supply_result { regdate DateTime? @db.Date } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model release_mgmt { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -4534,7 +3020,6 @@ model release_mgmt { install_result String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model resource_mng { objid Decimal @id @db.Decimal part_objid String? @db.VarChar(100) @@ -4557,7 +3042,6 @@ model resource_mng { @@index([part_objid]) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model resource_price { objid Decimal @id @db.Decimal parent_objid Decimal @db.Decimal @@ -4570,7 +3054,6 @@ model resource_price { agency_price String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model route { objid Decimal @default(0) @db.Decimal target_objid Decimal? @db.Decimal @@ -4588,21 +3071,6 @@ model route { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model route_240704 { - objid Decimal? @db.Decimal - target_objid Decimal? @db.Decimal - approval_objid Decimal? @db.Decimal - route_seq String? @db.VarChar(64) - approval_title String? @db.VarChar(512) - approval_desc String? @db.VarChar(512) - writer String? @db.VarChar(32) - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar(32) - system_type String? @db.VarChar(32) - - @@ignore -} model sales_bom_part_qty { sales_bom_objid String @db.VarChar @@ -4638,28 +3106,7 @@ model sales_bom_part_qty { sales_part_code String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model sales_bom_part_qty_temp { - part_objid String? @db.VarChar - partner_objid String? @db.VarChar - partner_price String? @db.VarChar - partner_remark String? @db.VarChar - palette_code String? @db.VarChar - sourcing_code String? @db.VarChar - process1_code String? @db.VarChar - process2_code String? @db.VarChar - process3_code String? @db.VarChar - process4_code String? @db.VarChar - sales_part_code String? @db.VarChar - process_code1 String? @db.VarChar - process_code2 String? @db.VarChar - process_code3 String? @db.VarChar - process_code4 String? @db.VarChar - @@ignore -} - -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_bom_report { objid String @id @default("") @db.VarChar parent_objid String? @unique(map: "sales_bom_report_parent_objid_idx") @db.VarChar @@ -4679,7 +3126,6 @@ model sales_bom_report { modifier String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_bom_report_part { objid String @id @default("") @db.VarChar parent_objid String? @db.VarChar @@ -4705,59 +3151,8 @@ model sales_bom_report_part { @@index([parent_objid]) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model sales_bom_report_part_240422 { - objid String? @db.VarChar - parent_objid String? @db.VarChar - part_objid String? @db.VarChar - supply_objid String? @db.VarChar - price String? @db.VarChar - supply_objid1 String? @db.VarChar - price1 String? @db.VarChar(64) - supply_objid2 String? @db.VarChar(100) - price2 String? @db.VarChar(64) - supply_objid3 String? @db.VarChar(64) - price3 String? @db.VarChar(100) - supply_objid4 String? @db.VarChar(100) - price4 String? @db.VarChar(2000) - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - price_sum String? @db.VarChar - parent_part_objid String? @db.VarChar - bom_part_qty_objid String? @db.VarChar - update_date DateTime? @db.Timestamp(6) - modifier String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model sales_bom_report_part_240723 { - objid String? @db.VarChar - parent_objid String? @db.VarChar - part_objid String? @db.VarChar - supply_objid String? @db.VarChar - price String? @db.VarChar - supply_objid1 String? @db.VarChar - price1 String? @db.VarChar(64) - supply_objid2 String? @db.VarChar(100) - price2 String? @db.VarChar(64) - supply_objid3 String? @db.VarChar(64) - price3 String? @db.VarChar(100) - supply_objid4 String? @db.VarChar(100) - price4 String? @db.VarChar(2000) - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - price_sum String? @db.VarChar - parent_part_objid String? @db.VarChar - bom_part_qty_objid String? @db.VarChar - update_date DateTime? @db.Timestamp(6) - modifier String? @db.VarChar - - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model sales_bom_report_part_241218 { objid String? @db.VarChar parent_objid String? @db.VarChar @@ -4784,7 +3179,6 @@ model sales_bom_report_part_241218 { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_long_delivery { objid String @id @db.VarChar ld_part_name String @db.VarChar @@ -4799,41 +3193,8 @@ model sales_long_delivery { price String? @default("0") @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model sales_long_delivery_230402 { - objid String? @db.VarChar - ld_part_name String? @db.VarChar - spec String? @db.VarChar - form_no String? @db.VarChar - maker String? @db.VarChar - material_code String? @db.VarChar - supply_objid String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - writer String? @db.VarChar - location String? @db.VarChar - price String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model sales_long_delivery_240625 { - objid String? @db.VarChar - ld_part_name String? @db.VarChar - spec String? @db.VarChar - form_no String? @db.VarChar - maker String? @db.VarChar - material_code String? @db.VarChar - supply_objid String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - writer String? @db.VarChar - location String? @db.VarChar - price String? @db.VarChar - - @@ignore -} - -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_long_delivery_input { objid String @id(map: "sales_long_delivery_plan_pkey") @db.VarChar parent_objid String? @db.VarChar @@ -4844,20 +3205,8 @@ model sales_long_delivery_input { admin_editor String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model sales_long_delivery_input_240625 { - objid String? @db.VarChar - parent_objid String? @db.VarChar - contract_objid String? @db.VarChar - input_qty String? @db.VarChar - input_date String? @db.VarChar - admin_edit_date String? @db.VarChar - admin_editor String? @db.VarChar - @@ignore -} -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_long_delivery_predict { objid String @id @db.VarChar parent_objid String? @db.VarChar @@ -4868,7 +3217,6 @@ model sales_long_delivery_predict { contract_objid String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_part_chg { objid String @id @db.VarChar part_objid String? @db.VarChar @@ -4883,7 +3231,6 @@ model sales_part_chg { qty_child_objid String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_request_master { objid String @id @db.VarChar request_mng_no String? @db.VarChar @@ -4902,29 +3249,7 @@ model sales_request_master { remark String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments -model sales_request_master_231205 { - objid String @id @db.VarChar - request_mng_no String? @db.VarChar - category_cd String? @db.VarChar - product_group String? @db.VarChar - product String? @db.VarChar - sales_mng_user_id String? @db.VarChar - request_status String? @db.VarChar - request_status_remark String? @db.VarChar - title String? @db.VarChar - writer String? @db.VarChar - regdate DateTime? @db.Timestamp(6) - status String? @db.VarChar - release_date String? @db.VarChar - receipt_date String? @db.VarChar - order_number String? @db.VarChar - product_code String? @db.VarChar - check_user_id String? @db.VarChar - check_date DateTime? @db.Timestamp(6) -} -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sales_request_part { objid String @id @db.VarChar sales_bom_qty_objid String? @db.VarChar @@ -4944,7 +3269,6 @@ model sales_request_part { part_name String? @db.VarChar } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model sample_supply { objid Decimal @id @db.Decimal project_objid String? @db.VarChar(64) @@ -4958,8 +3282,6 @@ model sample_supply { regdate DateTime? @db.Date } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model setup_wbs_task { objid String? @unique(map: "setup_wbs_task_pk") @db.VarChar contract_objid String? @db.VarChar @@ -4986,7 +3308,6 @@ model setup_wbs_task { @@ignore } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model setup_wbs_task_standard { objid String? @unique(map: "setup_wbs_task_standard_objid_key") @db.VarChar contract_objid String? @db.VarChar @@ -5033,7 +3354,6 @@ model standard_doc_category { use_participation_date String? @default("0") @db.VarChar(32) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model standard_doc_info { objid Decimal? @db.Decimal category_objid Decimal? @db.Decimal @@ -5068,7 +3388,6 @@ model standard_doc_info { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model structural_review_proposal { objid Decimal @id @db.Decimal project_objid String? @db.VarChar(64) @@ -5103,7 +3422,6 @@ model supply_charger_mng { regdate DateTime? @db.Timestamp(6) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model supply_mng { objid Decimal @id @default(0) @db.Decimal supply_code String? @db.VarChar(100) @@ -5144,7 +3462,6 @@ model supply_mng_history { status String? @db.VarChar(32) } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model surtax { objid Decimal @default(0) @db.Decimal order_mgmt_objid Decimal? @db.Decimal @@ -5816,7 +4133,6 @@ model swpxmps_tbl { @@id([sayup1, sayup2, ayprodcd, opt], map: "pk_swpxmps_tbl") } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model swpxmpso_tbl { sayup1 String? @db.VarChar(1) sayup2 String? @db.VarChar(1) @@ -6558,92 +4874,15 @@ model table_labels { column_labels column_labels[] } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model temp1 { - t_odorderno String? @db.Char(15) - t_imitemid String? @db.VarChar(15) - t_rmduedt String? @db.VarChar(8) - t_rmorderqty Int? @db.SmallInt - t_rmrcptqty Int? @db.SmallInt - t_rmremqty Int? @db.SmallInt - t_suvndcd String? @db.VarChar(4) - t_prodcd String? @db.VarChar(8) - t_rcarrvdt String? @db.VarChar(8) - t_rcarrvdt1 String? @db.VarChar(8) - t_rcarrvdt2 String? @db.VarChar(8) - t_rcarrvdt3 String? @db.Char(8) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model temp801 { - t_irreqstno String? @db.VarChar(15) - t_itemid String? @db.VarChar(15) - t_ssissqty Int? @db.SmallInt - t_irreqstqty Int? @db.SmallInt - t_remqty Int? @db.SmallInt - t_corse String? @db.VarChar(5) - t_corsenm String? @db.VarChar(50) - t_sslotno String? @db.VarChar(18) - t_irperson String? @db.VarChar(6) - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model temp802 { - t_irreqstno2 String? @db.VarChar(15) - t_ssissueno2 String? @db.VarChar(15) - t_siseqno2 String? @db.VarChar(2) - t_itemid2 String? @db.VarChar(15) - t_ssissqty2 Int? @db.SmallInt - t_ssissqty3 Int? @db.SmallInt - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model temp803 { - t_irreqstno3 String? @db.VarChar(15) - t_itemid3 String? @db.VarChar(15) - t_ssissqty3 Int? @db.SmallInt - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model temp804 { - t_irreqstno String? @db.VarChar(14) - t_ssissueno String? @db.VarChar(14) - t_siseqno String? @db.VarChar(2) - t_itemid String? @db.VarChar(15) - t_sslotno String? @db.VarChar(17) - t_irreqstqty Int? - t_ssissqty Int? - t_remqty Int? @db.SmallInt - t_41ohonhandqty Int? @db.SmallInt - t_50ohonhandqty Int? @db.SmallInt - t_42ohonhandqty Int? @db.SmallInt - t_43ohonhandqty Int? @db.SmallInt - t_01ohonhandqty Int? @db.SmallInt - t_f0ohonhandqty Int? @db.SmallInt - t_rmremqty Int? @db.SmallInt - t_rmremqty1 Int? @db.SmallInt - @@ignore -} - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model temp805 { - t_irreqstno2 String? @db.VarChar(15) - t_ssissueno2 String? @db.VarChar(15) - t_itemid2 String? @db.VarChar(15) - - @@ignore -} - -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model template_mng { objid Int @id template_code String? @db.VarChar @@ -6654,36 +4893,12 @@ model template_mng { template_code_detail String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model test_chart { - country String? @db.VarChar - gdp String? @db.VarChar - year String? @db.VarChar - annual String? @db.VarChar - five String? @db.VarChar - chart_type String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model test_lim { - list_lim String? @db.VarChar(2000) - list_phone_no String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model test_table { - objid String @db.VarChar - multi_master_objid String? @db.VarChar - total_supply_unit_price String? @db.VarChar - @@ignore -} -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model time_sheet { objid Decimal @default(0) @db.Decimal project_mgmt_objid Decimal? @db.Decimal @@ -6701,7 +4916,6 @@ model time_sheet { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model used_mng { objid Decimal @id @default(0) @db.Decimal equipment_number String? @default("NULL::character varying") @db.VarChar(100) @@ -6740,7 +4954,6 @@ model used_mng { use_yn String? @db.VarChar(10) } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model user_info { sabun String? @db.VarChar(1024) user_id String @id(map: "user_id") @db.VarChar(1024) @@ -6767,9 +4980,11 @@ model user_info { photo Bytes? locale String? @db.VarChar company_code String? @db.VarChar(50) + + // 관계 설정 + authorities authority_sub_user[] } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model user_info_history { sabun String? @db.VarChar(1024) user_id String @db.VarChar(1024) @@ -6785,7 +5000,6 @@ model user_info_history { @@ignore } -/// This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments model work_diary { objid String @id @db.VarChar contract_objid String? @db.VarChar @@ -6804,7 +5018,6 @@ model work_diary { production_type String? @db.VarChar } -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. model work_mail_list { objid String? @db.VarChar mailtype String? @db.VarChar @@ -6812,29 +5025,3 @@ model work_mail_list { @@ignore } - -/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client. -model zz_230410_user_info { - sabun String? @db.VarChar(1024) - user_id String? @db.VarChar(1024) - user_password String? @db.VarChar(1024) - user_name String? @db.VarChar(1024) - user_name_eng String? @db.VarChar(1024) - user_name_cn String? @db.VarChar(1024) - dept_code String? @db.VarChar(1024) - dept_name String? @db.VarChar(1024) - position_code String? @db.VarChar(1024) - position_name String? @db.VarChar(1024) - email String? @db.VarChar(1024) - tel String? @db.VarChar(1024) - cell_phone String? @db.VarChar(1024) - user_type String? @db.VarChar(1024) - user_type_name String? @db.VarChar(1024) - regdate DateTime? @db.Timestamp(6) - data_type String? @db.VarChar(64) - status String? @db.VarChar(32) - end_date DateTime? @db.Timestamp(6) - fax_no String? @db.VarChar - - @@ignore -} \ No newline at end of file diff --git a/backend-node/src/controllers/adminController.ts b/backend-node/src/controllers/adminController.ts index 6b480304..17576407 100644 --- a/backend-node/src/controllers/adminController.ts +++ b/backend-node/src/controllers/adminController.ts @@ -662,61 +662,53 @@ export async function getLangKeyList( user: req.user, }); - // 실제 데이터베이스에서 데이터 조회 - const client = new Client({ - host: process.env.DB_HOST || "localhost", - port: parseInt(process.env.DB_PORT || "5432"), - database: process.env.DB_NAME || "ilshin", - user: process.env.DB_USER || "postgres", - password: process.env.DB_PASSWORD || "postgres", + // Prisma ORM을 사용한 다국어 키 목록 조회 + const result = await prisma.multi_lang_key_master.findMany({ + orderBy: [ + { company_code: "asc" }, + { menu_name: "asc" }, + { lang_key: "asc" }, + ], + select: { + key_id: true, + company_code: true, + menu_name: true, + lang_key: true, + description: true, + is_active: true, + created_date: true, + created_by: true, + updated_date: true, + updated_by: true, + }, }); - await client.connect(); + const langKeys = result.map((row) => ({ + keyId: row.key_id, + companyCode: row.company_code, + menuName: row.menu_name, + langKey: row.lang_key, + description: row.description, + isActive: row.is_active, + createdDate: row.created_date?.toISOString(), + createdBy: row.created_by, + updatedDate: row.updated_date?.toISOString(), + updatedBy: row.updated_by, + })); - try { - const query = ` - SELECT - key_id as "keyId", - company_code as "companyCode", - menu_name as "menuName", - lang_key as "langKey", - description, - is_active as "isActive", - created_date as "createdDate", - created_by as "createdBy", - updated_date as "updatedDate", - updated_by as "updatedBy" - FROM multi_lang_key_master - ORDER BY company_code, menu_name, lang_key - `; + // 프론트엔드에서 기대하는 응답 형식으로 변환 + const response: ApiResponse = { + success: true, + message: "다국어 키 목록 조회 성공", + data: langKeys, + }; - const result = await client.query(query); - const langKeys = result.rows.map((row) => ({ - ...row, - createdDate: row.createdDate - ? new Date(row.createdDate).toISOString() - : undefined, - updatedDate: row.updatedDate - ? new Date(row.updatedDate).toISOString() - : undefined, - })); + logger.info("다국어 키 목록 조회 성공", { + totalCount: langKeys.length, + response: response, + }); - // 프론트엔드에서 기대하는 응답 형식으로 변환 - const response: ApiResponse = { - success: true, - message: "다국어 키 목록 조회 성공", - data: langKeys, - }; - - logger.info("다국어 키 목록 조회 성공", { - totalCount: langKeys.length, - response: response, - }); - - res.status(200).json(response); - } finally { - await client.end(); - } + res.status(200).json(response); } catch (error) { logger.error("다국어 키 목록 조회 실패:", error); res.status(500).json({ @@ -1026,56 +1018,36 @@ export async function saveMenu( const menuData = req.body; logger.info("메뉴 저장 요청", { menuData, user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM을 사용한 메뉴 저장 + const savedMenu = await prisma.menu_info.create({ + data: { + objid: Date.now(), // 고유 ID 생성 + menu_type: menuData.menuType ? Number(menuData.menuType) : null, + parent_obj_id: menuData.parentObjId + ? Number(menuData.parentObjId) + : null, + menu_name_kor: menuData.menuNameKor, + menu_name_eng: menuData.menuNameEng || null, + seq: menuData.seq ? Number(menuData.seq) : null, + menu_url: menuData.menuUrl || null, + menu_desc: menuData.menuDesc || null, + writer: req.user?.userId || "admin", + regdate: new Date(), + status: menuData.status || "active", + system_name: menuData.systemName || "PLM", + company_code: menuData.companyCode || "*", + lang_key: menuData.langKey || null, + lang_key_desc: menuData.langKeyDesc || null, + }, }); - await client.connect(); - - // 실제 데이터베이스에 저장 - const query = ` - INSERT INTO menu_info ( - objid, menu_type, parent_obj_id, menu_name_kor, menu_name_eng, - seq, menu_url, menu_desc, writer, regdate, status, - system_name, company_code, lang_key, lang_key_desc - ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15 - ) RETURNING * - `; - - const values = [ - Date.now(), // objid - menuData.menuType || null, // menu_type - menuData.parentObjId || null, // parent_obj_id - menuData.menuNameKor, // menu_name_kor - menuData.menuNameEng || null, // menu_name_eng - menuData.seq || null, // seq - menuData.menuUrl || null, // menu_url - menuData.menuDesc || null, // menu_desc - req.user?.userId || "admin", // writer - new Date(), // regdate - menuData.status || "active", // status - menuData.systemName || "PLM", // system_name - menuData.companyCode || "*", // company_code - menuData.langKey || null, // lang_key - menuData.langKeyDesc || null, // lang_key_desc - ]; - - const result = await client.query(query, values); - const savedMenu = result.rows[0]; - - await client.end(); - logger.info("메뉴 저장 성공", { savedMenu }); const response: ApiResponse = { success: true, message: "메뉴가 성공적으로 저장되었습니다.", data: { - objid: savedMenu.objid, + objid: savedMenu.objid.toString(), // BigInt를 문자열로 변환 menuNameKor: savedMenu.menu_name_kor, menuNameEng: savedMenu.menu_name_eng, menuUrl: savedMenu.menu_url, @@ -1112,65 +1084,29 @@ export async function updateMenu( user: req.user, }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM을 사용한 메뉴 수정 + const updatedMenu = await prisma.menu_info.update({ + where: { + objid: Number(menuId), + }, + data: { + menu_type: menuData.menuType ? Number(menuData.menuType) : null, + parent_obj_id: menuData.parentObjId + ? Number(menuData.parentObjId) + : null, + menu_name_kor: menuData.menuNameKor, + menu_name_eng: menuData.menuNameEng || null, + seq: menuData.seq ? Number(menuData.seq) : null, + menu_url: menuData.menuUrl || null, + menu_desc: menuData.menuDesc || null, + status: menuData.status || "active", + system_name: menuData.systemName || "PLM", + company_code: menuData.companyCode || "*", + lang_key: menuData.langKey || null, + lang_key_desc: menuData.langKeyDesc || null, + }, }); - await client.connect(); - - // 실제 데이터베이스에서 메뉴 수정 - const query = ` - UPDATE menu_info - SET - menu_type = $1, - parent_obj_id = $2, - menu_name_kor = $3, - menu_name_eng = $4, - seq = $5, - menu_url = $6, - menu_desc = $7, - status = $8, - system_name = $9, - company_code = $10, - lang_key = $11, - lang_key_desc = $12 - WHERE objid = $13 - RETURNING * - `; - - const values = [ - menuData.menuType ? BigInt(menuData.menuType) : null, // menu_type - menuData.parentObjId ? BigInt(menuData.parentObjId) : null, // parent_obj_id - menuData.menuNameKor, // menu_name_kor - menuData.menuNameEng || null, // menu_name_eng - menuData.seq ? BigInt(menuData.seq) : null, // seq - menuData.menuUrl || null, // menu_url - menuData.menuDesc || null, // menu_desc - menuData.status || "active", // status - menuData.systemName || "PLM", // system_name - menuData.companyCode || "*", // company_code - menuData.langKey || null, // lang_key - menuData.langKeyDesc || null, // lang_key_desc - BigInt(menuId), // objid (WHERE 조건) - ]; - - const result = await client.query(query, values); - - if (result.rowCount === 0) { - await client.end(); - res.status(404).json({ - success: false, - message: "수정할 메뉴를 찾을 수 없습니다.", - }); - return; - } - - const updatedMenu = result.rows[0]; - await client.end(); - logger.info("메뉴 수정 성공", { updatedMenu }); const response: ApiResponse = { @@ -1210,36 +1146,13 @@ export async function deleteMenu( const { menuId } = req.params; logger.info(`메뉴 삭제 요청: menuId = ${menuId}`, { user: req.user }); - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM을 사용한 메뉴 삭제 + const deletedMenu = await prisma.menu_info.delete({ + where: { + objid: Number(menuId), + }, }); - await client.connect(); - - // 실제 데이터베이스에서 메뉴 삭제 - const query = ` - DELETE FROM menu_info - WHERE objid = $1 - RETURNING * - `; - - const result = await client.query(query, [BigInt(menuId)]); - - if (result.rowCount === 0) { - await client.end(); - res.status(404).json({ - success: false, - message: "삭제할 메뉴를 찾을 수 없습니다.", - }); - return; - } - - const deletedMenu = result.rows[0]; - await client.end(); - logger.info("메뉴 삭제 성공", { deletedMenu }); const response: ApiResponse = { @@ -1287,15 +1200,7 @@ export async function deleteMenusBatch( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", - }); - - await client.connect(); - + // Prisma ORM을 사용한 메뉴 일괄 삭제 let deletedCount = 0; let failedCount = 0; const deletedMenus: any[] = []; @@ -1304,17 +1209,18 @@ export async function deleteMenusBatch( // 각 메뉴 ID에 대해 삭제 시도 for (const menuId of menuIds) { try { - const query = ` - DELETE FROM menu_info - WHERE objid = $1 - RETURNING * - `; + const deletedMenu = await prisma.menu_info.delete({ + where: { + objid: Number(menuId), + }, + }); - const result = await client.query(query, [BigInt(menuId)]); - - if (result.rowCount && result.rowCount > 0) { + if (deletedMenu) { deletedCount++; - deletedMenus.push(result.rows[0]); + deletedMenus.push({ + ...deletedMenu, + objid: deletedMenu.objid.toString(), + }); } else { failedCount++; failedMenuIds.push(menuId); @@ -1326,8 +1232,6 @@ export async function deleteMenusBatch( } } - await client.end(); - logger.info("메뉴 일괄 삭제 완료", { total: menuIds.length, deletedCount, @@ -1561,125 +1465,94 @@ export const getUserInfo = async (req: AuthenticatedRequest, res: Response) => { return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM을 사용한 사용자 상세 정보 조회 + const user = await prisma.user_info.findUnique({ + where: { + user_id: userId, + }, }); - await client.connect(); - - try { - // 사용자 상세 정보 조회 쿼리 - const query = ` - SELECT - u.sabun, - u.user_id, - u.user_name, - u.user_name_eng, - u.user_name_cn, - u.dept_code, - u.dept_name, - u.position_code, - u.position_name, - u.email, - u.tel, - u.cell_phone, - u.user_type, - u.user_type_name, - u.regdate, - u.status, - u.end_date, - u.fax_no, - u.partner_objid, - u.rank, - u.photo, - u.locale, - u.company_code, - u.data_type, - d.dept_name as dept_name_full, - d.parent_dept_code, - d.location, - d.location_name, - d.sales_yn, - d.company_name as dept_company_name - FROM user_info u - LEFT JOIN dept_info d ON u.dept_code = d.dept_code - WHERE u.user_id = $1 - `; - - const result = await client.query(query, [userId]); - - if (result.rows.length === 0) { - res.status(404).json({ - success: false, - message: "사용자를 찾을 수 없습니다.", - error: { - code: "USER_NOT_FOUND", - details: `User ID: ${userId}`, - }, - }); - return; - } - - const user = result.rows[0]; - - // 응답 데이터 가공 - const userInfo = { - sabun: user.sabun, - userId: user.user_id, - userName: user.user_name, - userNameEng: user.user_name_eng, - userNameCn: user.user_name_cn, - deptCode: user.dept_code, - deptName: user.dept_name || user.dept_name_full, - positionCode: user.position_code, - positionName: user.position_name, - email: user.email, - tel: user.tel, - cellPhone: user.cell_phone, - userType: user.user_type, - userTypeName: user.user_type_name, - regdate: user.regdate ? user.regdate.toISOString() : null, - status: user.status || "active", - endDate: user.end_date ? user.end_date.toISOString() : null, - faxNo: user.fax_no, - partnerObjid: user.partner_objid, - rank: user.rank, - photo: user.photo - ? `data:image/jpeg;base64,${user.photo.toString("base64")}` - : null, - locale: user.locale, - companyCode: user.company_code, - dataType: user.data_type, - // 부서 정보 - deptInfo: { - deptCode: user.dept_code, - deptName: user.dept_name || user.dept_name_full, - parentDeptCode: user.parent_dept_code, - location: user.location, - locationName: user.location_name, - salesYn: user.sales_yn, - companyName: user.dept_company_name, + if (!user) { + res.status(404).json({ + success: false, + message: "사용자를 찾을 수 없습니다.", + error: { + code: "USER_NOT_FOUND", + details: `User ID: ${userId}`, }, - }; - - const response = { - success: true, - data: userInfo, - message: "사용자 상세 정보 조회 성공", - }; - - logger.info("사용자 상세 정보 조회 성공", { - userId, - userName: user.user_name, }); - - res.status(200).json(response); - } finally { - await client.end(); + return; } + + // 부서 정보 별도 조회 + const deptInfo = user.dept_code + ? await prisma.dept_info.findUnique({ + where: { + dept_code: user.dept_code, + }, + select: { + dept_name: true, + parent_dept_code: true, + location: true, + location_name: true, + sales_yn: true, + company_name: true, + }, + }) + : null; + + // 응답 데이터 가공 + const userInfo = { + sabun: user.sabun, + userId: user.user_id, + userName: user.user_name, + userNameEng: user.user_name_eng, + userNameCn: user.user_name_cn, + deptCode: user.dept_code, + deptName: user.dept_name, + positionCode: user.position_code, + positionName: user.position_name, + email: user.email, + tel: user.tel, + cellPhone: user.cell_phone, + userType: user.user_type, + userTypeName: user.user_type_name, + regdate: user.regdate ? user.regdate.toISOString() : null, + status: user.status || "active", + endDate: user.end_date ? user.end_date.toISOString() : null, + faxNo: user.fax_no, + partnerObjid: user.partner_objid, + rank: user.rank, + photo: user.photo + ? `data:image/jpeg;base64,${user.photo.toString("base64")}` + : null, + locale: user.locale, + companyCode: user.company_code, + dataType: user.data_type, + // 부서 정보 + deptInfo: { + deptCode: user.dept_code, + deptName: deptInfo?.dept_name, + parentDeptCode: deptInfo?.parent_dept_code, + location: deptInfo?.location, + locationName: deptInfo?.location_name, + salesYn: deptInfo?.sales_yn, + companyName: deptInfo?.company_name, + }, + }; + + const response = { + success: true, + data: userInfo, + message: "사용자 상세 정보 조회 성공", + }; + + logger.info("사용자 상세 정보 조회 성공", { + userId, + userName: user.user_name, + }); + + res.status(200).json(response); } catch (error) { logger.error("사용자 상세 정보 조회 실패", { error, @@ -1955,98 +1828,66 @@ export const changeUserStatus = async ( return; } - // 복잡한 상태 변경은 직접 쿼리 사용 - const client = new Client({ - connectionString: config.databaseUrl, + // Prisma ORM을 사용한 사용자 상태 변경 + // 1. 사용자 존재 여부 확인 + const currentUser = await prisma.user_info.findUnique({ + where: { + user_id: userId, + }, + select: { + user_id: true, + user_name: true, + status: true, + }, }); - try { - // 1. Prisma ORM으로 사용자 존재 여부 확인 - const currentUser = await prisma.user_info.findUnique({ - where: { - user_id: userId, - }, - select: { - user_id: true, - user_name: true, - status: true, - }, + if (!currentUser) { + res.status(404).json({ + result: false, + msg: "사용자를 찾을 수 없습니다.", + }); + return; + } + + // 2. 상태 변경 데이터 준비 + let updateData: any = { + status: status, + }; + + // active/inactive에 따른 END_DATE 처리 + if (status === "inactive") { + updateData.end_date = new Date(); + } else if (status === "active") { + updateData.end_date = null; + } + + // 3. Prisma ORM으로 상태 변경 실행 + const updateResult = await prisma.user_info.update({ + where: { + user_id: userId, + }, + data: updateData, + }); + + if (updateResult) { + // 사용자 이력 저장은 user_info_history 테이블이 @@ignore 상태이므로 생략 + + logger.info("사용자 상태 변경 성공", { + userId, + oldStatus: currentUser.status, + newStatus: status, + updatedBy: req.user?.userId, }); - if (!currentUser) { - res.status(404).json({ - result: false, - msg: "사용자를 찾을 수 없습니다.", - }); - return; - } - - await client.connect(); - - // 2. 상태 변경 쿼리 실행 - let updateQuery = ` - UPDATE user_info - SET status = $1 - `; - - const queryParams = [status]; - - // active/inactive에 따른 END_DATE 처리 - if (status === "inactive") { - updateQuery += `, end_date = NOW()`; - } else if (status === "active") { - updateQuery += `, end_date = NULL`; - } - - updateQuery += ` WHERE user_id = $2`; - queryParams.push(userId); - - const updateResult = await client.query(updateQuery, queryParams); - - if (updateResult.rowCount && updateResult.rowCount > 0) { - // 3. 사용자 이력 저장 (선택적) - try { - await client.query( - ` - INSERT INTO user_info_history - (user_id, user_name, dept_code, dept_name, user_type_name, history_type, writer, reg_date, status, sabun) - VALUES ($1, $2, '', '', '', '사용자 상태 변경', $3, NOW(), $4, '') - `, - [ - userId, - currentUser.user_name || userId, - req.user?.userId || "system", - status, - ] - ); - } catch (historyError) { - logger.warn("사용자 이력 저장 실패", { - error: historyError, - userId, - status, - }); - // 이력 저장 실패는 치명적이지 않으므로 계속 진행 - } - - logger.info("사용자 상태 변경 성공", { - userId, - oldStatus: currentUser.status, - newStatus: status, - updatedBy: req.user?.userId, - }); - - res.json({ - result: true, - msg: `사용자 상태가 ${status === "active" ? "활성" : "비활성"}으로 변경되었습니다.`, - }); - } else { - res.status(400).json({ - result: false, - msg: "사용자 상태 변경에 실패했습니다.", - }); - } - } finally { - await client.end(); + res.json({ + result: true, + msg: `사용자 상태가 ${status === "active" ? "활성" : "비활성"}으로 변경되었습니다.`, + }); + } else { + res.status(400).json({ + result: false, + msg: "사용자 상태 변경에 실패했습니다.", + }); } } catch (error) { logger.error("사용자 상태 변경 중 오류 발생", { @@ -2315,63 +2156,36 @@ export const updateCompany = async ( return; } - // PostgreSQL 클라이언트 생성 - const client = new Client({ - connectionString: - process.env.DATABASE_URL || - "postgresql://postgres:postgres@localhost:5432/ilshin", + // Prisma ORM으로 회사명 중복 체크 (자기 자신 제외) + const duplicateCompany = await prisma.company_mng.findFirst({ + where: { + company_name: company_name.trim(), + company_code: { + not: companyCode, + }, + }, }); - await client.connect(); + if (duplicateCompany) { + res.status(400).json({ + success: false, + message: "이미 등록된 회사명입니다.", + errorCode: "COMPANY_NAME_DUPLICATE", + }); + return; + } + // Prisma ORM으로 회사 정보 수정 try { - // 회사명 중복 체크 (자기 자신 제외) - const duplicateCheckQuery = ` - SELECT COUNT(*) as count - FROM company_mng - WHERE company_name = $1 AND company_code != $2 - `; - - const duplicateResult = await client.query(duplicateCheckQuery, [ - company_name.trim(), - companyCode, - ]); - - if (parseInt(duplicateResult.rows[0].count) > 0) { - res.status(400).json({ - success: false, - message: "이미 등록된 회사명입니다.", - errorCode: "COMPANY_NAME_DUPLICATE", - }); - return; - } - - // 회사 정보 수정 - const updateQuery = ` - UPDATE company_mng - SET company_name = $1, status = $2 - WHERE company_code = $3 - RETURNING * - `; - - const updateValues = [ - company_name.trim(), - status || "active", - companyCode, - ]; - - const updateResult = await client.query(updateQuery, updateValues); - - if (updateResult.rows.length === 0) { - res.status(404).json({ - success: false, - message: "해당 회사를 찾을 수 없습니다.", - errorCode: "COMPANY_NOT_FOUND", - }); - return; - } - - const updatedCompany = updateResult.rows[0]; + const updatedCompany = await prisma.company_mng.update({ + where: { + company_code: companyCode, + }, + data: { + company_name: company_name.trim(), + status: status || "active", + }, + }); logger.info("회사 정보 수정 성공", { companyCode: updatedCompany.company_code, @@ -2392,8 +2206,17 @@ export const updateCompany = async ( }; res.status(200).json(response); - } finally { - await client.end(); + } catch (updateError: any) { + if (updateError.code === "P2025") { + // Prisma error code for "Record to update not found" + res.status(404).json({ + success: false, + message: "해당 회사를 찾을 수 없습니다.", + errorCode: "COMPANY_NOT_FOUND", + }); + return; + } + throw updateError; } } catch (error) { logger.error("회사 정보 수정 실패", { error, body: req.body }); @@ -2639,9 +2462,6 @@ export const resetUserPassword = async ( return; } - // 복잡한 암호화 로직은 직접 쿼리 사용 - const client = new Client({ connectionString: config.databaseUrl }); - try { // 1. Prisma ORM으로 사용자 존재 여부 확인 const currentUser = await prisma.user_info.findUnique({ @@ -2664,8 +2484,6 @@ export const resetUserPassword = async ( return; } - await client.connect(); - // 2. 비밀번호 암호화 (기존 Java 로직과 동일) let encryptedPassword: string; try { @@ -2693,31 +2511,18 @@ export const resetUserPassword = async ( return; } - // 3. 비밀번호 업데이트 실행 - const updateResult = await client.query( - "UPDATE user_info SET user_password = $1 WHERE user_id = $2", - [encryptedPassword, userId] - ); + // 3. Prisma ORM으로 비밀번호 업데이트 실행 + const updateResult = await prisma.user_info.update({ + where: { + user_id: userId, + }, + data: { + user_password: encryptedPassword, + }, + }); - if (updateResult.rowCount && updateResult.rowCount > 0) { - // 4. 이력 저장 (선택적) - try { - const writer = req.user?.userId || "system"; - await client.query( - ` - INSERT INTO user_info_history - (sabun, user_id, user_name, dept_code, dept_name, user_type_name, history_type, writer, regdate, status) - VALUES ('', $1, $2, '', '', '', '비밀번호 초기화', $3, NOW(), '') - `, - [userId, currentUser.user_name || userId, writer] - ); - } catch (historyError) { - logger.warn("비밀번호 초기화 이력 저장 실패", { - error: historyError, - userId, - }); - // 이력 저장 실패해도 비밀번호 초기화는 성공으로 처리 - } + if (updateResult) { + // 이력 저장은 user_info_history 테이블이 @@ignore 상태이므로 생략 logger.info("비밀번호 초기화 성공", { userId, @@ -2749,7 +2554,5 @@ export const resetUserPassword = async ( message: "비밀번호 초기화 중 시스템 오류가 발생했습니다.", msg: "비밀번호 초기화 중 시스템 오류가 발생했습니다.", }); - } finally { - await client.end(); } }; diff --git a/backend-node/src/services/adminService.ts b/backend-node/src/services/adminService.ts index 2955e579..cf827872 100644 --- a/backend-node/src/services/adminService.ts +++ b/backend-node/src/services/adminService.ts @@ -333,23 +333,36 @@ export class AdminService { try { logger.info(`AdminService.getMenuInfo 시작 - menuId: ${menuId}`); - // menu_info 모델이 @@ignore로 설정되어 있으므로 $queryRaw 사용 - const menuInfo = await prisma.$queryRaw` - SELECT - MI.*, - COALESCE(CM.COMPANY_NAME, '미지정') AS COMPANY_NAME - FROM MENU_INFO MI - LEFT JOIN COMPANY_MNG CM ON MI.COMPANY_CODE = CM.COMPANY_CODE - WHERE MI.OBJID = ${parseInt(menuId)}::numeric - LIMIT 1 - `; + // Prisma ORM을 사용한 메뉴 정보 조회 (회사 정보 포함) + const menuInfo = await prisma.menu_info.findUnique({ + where: { + objid: Number(menuId), + }, + include: { + company: { + select: { + company_name: true, + }, + }, + }, + }); - if (!menuInfo || menuInfo.length === 0) { + if (!menuInfo) { return null; } - logger.info("메뉴 정보 조회 결과:", menuInfo[0]); - return menuInfo[0]; + // 응답 형식 조정 (기존 형식과 호환성 유지) + const result = { + ...menuInfo, + objid: menuInfo.objid.toString(), // BigInt를 문자열로 변환 + menu_type: menuInfo.menu_type?.toString(), + parent_obj_id: menuInfo.parent_obj_id?.toString(), + seq: menuInfo.seq?.toString(), + company_name: menuInfo.company?.company_name || "미지정", + }; + + logger.info("메뉴 정보 조회 결과:", result); + return result; } catch (error) { logger.error("AdminService.getMenuInfo 오류:", error); throw error; diff --git a/backend-node/src/services/authService.ts b/backend-node/src/services/authService.ts index a7e32d5c..60ccb263 100644 --- a/backend-node/src/services/authService.ts +++ b/backend-node/src/services/authService.ts @@ -155,23 +155,35 @@ export class AuthService { return null; } - // 권한 정보 조회 (기존 Java 로직과 동일) - const authInfo = await prisma.$queryRaw>` - SELECT ARRAY_TO_STRING(ARRAY_AGG(AM.AUTH_NAME), ',') AS AUTH_NAME - FROM AUTHORITY_MASTER AM, AUTHORITY_SUB_USER ASU - WHERE AM.OBJID = ASU.MASTER_OBJID - AND ASU.USER_ID = ${userId} - GROUP BY ASU.USER_ID - `; + // 권한 정보 조회 (Prisma ORM 사용) + const authInfo = await prisma.authority_sub_user.findMany({ + where: { + user_id: userId, + }, + include: { + authority_master: { + select: { + auth_name: true, + }, + }, + }, + }); - // 회사 정보 조회 (기존 Java 로직과 동일) - const companyInfo = await prisma.$queryRaw< - Array<{ company_name: string }> - >` - SELECT COALESCE(CM.COMPANY_NAME, '미지정') AS COMPANY_NAME - FROM COMPANY_MNG CM - WHERE CM.COMPANY_CODE = ${userInfo.company_code || "ILSHIN"} - `; + // 권한명들을 쉼표로 연결 + const authNames = authInfo + .filter((auth) => auth.authority_master?.auth_name) + .map((auth) => auth.authority_master!.auth_name!) + .join(","); + + // 회사 정보 조회 (Prisma ORM 사용으로 변경) + const companyInfo = await prisma.company_mng.findFirst({ + where: { + company_code: userInfo.company_code || "ILSHIN", + }, + select: { + company_name: true, + }, + }); // PersonBean 형태로 변환 (null 값을 undefined로 변환) const personBean: PersonBean = { @@ -189,9 +201,11 @@ export class AuthService { userType: userInfo.user_type || undefined, userTypeName: userInfo.user_type_name || undefined, partnerObjid: userInfo.partner_objid || undefined, - authName: authInfo.length > 0 ? authInfo[0].auth_name : undefined, + authName: authNames || undefined, companyCode: userInfo.company_code || "ILSHIN", - photo: userInfo.photo ? `data:image/jpeg;base64,${userInfo.photo.toString('base64')}` : undefined, + photo: userInfo.photo + ? `data:image/jpeg;base64,${userInfo.photo.toString("base64")}` + : undefined, locale: userInfo.locale || "KR", };