/* ===== 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'); }
}