refactor: worker_id → user_id 전체 마이그레이션 (Phase 1-4)

sso_users.user_id를 단일 식별자로 통합. JWT에서 worker_id 제거,
department_id/is_production 추가. 백엔드 15개 모델, 11개 컨트롤러,
4개 서비스, 7개 라우트, 프론트엔드 32+ JS/11+ HTML 변환.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-05 13:13:10 +09:00
parent 2197cdb3d5
commit abd7564e6b
90 changed files with 1790 additions and 925 deletions

View File

@@ -9,7 +9,7 @@ const vacationBalanceModel = {
/**
* 특정 작업자의 모든 휴가 잔액 조회 (특정 연도)
*/
async getByWorkerAndYear(workerId, year) {
async getByWorkerAndYear(userId, year) {
const db = await getDb();
const [rows] = await db.query(`
SELECT
@@ -20,16 +20,16 @@ const vacationBalanceModel = {
vt.is_special
FROM vacation_balance_details vbd
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.worker_id = ? AND vbd.year = ?
WHERE vbd.user_id = ? AND vbd.year = ?
ORDER BY vt.priority ASC, vt.type_name ASC
`, [workerId, year]);
`, [userId, year]);
return rows;
},
/**
* 특정 작업자의 특정 휴가 유형 잔액 조회
*/
async getByWorkerTypeYear(workerId, vacationTypeId, year) {
async getByWorkerTypeYear(userId, vacationTypeId, year) {
const db = await getDb();
const [rows] = await db.query(`
SELECT
@@ -38,10 +38,10 @@ const vacationBalanceModel = {
vt.type_code
FROM vacation_balance_details vbd
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.worker_id = ?
WHERE vbd.user_id = ?
AND vbd.vacation_type_id = ?
AND vbd.year = ?
`, [workerId, vacationTypeId, year]);
`, [userId, vacationTypeId, year]);
return rows;
},
@@ -59,7 +59,7 @@ const vacationBalanceModel = {
vt.type_code,
vt.priority
FROM vacation_balance_details vbd
INNER JOIN workers w ON vbd.worker_id = w.worker_id
INNER JOIN workers w ON vbd.user_id = w.user_id
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.year = ?
AND w.employment_status = 'employed'
@@ -98,39 +98,39 @@ const vacationBalanceModel = {
/**
* 작업자의 휴가 사용 일수 업데이트 (차감)
*/
async deductDays(workerId, vacationTypeId, year, daysToDeduct) {
async deductDays(userId, vacationTypeId, year, daysToDeduct) {
const db = await getDb();
const [result] = await db.query(`
UPDATE vacation_balance_details
SET used_days = used_days + ?,
updated_at = NOW()
WHERE worker_id = ?
WHERE user_id = ?
AND vacation_type_id = ?
AND year = ?
`, [daysToDeduct, workerId, vacationTypeId, year]);
`, [daysToDeduct, userId, vacationTypeId, year]);
return result;
},
/**
* 작업자의 휴가 사용 일수 복구 (취소)
*/
async restoreDays(workerId, vacationTypeId, year, daysToRestore) {
async restoreDays(userId, vacationTypeId, year, daysToRestore) {
const db = await getDb();
const [result] = await db.query(`
UPDATE vacation_balance_details
SET used_days = GREATEST(0, used_days - ?),
updated_at = NOW()
WHERE worker_id = ?
WHERE user_id = ?
AND vacation_type_id = ?
AND year = ?
`, [daysToRestore, workerId, vacationTypeId, year]);
`, [daysToRestore, userId, vacationTypeId, year]);
return result;
},
/**
* 특정 작업자의 사용 가능한 휴가 일수 확인
*/
async getAvailableVacationDays(workerId, year) {
async getAvailableVacationDays(userId, year) {
const db = await getDb();
const [rows] = await db.query(`
SELECT
@@ -144,11 +144,11 @@ const vacationBalanceModel = {
vbd.remaining_days
FROM vacation_balance_details vbd
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.worker_id = ?
WHERE vbd.user_id = ?
AND vbd.year = ?
AND vbd.remaining_days > 0
ORDER BY vt.priority ASC
`, [workerId, year]);
`, [userId, year]);
return rows;
},
@@ -162,11 +162,11 @@ const vacationBalanceModel = {
const db = await getDb();
const query = `INSERT INTO vacation_balance_details
(worker_id, vacation_type_id, year, total_days, used_days, notes, created_by)
(user_id, vacation_type_id, year, total_days, used_days, notes, created_by)
VALUES ?`;
const values = balances.map(b => [
b.worker_id,
b.user_id,
b.vacation_type_id,
b.year,
b.total_days || 0,
@@ -202,7 +202,7 @@ const vacationBalanceModel = {
/**
* 휴가 사용 시 우선순위에 따라 잔액에서 차감
*/
async deductByPriority(workerId, year, daysToDeduct) {
async deductByPriority(userId, year, daysToDeduct) {
const db = await getDb();
const [balances] = await db.query(`
@@ -211,13 +211,13 @@ const vacationBalanceModel = {
vt.type_code, vt.type_name, vt.priority
FROM vacation_balance_details vbd
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.worker_id = ? AND vbd.year = ?
WHERE vbd.user_id = ? AND vbd.year = ?
AND (vbd.total_days - vbd.used_days) > 0
ORDER BY vt.priority ASC
`, [workerId, year]);
`, [userId, year]);
if (balances.length === 0) {
console.warn(`[VacationBalance] 작업자 ${workerId}${year}년 휴가 잔액이 없습니다`);
console.warn(`[VacationBalance] 작업자 ${userId}${year}년 휴가 잔액이 없습니다`);
return { success: false, message: '휴가 잔액이 없습니다', deducted: 0 };
}
@@ -248,14 +248,14 @@ const vacationBalanceModel = {
}
}
console.log(`[VacationBalance] 작업자 ${workerId}: ${daysToDeduct}일 차감 완료`, deductions);
console.log(`[VacationBalance] 작업자 ${userId}: ${daysToDeduct}일 차감 완료`, deductions);
return { success: true, deductions, totalDeducted: daysToDeduct - remaining };
},
/**
* 휴가 취소 시 우선순위 역순으로 복구
*/
async restoreByPriority(workerId, year, daysToRestore) {
async restoreByPriority(userId, year, daysToRestore) {
const db = await getDb();
const [balances] = await db.query(`
@@ -263,10 +263,10 @@ const vacationBalanceModel = {
vt.type_code, vt.type_name, vt.priority
FROM vacation_balance_details vbd
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.worker_id = ? AND vbd.year = ?
WHERE vbd.user_id = ? AND vbd.year = ?
AND vbd.used_days > 0
ORDER BY vt.priority DESC
`, [workerId, year]);
`, [userId, year]);
let remaining = daysToRestore;
const restorations = [];
@@ -295,7 +295,7 @@ const vacationBalanceModel = {
}
}
console.log(`[VacationBalance] 작업자 ${workerId}: ${daysToRestore}일 복구 완료`, restorations);
console.log(`[VacationBalance] 작업자 ${userId}: ${daysToRestore}일 복구 완료`, restorations);
return { success: true, restorations, totalRestored: daysToRestore - remaining };
},
@@ -311,7 +311,7 @@ const vacationBalanceModel = {
vt.type_name,
vt.type_code
FROM vacation_balance_details vbd
INNER JOIN workers w ON vbd.worker_id = w.worker_id
INNER JOIN workers w ON vbd.user_id = w.user_id
INNER JOIN vacation_types vt ON vbd.vacation_type_id = vt.id
WHERE vbd.id = ?
`, [id]);