회사관리 등록기능 오류 수정
This commit is contained in:
parent
eb1a6aa206
commit
6cac3dfa3f
|
|
@ -1976,3 +1976,330 @@ export const saveUser = async (req: AuthenticatedRequest, res: Response) => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /api/admin/companies
|
||||||
|
* 회사 등록 API
|
||||||
|
* 기존 Java AdminController의 회사 등록 기능 포팅
|
||||||
|
*/
|
||||||
|
export const createCompany = async (
|
||||||
|
req: AuthenticatedRequest,
|
||||||
|
res: Response
|
||||||
|
): Promise<void> => {
|
||||||
|
try {
|
||||||
|
logger.info("회사 등록 요청", {
|
||||||
|
body: req.body,
|
||||||
|
user: req.user,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { company_name } = req.body;
|
||||||
|
|
||||||
|
// 필수 입력값 검증
|
||||||
|
if (!company_name || !company_name.trim()) {
|
||||||
|
res.status(400).json({
|
||||||
|
success: false,
|
||||||
|
message: "회사명을 입력해주세요.",
|
||||||
|
errorCode: "COMPANY_NAME_REQUIRED",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PostgreSQL 클라이언트 생성
|
||||||
|
const client = new Client({
|
||||||
|
connectionString:
|
||||||
|
process.env.DATABASE_URL ||
|
||||||
|
"postgresql://postgres:postgres@localhost:5432/ilshin",
|
||||||
|
});
|
||||||
|
|
||||||
|
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
|
||||||
|
FROM company_mng
|
||||||
|
WHERE company_code LIKE 'COMPANY_%'
|
||||||
|
`;
|
||||||
|
|
||||||
|
const codeResult = await client.query(codeQuery);
|
||||||
|
const nextNumber = codeResult.rows[0].next_number;
|
||||||
|
const companyCode = `COMPANY_${nextNumber}`;
|
||||||
|
|
||||||
|
// 회사 정보 저장
|
||||||
|
const insertQuery = `
|
||||||
|
INSERT INTO company_mng (
|
||||||
|
company_code,
|
||||||
|
company_name,
|
||||||
|
writer,
|
||||||
|
regdate,
|
||||||
|
status
|
||||||
|
) VALUES ($1, $2, $3, $4, $5)
|
||||||
|
RETURNING *
|
||||||
|
`;
|
||||||
|
|
||||||
|
const writer = req.user
|
||||||
|
? `${req.user.userName}(${req.user.userId})`
|
||||||
|
: "시스템";
|
||||||
|
const insertValues = [
|
||||||
|
companyCode,
|
||||||
|
company_name.trim(),
|
||||||
|
writer,
|
||||||
|
new Date(),
|
||||||
|
"active",
|
||||||
|
];
|
||||||
|
|
||||||
|
const insertResult = await client.query(insertQuery, insertValues);
|
||||||
|
const createdCompany = insertResult.rows[0];
|
||||||
|
|
||||||
|
logger.info("회사 등록 성공", {
|
||||||
|
companyCode: createdCompany.company_code,
|
||||||
|
companyName: createdCompany.company_name,
|
||||||
|
writer: createdCompany.writer,
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = {
|
||||||
|
success: true,
|
||||||
|
message: "회사가 성공적으로 등록되었습니다.",
|
||||||
|
data: {
|
||||||
|
company_code: createdCompany.company_code,
|
||||||
|
company_name: createdCompany.company_name,
|
||||||
|
writer: createdCompany.writer,
|
||||||
|
regdate: createdCompany.regdate,
|
||||||
|
status: createdCompany.status,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
res.status(201).json(response);
|
||||||
|
} finally {
|
||||||
|
await client.end();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
logger.error("회사 등록 실패", { error, body: req.body });
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "회사 등록 중 오류가 발생했습니다.",
|
||||||
|
errorCode: "COMPANY_CREATE_ERROR",
|
||||||
|
error: error instanceof Error ? error.message : "Unknown error",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PUT /api/admin/companies/:companyCode
|
||||||
|
* 회사 정보 수정 API
|
||||||
|
*/
|
||||||
|
export const updateCompany = async (
|
||||||
|
req: AuthenticatedRequest,
|
||||||
|
res: Response
|
||||||
|
): Promise<void> => {
|
||||||
|
try {
|
||||||
|
const { companyCode } = req.params;
|
||||||
|
const { company_name, status } = req.body;
|
||||||
|
|
||||||
|
logger.info("회사 정보 수정 요청", {
|
||||||
|
companyCode,
|
||||||
|
body: req.body,
|
||||||
|
user: req.user,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 필수 입력값 검증
|
||||||
|
if (!company_name || !company_name.trim()) {
|
||||||
|
res.status(400).json({
|
||||||
|
success: false,
|
||||||
|
message: "회사명을 입력해주세요.",
|
||||||
|
errorCode: "COMPANY_NAME_REQUIRED",
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// PostgreSQL 클라이언트 생성
|
||||||
|
const client = new Client({
|
||||||
|
connectionString:
|
||||||
|
process.env.DATABASE_URL ||
|
||||||
|
"postgresql://postgres:postgres@localhost:5432/ilshin",
|
||||||
|
});
|
||||||
|
|
||||||
|
await client.connect();
|
||||||
|
|
||||||
|
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];
|
||||||
|
|
||||||
|
logger.info("회사 정보 수정 성공", {
|
||||||
|
companyCode: updatedCompany.company_code,
|
||||||
|
companyName: updatedCompany.company_name,
|
||||||
|
status: updatedCompany.status,
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = {
|
||||||
|
success: true,
|
||||||
|
message: "회사 정보가 수정되었습니다.",
|
||||||
|
data: {
|
||||||
|
company_code: updatedCompany.company_code,
|
||||||
|
company_name: updatedCompany.company_name,
|
||||||
|
writer: updatedCompany.writer,
|
||||||
|
regdate: updatedCompany.regdate,
|
||||||
|
status: updatedCompany.status,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
res.status(200).json(response);
|
||||||
|
} finally {
|
||||||
|
await client.end();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
logger.error("회사 정보 수정 실패", { error, body: req.body });
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "회사 정보 수정 중 오류가 발생했습니다.",
|
||||||
|
errorCode: "COMPANY_UPDATE_ERROR",
|
||||||
|
error: error instanceof Error ? error.message : "Unknown error",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DELETE /api/admin/companies/:companyCode
|
||||||
|
* 회사 삭제 API
|
||||||
|
*/
|
||||||
|
export const deleteCompany = async (
|
||||||
|
req: AuthenticatedRequest,
|
||||||
|
res: Response
|
||||||
|
): Promise<void> => {
|
||||||
|
try {
|
||||||
|
const { companyCode } = req.params;
|
||||||
|
|
||||||
|
logger.info("회사 삭제 요청", {
|
||||||
|
companyCode,
|
||||||
|
user: req.user,
|
||||||
|
});
|
||||||
|
|
||||||
|
// PostgreSQL 클라이언트 생성
|
||||||
|
const client = new Client({
|
||||||
|
connectionString:
|
||||||
|
process.env.DATABASE_URL ||
|
||||||
|
"postgresql://postgres:postgres@localhost:5432/ilshin",
|
||||||
|
});
|
||||||
|
|
||||||
|
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,
|
||||||
|
});
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
logger.error("회사 삭제 실패", { error });
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
message: "회사 삭제 중 오류가 발생했습니다.",
|
||||||
|
errorCode: "COMPANY_DELETE_ERROR",
|
||||||
|
error: error instanceof Error ? error.message : "Unknown error",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,9 @@ import {
|
||||||
saveUser, // 사용자 등록/수정
|
saveUser, // 사용자 등록/수정
|
||||||
getCompanyList,
|
getCompanyList,
|
||||||
getCompanyListFromDB, // 실제 DB에서 회사 목록 조회
|
getCompanyListFromDB, // 실제 DB에서 회사 목록 조회
|
||||||
|
createCompany, // 회사 등록
|
||||||
|
updateCompany, // 회사 수정
|
||||||
|
deleteCompany, // 회사 삭제
|
||||||
getUserLocale,
|
getUserLocale,
|
||||||
setUserLocale,
|
setUserLocale,
|
||||||
getLanguageList,
|
getLanguageList,
|
||||||
|
|
@ -56,6 +59,9 @@ router.get("/departments", getDepartmentList); // 부서 목록 조회
|
||||||
// 회사 관리 API
|
// 회사 관리 API
|
||||||
router.get("/companies", getCompanyList);
|
router.get("/companies", getCompanyList);
|
||||||
router.get("/companies/db", getCompanyListFromDB); // 실제 DB에서 회사 목록 조회
|
router.get("/companies/db", getCompanyListFromDB); // 실제 DB에서 회사 목록 조회
|
||||||
|
router.post("/companies", createCompany); // 회사 등록
|
||||||
|
router.put("/companies/:companyCode", updateCompany); // 회사 수정
|
||||||
|
router.delete("/companies/:companyCode", deleteCompany); // 회사 삭제
|
||||||
|
|
||||||
// 사용자 로케일 API
|
// 사용자 로케일 API
|
||||||
router.get("/user-locale", getUserLocale);
|
router.get("/user-locale", getUserLocale);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue