/* ===== 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 = `
`;
}
}
function displayProjects() {
const c = document.getElementById('projectList');
if (!projects.length) { c.innerHTML = '등록된 프로젝트가 없습니다.
'; return; }
c.innerHTML = projects.map(p => `
${p.project_name}
${p.job_no}
${p.site?`${p.site}`:''}
${p.pm?`${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'); }
}