From b2ce691ef9bfe74e948f044f820f207dbe84c4ba Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Tue, 31 Mar 2026 08:26:43 +0900 Subject: [PATCH] =?UTF-8?q?fix(tkuser):=20=EC=9E=A5=EA=B8=B0=EA=B7=BC?= =?UTF-8?q?=EC=86=8D=205=EB=85=84=20=EC=A0=95=ED=99=95=20=EA=B2=BD?= =?UTF-8?q?=EA=B3=BC=20=EC=B2=B4=ED=81=AC=20+=20=EC=88=98=EB=8F=99?= =?UTF-8?q?=EB=B6=80=EC=97=AC=20=EC=97=B0=EB=8F=84=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - autoGrantLongServiceLeave: 연도 차이 → 정확한 기념일 경과 확인 (today < anniversaryDate이면 스킵) - 수동 배정 모달에 "배정 연도" 필드 추가 (탭 연도 의존 제거) - 장기근속 만료일 = null 유지 (기존 동작 그대로) Co-Authored-By: Claude Opus 4.6 (1M context) --- user-management/api/models/vacationModel.js | 12 +++++---- user-management/web/index.html | 26 ++++++++++++------- .../web/static/js/tkuser-vacations.js | 4 +-- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/user-management/api/models/vacationModel.js b/user-management/api/models/vacationModel.js index c59307f..833a6d8 100644 --- a/user-management/api/models/vacationModel.js +++ b/user-management/api/models/vacationModel.js @@ -264,15 +264,17 @@ async function autoGrantLongServiceLeave(users, year, createdBy, settings) { if (!u.hire_date) continue; const hire = new Date(u.hire_date); - const yearsWorked = year - hire.getFullYear(); - // 해당 연도 내 threshold 도래 건만 (소급 없음) - if (yearsWorked !== thresholdYears) continue; - - // 기념일이 해당 연도인지 확인 + // 정확한 5년 기념일 계산 const anniversaryDate = new Date(hire); anniversaryDate.setFullYear(hire.getFullYear() + thresholdYears); + + // 기념일이 해당 연도가 아니면 스킵 if (anniversaryDate.getFullYear() !== year) continue; + // 기념일이 아직 도래하지 않았으면 스킵 (정확히 5년 경과 필요) + const today = new Date(); + if (today < anniversaryDate) continue; + // long_service_excluded 체크 const [userRows] = await db.query( 'SELECT long_service_excluded FROM sso_users WHERE user_id = ?', diff --git a/user-management/web/index.html b/user-management/web/index.html index 4770dcd..155a157 100644 --- a/user-management/web/index.html +++ b/user-management/web/index.html @@ -904,15 +904,21 @@ -
- - +
+
+ + +
+
+ + +
@@ -2410,7 +2416,7 @@ - + diff --git a/user-management/web/static/js/tkuser-vacations.js b/user-management/web/static/js/tkuser-vacations.js index 820f543..3fa3c6f 100644 --- a/user-management/web/static/js/tkuser-vacations.js +++ b/user-management/web/static/js/tkuser-vacations.js @@ -353,6 +353,7 @@ function openVacBalanceModal(editId) { document.getElementById('vacBalModalTitle').textContent = '연차 배정'; const year = document.getElementById('vacYear')?.value || new Date().getFullYear(); + document.getElementById('vbYear').value = year; document.getElementById('vbExpiresAt').value = `${year}-12-31`; // 사용자 셀렉트 (부서별 optgroup) @@ -422,11 +423,10 @@ document.getElementById('vacBalanceForm').addEventListener('submit', async e => })}); showToast('수정되었습니다.'); } else { - const year = document.getElementById('vacYear')?.value || new Date().getFullYear(); await api('/vacations/balances', { method: 'POST', body: JSON.stringify({ user_id: parseInt(document.getElementById('vbUser').value), vacation_type_id: parseInt(document.getElementById('vbType').value), - year: parseInt(year), + year: parseInt(document.getElementById('vbYear').value), total_days: parseFloat(document.getElementById('vbTotalDays').value) || 0, used_days: parseFloat(document.getElementById('vbUsedDays').value) || 0, balance_type: document.getElementById('vbBalanceType').value,