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

@@ -15,8 +15,8 @@
sessionDate: null,
leaderId: null,
leaderName: '',
workers: new Set(), // worker_id Set
workerNames: {}, // { worker_id: worker_name }
workers: new Set(), // user_id Set
workerNames: {}, // { user_id: worker_name }
projectId: null,
projectName: '',
workTypeId: null,
@@ -41,10 +41,10 @@
W.sessionDate = window.TbmUtils.getTodayKST();
var user = window.TbmState.getUser();
if (user) {
if (user.worker_id) {
var worker = window.TbmState.allWorkers.find(function(w) { return w.worker_id === user.worker_id; });
if (user.user_id) {
var worker = window.TbmState.allWorkers.find(function(w) { return w.user_id === user.user_id; });
if (worker) {
W.leaderId = worker.worker_id;
W.leaderId = worker.user_id;
W.leaderName = worker.worker_name;
} else {
W.leaderName = user.name || '';
@@ -203,7 +203,7 @@
W.todayAssignments = {};
res.data.forEach(function(a) {
if (a.sessions && a.sessions.length > 0) {
W.todayAssignments[a.worker_id] = a;
W.todayAssignments[a.user_id] = a;
}
});
} else {
@@ -216,14 +216,14 @@
}
var workerCards = workers.map(function(w) {
var selected = W.workers.has(w.worker_id) ? ' selected' : '';
var assignment = W.todayAssignments[w.worker_id];
var selected = W.workers.has(w.user_id) ? ' selected' : '';
var assignment = W.todayAssignments[w.user_id];
var assigned = assignment && assignment.total_hours >= 8;
var partiallyAssigned = assignment && assignment.total_hours > 0 && assignment.total_hours < 8;
var badgeHtml = '';
var disabledClass = '';
var onclick = 'toggleWorker(' + w.worker_id + ')';
var onclick = 'toggleWorker(' + w.user_id + ')';
if (assigned) {
// 종일 배정됨 - 선택 불가
@@ -238,7 +238,7 @@
return '<div class="worker-card' + selected + disabledClass + '"' +
(onclick ? ' onclick="' + onclick + '"' : '') +
' data-wid="' + w.worker_id + '"' +
' data-wid="' + w.user_id + '"' +
' style="' + (assigned ? 'opacity:0.5; pointer-events:none;' : '') + '">' +
'<div class="worker-check">&#10003;</div>' +
'<div class="worker-info">' +
@@ -272,7 +272,7 @@
delete W.workerNames[workerId];
} else {
W.workers.add(workerId);
var w = window.TbmState.allWorkers.find(function(x) { return x.worker_id === workerId; });
var w = window.TbmState.allWorkers.find(function(x) { return x.user_id === workerId; });
if (w) W.workerNames[workerId] = w.worker_name;
}
var card = document.querySelector('[data-wid="' + workerId + '"]');
@@ -284,7 +284,7 @@
window.toggleAllWorkers = function() {
var workers = window.TbmState.allWorkers;
var availableWorkers = workers.filter(function(w) {
var a = W.todayAssignments && W.todayAssignments[w.worker_id];
var a = W.todayAssignments && W.todayAssignments[w.user_id];
return !(a && a.total_hours >= 8);
});
if (W.workers.size === availableWorkers.length) {
@@ -292,8 +292,8 @@
W.workerNames = {};
} else {
availableWorkers.forEach(function(w) {
W.workers.add(w.worker_id);
W.workerNames[w.worker_id] = w.worker_name;
W.workers.add(w.user_id);
W.workerNames[w.user_id] = w.worker_name;
});
}
renderStepWorkers(document.getElementById('stepContainer'));
@@ -522,7 +522,7 @@
// 1. TBM 세션 생성
var sessionData = {
session_date: W.sessionDate,
leader_id: leaderId
leader_user_id: leaderId
};
var response = await window.apiCall('/tbm/sessions', 'POST', sessionData);
@@ -536,7 +536,7 @@
var members = [];
W.workers.forEach(function(wid) {
members.push({
worker_id: wid,
user_id: wid,
project_id: W.projectId,
work_type_id: W.workTypeId,
task_id: null,