/* tkpurchase-accounts.js - Partner account management */ let allCompanies = []; let selectedCompanyId = null; async function loadCompaniesForAccounts() { try { const r = await api('/partners?limit=200'); allCompanies = r.data || []; renderCompanyList(allCompanies); } catch(e) { console.warn('Load companies error:', e); document.getElementById('companyList').innerHTML = '

로딩 실패

'; } } function renderCompanyList(list) { const container = document.getElementById('companyList'); if (!list.length) { container.innerHTML = '

등록된 업체가 없습니다

'; return; } container.innerHTML = list.map(c => { const active = c.id === selectedCompanyId; return ``; }).join(''); } function filterCompanyList() { const q = document.getElementById('companyFilter').value.trim().toLowerCase(); const filtered = q ? allCompanies.filter(c => (c.company_name || '').toLowerCase().includes(q)) : allCompanies; renderCompanyList(filtered); } async function selectCompanyForAccounts(id) { selectedCompanyId = id; const company = allCompanies.find(c => c.id === id); document.getElementById('selectedCompanyName').textContent = company ? company.company_name + ' - 계정 목록' : '계정 목록'; document.getElementById('addAccountBtn').classList.remove('hidden'); // Re-render company list to highlight selection filterCompanyList(); // Load accounts try { const r = await api('/partner-accounts/company/' + id); renderAccountList(r.data || []); } catch(e) { console.warn('Load accounts error:', e); document.getElementById('accountList').innerHTML = '

계정 로딩 실패

'; } } function renderAccountList(list) { const container = document.getElementById('accountList'); if (!list.length) { container.innerHTML = '

등록된 계정이 없습니다

'; return; } container.innerHTML = `
${list.map(a => { const isExpired = a.account_expires_at && new Date(a.account_expires_at) < new Date(); const statusBadge = !a.is_active ? '비활성' : isExpired ? '만료' : '활성'; return `
${(a.name || a.username || '?').charAt(0).toUpperCase()}
${escapeHtml(a.name || '')}
${escapeHtml(a.username || '')}
${statusBadge} ${a.is_active ? `` : ''}
만료: ${a.account_expires_at ? formatDate(a.account_expires_at) : '무기한'} ${a.last_login_at ? `최근 로그인: ${formatDateTime(a.last_login_at)}` : ''}
`; }).join('')}
`; } /* ===== Add Account ===== */ function openAddAccount() { if (!selectedCompanyId) { showToast('업체를 먼저 선택하세요', 'error'); return; } document.getElementById('addAccountForm').reset(); // Default expiration: 1 year from now const oneYear = new Date(); oneYear.setFullYear(oneYear.getFullYear() + 1); document.getElementById('addExpiresAt').value = toLocalDate(oneYear); document.getElementById('addAccountModal').classList.remove('hidden'); } function closeAddAccount() { document.getElementById('addAccountModal').classList.add('hidden'); } async function submitAddAccount(e) { e.preventDefault(); const body = { username: document.getElementById('addUsername').value.trim(), password: document.getElementById('addPassword').value, name: document.getElementById('addName').value.trim(), account_expires_at: document.getElementById('addExpiresAt').value || null }; if (!body.username || !body.password || !body.name) { showToast('필수 항목을 입력하세요', 'error'); return; } try { body.partner_company_id = selectedCompanyId; await api('/partner-accounts', { method: 'POST', body: JSON.stringify(body) }); showToast('계정이 추가되었습니다'); closeAddAccount(); selectCompanyForAccounts(selectedCompanyId); } catch(e) { showToast(e.message || '계정 추가 실패', 'error'); } } /* ===== Edit Account ===== */ function openEditAccount(id, name, expiresAt) { document.getElementById('editAccountId').value = id; document.getElementById('editName').value = name; document.getElementById('editExpiresAt').value = expiresAt; document.getElementById('editAccountModal').classList.remove('hidden'); } function closeEditAccount() { document.getElementById('editAccountModal').classList.add('hidden'); } async function submitEditAccount(e) { e.preventDefault(); const id = document.getElementById('editAccountId').value; const body = { name: document.getElementById('editName').value.trim(), account_expires_at: document.getElementById('editExpiresAt').value || null }; try { await api('/partner-accounts/' + id, { method: 'PUT', body: JSON.stringify(body) }); showToast('계정이 수정되었습니다'); closeEditAccount(); selectCompanyForAccounts(selectedCompanyId); } catch(e) { showToast(e.message || '수정 실패', 'error'); } } /* ===== Deactivate Account ===== */ async function deactivateAccount(id) { if (!confirm('이 계정을 비활성화하시겠습니까?')) return; try { await api('/partner-accounts/' + id, { method: 'DELETE' }); showToast('계정이 비활성화되었습니다'); selectCompanyForAccounts(selectedCompanyId); } catch(e) { showToast(e.message || '비활성화 실패', 'error'); } } /* ===== Init ===== */ function initAccountsPage() { if (!initAuth()) return; loadCompaniesForAccounts(); }