// worker-individual-report.js - 작업자별 개별 보고서 관리 // 전역 변수 let currentWorkerId = null; let currentWorkerName = ''; let selectedDate = ''; let currentUser = null; let workTypes = []; let workStatusTypes = []; let errorTypes = []; let projects = []; let existingWork = []; // URL 파라미터에서 정보 추출 function getUrlParams() { const urlParams = new URLSearchParams(window.location.search); return { user_id: urlParams.get('user_id'), worker_name: decodeURIComponent(urlParams.get('worker_name') || ''), date: urlParams.get('date') || new Date().toISOString().split('T')[0] }; } // 현재 로그인한 사용자 정보 가져오기 function getCurrentUser() { try { const token = localStorage.getItem('sso_token'); if (!token) return null; const payloadBase64 = token.split('.')[1]; if (payloadBase64) { const payload = JSON.parse(atob(payloadBase64)); return payload; } } catch (error) { console.log('토큰에서 사용자 정보 추출 실패:', error); } try { const userInfo = localStorage.getItem('sso_user'); if (userInfo) { return JSON.parse(userInfo); } } catch (error) { console.log('localStorage에서 사용자 정보 파싱 실패:', error); } return null; } // 메시지 표시 함수 function showMessage(msg, type = 'info') { const container = document.getElementById('message-container'); if (container) { container.innerHTML = `
`; setTimeout(() => { container.innerHTML = ''; }, 5000); } } // 페이지 초기화 document.addEventListener('DOMContentLoaded', async () => { // API 함수가 로드될 때까지 기다림 let retryCount = 0; const maxRetries = 50; while (!window.apiCall && retryCount < maxRetries) { await new Promise(resolve => setTimeout(resolve, 100)); retryCount++; } if (!window.apiCall) { console.error('❌ API 함수를 로드할 수 없습니다.'); showMessage('시스템을 초기화할 수 없습니다. 페이지를 새로고침해주세요.', 'error'); return; } try { await initializePage(); } catch (error) { console.error('페이지 초기화 오류:', error); showMessage('페이지를 불러오는 중 오류가 발생했습니다.', 'error'); } }); async function initializePage() { console.log('🚀 개별 작업 보고서 페이지 초기화 시작'); // URL 파라미터 추출 const params = getUrlParams(); currentWorkerId = parseInt(params.user_id); currentWorkerName = params.worker_name; selectedDate = params.date; // 사용자 정보 설정 currentUser = getCurrentUser(); if (!currentWorkerId || !currentWorkerName) { showMessage('잘못된 접근입니다. 작업자 정보가 없습니다.', 'error'); setTimeout(() => { window.history.back(); }, 2000); return; } // 페이지 제목 설정 updatePageHeader(); // 이벤트 리스너 설정 setupEventListeners(); // 초기 데이터 로드 await loadInitialData(); console.log('✅ 개별 작업 보고서 페이지 초기화 완료'); } function updatePageHeader() { document.getElementById('pageTitle').textContent = `👤 ${currentWorkerName} 작업 보고서`; document.getElementById('pageSubtitle').textContent = `${selectedDate} 작업 내용을 관리합니다.`; // 작업자 정보 카드 업데이트 document.getElementById('workerInitial').textContent = currentWorkerName.charAt(0); document.getElementById('workerName').textContent = currentWorkerName; document.getElementById('selectedDate').textContent = selectedDate; } function setupEventListeners() { // 새 작업 추가 버튼 document.getElementById('addNewWorkBtn').addEventListener('click', showNewWorkForm); document.getElementById('cancelNewWorkBtn').addEventListener('click', hideNewWorkForm); document.getElementById('saveNewWorkBtn').addEventListener('click', saveNewWork); // 업무 상태 변경 시 에러 유형 섹션 토글 document.getElementById('newWorkStatusSelect').addEventListener('change', toggleErrorTypeSection); // 빠른 시간 버튼 document.querySelectorAll('.quick-time-btn').forEach(btn => { btn.addEventListener('click', (e) => { document.getElementById('newWorkHours').value = e.target.dataset.hours; }); }); // 휴가 처리 버튼들 document.querySelectorAll('.vacation-process-btn').forEach(btn => { btn.addEventListener('click', (e) => { const vacationType = e.target.dataset.type; handleVacationProcess(vacationType); }); }); } async function loadInitialData() { try { showMessage('데이터를 불러오는 중...', 'loading'); // 병렬로 데이터 로드 await Promise.all([ loadWorkerInfo(), loadExistingWork(), loadProjects(), loadWorkTypes(), loadWorkStatusTypes(), loadErrorTypes() ]); // UI 업데이트 updateWorkerSummary(); renderExistingWork(); populateDropdowns(); showMessage('데이터 로드 완료', 'success'); } catch (error) { console.error('초기 데이터 로드 실패:', error); showMessage('데이터 로드 중 오류가 발생했습니다: ' + error.message, 'error'); } } async function loadWorkerInfo() { try { const response = await window.apiCall(`/workers/${currentWorkerId}`); const worker = response.data || response; document.getElementById('workerJob').textContent = worker.job_type || '작업자'; } catch (error) { console.error('작업자 정보 로드 오류:', error); } } async function loadExistingWork() { try { const response = await window.apiCall(`/daily-work-reports?date=${selectedDate}&user_id=${currentWorkerId}`); existingWork = Array.isArray(response) ? response : (response.data || []); console.log(`✅ 기존 작업 ${existingWork.length}건 로드 완료`); } catch (error) { console.error('기존 작업 로드 오류:', error); existingWork = []; } } async function loadProjects() { try { const response = await window.apiCall(`/projects/active/list`); projects = Array.isArray(response) ? response : (response.data || []); } catch (error) { console.error('프로젝트 로드 오류:', error); projects = []; } } async function loadWorkTypes() { try { const response = await window.apiCall(`/daily-work-reports/work-types`); workTypes = Array.isArray(response) ? response : (response.data || []); } catch (error) { console.error('작업 유형 로드 오류:', error); workTypes = []; } } async function loadWorkStatusTypes() { try { const response = await window.apiCall(`/daily-work-reports/work-status-types`); workStatusTypes = Array.isArray(response) ? response : (response.data || []); } catch (error) { console.error('작업 상태 유형 로드 오류:', error); workStatusTypes = []; } } async function loadErrorTypes() { try { const response = await window.apiCall(`/daily-work-reports/error-types`); errorTypes = Array.isArray(response) ? response : (response.data || []); } catch (error) { console.error('에러 유형 로드 오류:', error); errorTypes = []; } } function updateWorkerSummary() { const totalHours = existingWork.reduce((sum, work) => sum + parseFloat(work.work_hours || 0), 0); const workCount = existingWork.length; document.getElementById('totalHours').textContent = `${totalHours.toFixed(1)}h`; document.getElementById('workCount').textContent = `${workCount}건`; // 12시간 초과 경고 if (totalHours > 12) { document.getElementById('totalHours').classList.add('warning'); showMessage(`⚠️ 총 작업시간이 ${totalHours.toFixed(1)}시간으로 12시간을 초과했습니다.`, 'warning'); } } function renderExistingWork() { const container = document.getElementById('existingWorkList'); if (existingWork.length === 0) { container.innerHTML = `${selectedDate}에 ${currentWorkerName}님의 작업이 등록되지 않았습니다.
${work.work_type_name || '미지정 작업'}