/* ===== tkuser 업체(공급업체) CRUD ===== */ let vendorsLoaded = false; let vendorsList = []; let selectedVendorIdTkuser = null; async function loadVendorsTab() { if (vendorsLoaded) return; vendorsLoaded = true; if (currentUser && ['admin', 'system'].includes(currentUser.role)) { document.getElementById('btnAddVendorTkuser')?.classList.remove('hidden'); } await loadVendorsList(); } async function loadVendorsList() { try { const isActive = document.getElementById('vendorFilterActiveTkuser')?.value; const search = document.getElementById('vendorSearchTkuser')?.value?.trim() || ''; const params = new URLSearchParams(); if (isActive !== '' && isActive !== undefined) params.set('is_active', isActive); if (search) params.set('search', search); const r = await api('/vendors?' + params.toString()); vendorsList = r.data || []; renderVendorsListTkuser(); } catch (e) { document.getElementById('vendorsListTkuser').innerHTML = `

${e.message}

`; } } function renderVendorsListTkuser() { const c = document.getElementById('vendorsListTkuser'); if (!vendorsList.length) { c.innerHTML = '

등록된 업체가 없습니다.

'; return; } const isAdmin = currentUser && ['admin', 'system'].includes(currentUser.role); c.innerHTML = vendorsList.map(v => { return `
${escHtml(v.vendor_name)} ${!v.is_active ? '비활성' : ''}
${v.business_number ? `${escHtml(v.business_number)}` : ''} ${v.contact_name ? `${escHtml(v.contact_name)}` : ''}
${isAdmin ? `
${v.is_active ? `` : ''}
` : ''}
`; }).join(''); } async function selectVendorTkuser(id) { selectedVendorIdTkuser = id; renderVendorsListTkuser(); try { const r = await api(`/vendors/${id}`); const v = r.data; renderVendorDetailTkuser(v); document.getElementById('vendorDetailTkuser').classList.remove('hidden'); document.getElementById('vendorEmptyTkuser').classList.add('hidden'); } catch (e) { showToast('상세 조회 실패: ' + e.message, 'error'); } } function renderVendorDetailTkuser(v) { document.getElementById('vendorDetailTkuser').innerHTML = `

${escHtml(v.vendor_name)}

사업자번호: ${escHtml(v.business_number) || '-'}
대표자: ${escHtml(v.representative) || '-'}
담당자: ${escHtml(v.contact_name) || '-'}
연락처: ${escHtml(v.contact_phone) || '-'}
주소: ${escHtml(v.address) || '-'}
은행: ${escHtml(v.bank_name) || '-'}
계좌번호: ${escHtml(v.bank_account) || '-'}
${v.notes ? `
비고: ${escHtml(v.notes)}
` : ''}
`; } /* ===== 업체 등록 ===== */ function openAddVendorTkuser() { document.getElementById('addVendorModalTkuser').classList.remove('hidden'); } function closeAddVendorTkuser() { document.getElementById('addVendorModalTkuser').classList.add('hidden'); document.getElementById('addVendorFormTkuser').reset(); } async function submitAddVendorTkuser(e) { e.preventDefault(); const data = { vendor_name: document.getElementById('newVendorNameTkuser').value.trim(), business_number: document.getElementById('newVendorBizNumTkuser').value.trim() || null, representative: document.getElementById('newVendorRepTkuser').value.trim() || null, contact_name: document.getElementById('newVendorContactNameTkuser').value.trim() || null, contact_phone: document.getElementById('newVendorContactPhoneTkuser').value.trim() || null, address: document.getElementById('newVendorAddressTkuser').value.trim() || null, bank_name: document.getElementById('newVendorBankNameTkuser').value.trim() || null, bank_account: document.getElementById('newVendorBankAccountTkuser').value.trim() || null, notes: document.getElementById('newVendorNotesTkuser').value.trim() || null, }; if (!data.vendor_name) { showToast('업체명은 필수입니다', 'error'); return; } try { await api('/vendors', { method: 'POST', body: JSON.stringify(data) }); showToast('업체가 등록되었습니다'); closeAddVendorTkuser(); await loadVendorsList(); } catch (e) { showToast(e.message, 'error'); } } /* ===== 업체 수정 ===== */ function openEditVendorTkuser(id) { const v = vendorsList.find(x => x.vendor_id === id); if (!v) return; document.getElementById('editVendorIdTkuser').value = v.vendor_id; document.getElementById('editVendorNameTkuser').value = v.vendor_name; document.getElementById('editVendorBizNumTkuser').value = v.business_number || ''; document.getElementById('editVendorRepTkuser').value = v.representative || ''; document.getElementById('editVendorContactNameTkuser').value = v.contact_name || ''; document.getElementById('editVendorContactPhoneTkuser').value = v.contact_phone || ''; document.getElementById('editVendorAddressTkuser').value = v.address || ''; document.getElementById('editVendorBankNameTkuser').value = v.bank_name || ''; document.getElementById('editVendorBankAccountTkuser').value = v.bank_account || ''; document.getElementById('editVendorNotesTkuser').value = v.notes || ''; document.getElementById('editVendorModalTkuser').classList.remove('hidden'); } function closeEditVendorTkuser() { document.getElementById('editVendorModalTkuser').classList.add('hidden'); } async function submitEditVendorTkuser(e) { e.preventDefault(); const id = document.getElementById('editVendorIdTkuser').value; const data = { vendor_name: document.getElementById('editVendorNameTkuser').value.trim(), business_number: document.getElementById('editVendorBizNumTkuser').value.trim() || null, representative: document.getElementById('editVendorRepTkuser').value.trim() || null, contact_name: document.getElementById('editVendorContactNameTkuser').value.trim() || null, contact_phone: document.getElementById('editVendorContactPhoneTkuser').value.trim() || null, address: document.getElementById('editVendorAddressTkuser').value.trim() || null, bank_name: document.getElementById('editVendorBankNameTkuser').value.trim() || null, bank_account: document.getElementById('editVendorBankAccountTkuser').value.trim() || null, notes: document.getElementById('editVendorNotesTkuser').value.trim() || null, }; try { await api(`/vendors/${id}`, { method: 'PUT', body: JSON.stringify(data) }); showToast('수정되었습니다'); closeEditVendorTkuser(); await loadVendorsList(); if (selectedVendorIdTkuser == id) selectVendorTkuser(id); } catch (e) { showToast(e.message, 'error'); } } /* ===== 업체 비활성화 ===== */ async function deactivateVendorTkuser(id, name) { if (!confirm(`"${name}" 업체를 비활성화하시겠습니까?`)) return; try { await api(`/vendors/${id}`, { method: 'DELETE' }); showToast('비활성화 완료'); await loadVendorsList(); if (selectedVendorIdTkuser === id) { document.getElementById('vendorDetailTkuser').classList.add('hidden'); document.getElementById('vendorEmptyTkuser').classList.remove('hidden'); selectedVendorIdTkuser = null; } } catch (e) { showToast(e.message, 'error'); } } // 검색/필터 이벤트 + 모달 폼 이벤트 document.addEventListener('DOMContentLoaded', () => { let searchTimeout; const searchEl = document.getElementById('vendorSearchTkuser'); if (searchEl) searchEl.addEventListener('input', () => { clearTimeout(searchTimeout); searchTimeout = setTimeout(loadVendorsList, 300); }); const filterEl = document.getElementById('vendorFilterActiveTkuser'); if (filterEl) filterEl.addEventListener('change', loadVendorsList); document.getElementById('addVendorFormTkuser')?.addEventListener('submit', submitAddVendorTkuser); document.getElementById('editVendorFormTkuser')?.addEventListener('submit', submitEditVendorTkuser); });