fix: 캘린더 모달 중복 카드 문제 및 삭제 권한 개선

- monthly_worker_status 조회 시 GROUP BY로 중복 데이터 합산
- 작업보고서 삭제 권한을 그룹장 이상으로 제한 (admin, system, group_leader)
- 중복 데이터 정리를 위한 마이그레이션 SQL 추가 (009_fix_duplicate_monthly_status.sql)
- synology_deployment 버전에도 동일 수정 적용
This commit is contained in:
Hyungi Ahn
2025-12-02 13:08:44 +09:00
parent beaffcad49
commit a9bce9d20b
419 changed files with 275129 additions and 394 deletions

View File

@@ -407,7 +407,6 @@ function displayWorkStatus() {
<span class="legend-item legend-vacation">휴가</span>
<span class="legend-item legend-partial">부분입력</span>
<span class="legend-item legend-incomplete">미입력</span>
<span class="legend-item legend-error">오류</span>
</div>
</div>
<div class="worker-status-rows">
@@ -621,11 +620,43 @@ function updateViewButtons(activeView) {
// ========== 관리자 권한 확인 ========== //
function checkAdminAccess() {
const adminElements = document.querySelectorAll('.admin-only');
const isAdmin = currentUser && ['admin', 'system'].includes(currentUser.access_level);
const isFullAdmin = currentUser && ['admin', 'system'].includes(currentUser.access_level);
const isGroupLeader = currentUser && currentUser.access_level === 'group_leader';
console.log(`🔐 권한 확인: 사용자=${currentUser?.username}, 역할=${currentUser.access_level}, 전체관리자=${isFullAdmin}, 그룹리더=${isGroupLeader}`);
adminElements.forEach(element => {
if (isAdmin) {
element.classList.add('visible');
const href = element.getAttribute('href');
// 작업 분석: 전체 관리자만 접근 가능
if (href && href.includes('work-analysis.html')) {
if (isFullAdmin) {
element.style.display = '';
element.classList.add('visible');
} else {
element.style.display = 'none';
element.classList.remove('visible');
}
}
// 작업 관리: 전체 관리자 + 그룹 리더 접근 가능
else if (href && href.includes('work-management.html')) {
if (isFullAdmin || isGroupLeader) {
element.style.display = '';
element.classList.add('visible');
} else {
element.style.display = 'none';
element.classList.remove('visible');
}
}
// 기타 관리자 전용 메뉴: 전체 관리자만 접근 가능
else {
if (isFullAdmin) {
element.style.display = '';
element.classList.add('visible');
} else {
element.style.display = 'none';
element.classList.remove('visible');
}
}
});
}