const Auth = (() => { const KEY_TOKEN = 'ev_token'; const KEY_ROLE = 'ev_role'; const KEY_NAME = 'ev_name'; const KEY_ID = 'ev_uid'; function save(token, role, name, id) { localStorage.setItem(KEY_TOKEN, token); localStorage.setItem(KEY_ROLE, role); localStorage.setItem(KEY_NAME, name); localStorage.setItem(KEY_ID, id); } function token() { return localStorage.getItem(KEY_TOKEN); } function role() { return localStorage.getItem(KEY_ROLE); } function name() { return localStorage.getItem(KEY_NAME); } function uid() { return localStorage.getItem(KEY_ID); } function logout() { [KEY_TOKEN, KEY_ROLE, KEY_NAME, KEY_ID].forEach(k => localStorage.removeItem(k)); location.href = '/pages/login.html'; } function require(allowedRoles) { if (!token()) { logout(); return false; } if (allowedRoles && !allowedRoles.includes(role())) { alert('접근 권한이 없습니다.'); history.back(); return false; } return true; } function renderNav(el) { if (!el) return; el.innerHTML = ` ${name()} [${role()}] 로그아웃 `; } function statusBadge(status) { const map = { pending_approval: '승인대기', pending: '접수', in_progress: '처리중', done: '완료', waiting: '부품대기', revisit: '재방문', registered: '등록', reviewing: '검토중', developing: '개발중', deployed: '배포완료', }; return `${map[status] || status}`; } function costStatusBadge(s) { const map = { pending:'미처리', billed:'청구완료', waived:'면제', settled:'정산완료' }; return `${map[s] || s}`; } function fmtDt(dt) { if (!dt) return '-'; return new Date(dt).toLocaleString('ko-KR', {year:'numeric',month:'2-digit',day:'2-digit',hour:'2-digit',minute:'2-digit'}); } return { save, token, role, name, uid, logout, require, renderNav, statusBadge, costStatusBadge, fmtDt }; })();