/* ===== Vacation Settings ===== */ let vacSettingsLoaded = false, vacSettingsData = {}; async function loadVacationSettingsTab() { if (vacSettingsLoaded) return; await loadVacationSettings(); vacSettingsLoaded = true; } async function loadVacationSettings() { const c = document.getElementById('vacSettingsContent'); try { const r = await api('/vacation-settings'); const arr = r.data || r; vacSettingsData = {}; (Array.isArray(arr) ? arr : []).forEach(s => { vacSettingsData[s.setting_key] = s; }); renderVacationSettings(); } catch (e) { c.innerHTML = `

설정을 불러올 수 없습니다

${escHtml(e.message)}

`; } } function _vsVal(key, fallback) { const s = vacSettingsData[key]; return s ? s.setting_value : fallback; } function _vsDesc(key) { const s = vacSettingsData[key]; return s && s.description ? s.description : ''; } function renderVacationSettings() { const c = document.getElementById('vacSettingsContent'); const isAdmin = currentUser && (currentUser.role === 'admin' || currentUser.role === 'system'); const dis = isAdmin ? '' : 'disabled'; c.innerHTML = `

기본 연차 설정

장기근속 보너스

이월 연차

${isAdmin ? `
` : ''}
`; } async function saveVacationSettings() { const fields = { first_year_rule: document.getElementById('vs_first_year_rule').value, base_days: document.getElementById('vs_base_days').value, increment_per_years: document.getElementById('vs_increment_per_years').value, max_days: document.getElementById('vs_max_days').value, long_service_threshold_years: document.getElementById('vs_long_service_threshold_years').value, long_service_bonus_days: document.getElementById('vs_long_service_bonus_days').value, long_service_expiry: document.getElementById('vs_long_service_expiry').value, long_service_auto_grant: document.getElementById('vs_long_service_auto_grant').checked ? 'true' : 'false', carry_over_enabled: document.getElementById('vs_carry_over_enabled').checked ? 'true' : 'false', carry_over_max_days: document.getElementById('vs_carry_over_max_days').value, carry_over_expiry_month: document.getElementById('vs_carry_over_expiry_month').value, }; // Only send changed values const changes = {}; for (const [key, val] of Object.entries(fields)) { if (_vsVal(key, '') !== val) changes[key] = val; } if (!Object.keys(changes).length) { showToast('변경된 설정이 없습니다.', 'error'); return; } try { const settingsArr = Object.entries(changes).map(([setting_key, setting_value]) => ({ setting_key, setting_value: String(setting_value) })); await api('/vacation-settings', { method: 'PUT', body: JSON.stringify({ settings: settingsArr }) }); showToast('설정이 저장되었습니다.'); vacSettingsLoaded = false; await loadVacationSettingsTab(); } catch (e) { showToast(e.message, 'error'); } }