/* ===== Projects CRUD ===== */ let projects = [], projectsLoaded = false; function statusBadge(status, isActive) { if (!isActive || isActive === 0 || isActive === false) return '비활성'; if (status === 'completed') return '완료'; return '진행중'; } async function loadProjects() { try { const r = await api('/projects'); projects = r.data || r; projectsLoaded = true; displayProjects(); } catch (err) { document.getElementById('projectList').innerHTML = `

${escapeHtml(err.message)}

`; } } function displayProjects() { const c = document.getElementById('projectList'); if (!projects.length) { c.innerHTML = '

등록된 프로젝트가 없습니다.

'; return; } c.innerHTML = projects.map(p => `
${escapeHtml(p.project_name)}
${escapeHtml(p.job_no)} ${p.site?`${escapeHtml(p.site)}`:''} ${p.pm?`${escapeHtml(p.pm)}`:''} ${statusBadge(p.project_status, p.is_active)} ${p.due_date?`${formatDate(p.due_date)}`:''}
${p.is_active?``:''}
`).join(''); } document.getElementById('addProjectForm').addEventListener('submit', async e => { e.preventDefault(); try { await api('/projects', { method: 'POST', body: JSON.stringify({ job_no: document.getElementById('newJobNo').value.trim(), project_name: document.getElementById('newProjectName').value.trim(), contract_date: document.getElementById('newContractDate').value || null, due_date: document.getElementById('newDueDate').value || null, site: document.getElementById('newSite').value.trim() || null, pm: document.getElementById('newPm').value.trim() || null })}); showToast('프로젝트가 추가되었습니다.'); document.getElementById('addProjectForm').reset(); await loadProjects(); } catch(e) { showToast(e.message, 'error'); } }); function editProject(id) { const p = projects.find(x => x.project_id === id); if (!p) return; document.getElementById('editProjectId').value = p.project_id; document.getElementById('editJobNo').value = p.job_no; document.getElementById('editProjectName').value = p.project_name; document.getElementById('editContractDate').value = formatDate(p.contract_date); document.getElementById('editDueDate').value = formatDate(p.due_date); document.getElementById('editSite').value = p.site || ''; document.getElementById('editPm').value = p.pm || ''; document.getElementById('editProjectStatus').value = p.project_status || 'active'; document.getElementById('editIsActive').value = p.is_active ? '1' : '0'; document.getElementById('editProjectModal').classList.remove('hidden'); } function closeProjectModal() { document.getElementById('editProjectModal').classList.add('hidden'); } document.getElementById('editProjectForm').addEventListener('submit', async e => { e.preventDefault(); try { await api(`/projects/${document.getElementById('editProjectId').value}`, { method: 'PUT', body: JSON.stringify({ job_no: document.getElementById('editJobNo').value.trim(), project_name: document.getElementById('editProjectName').value.trim(), contract_date: document.getElementById('editContractDate').value || null, due_date: document.getElementById('editDueDate').value || null, site: document.getElementById('editSite').value.trim() || null, pm: document.getElementById('editPm').value.trim() || null, project_status: document.getElementById('editProjectStatus').value, is_active: document.getElementById('editIsActive').value === '1' })}); showToast('수정되었습니다.'); closeProjectModal(); await loadProjects(); } catch(e) { showToast(e.message, 'error'); } }); async function deactivateProject(id, name) { if (!confirm(`"${name}" 프로젝트를 비활성화?`)) return; try { await api(`/projects/${id}`, { method: 'DELETE' }); showToast('프로젝트 비활성화 완료'); await loadProjects(); } catch(e) { showToast(e.message, 'error'); } }