diff --git a/system1-factory/web/js/tbm/api.js b/system1-factory/web/js/tbm/api.js index b1d0292..a0416d5 100644 --- a/system1-factory/web/js/tbm/api.js +++ b/system1-factory/web/js/tbm/api.js @@ -208,19 +208,7 @@ class TbmAPI { results.forEach((response, index) => { const date = dates[index]; if (response && response.success && response.data && response.data.length > 0) { - let sessions = response.data; - - // admin이 아니면 본인이 작성한 TBM만 필터링 - if (!this.state.isAdminUser()) { - const userId = this.state.currentUser?.user_id; - const workerId = this.state.currentUser?.worker_id; - const userName = this.state.currentUser?.name; - sessions = sessions.filter(s => { - return (userId && String(s.created_by) === String(userId)) || - (workerId && String(s.leader_id) === String(workerId)) || - (userName && s.created_by_name === userName); - }); - } + const sessions = response.data; if (sessions.length > 0) { this.state.dateGroupedSessions[date] = sessions; @@ -462,6 +450,164 @@ class TbmAPI { return []; } } + + /** + * TBM 세션 삭제 + */ + async deleteSession(sessionId) { + try { + const response = await window.apiCall(`/tbm/sessions/${sessionId}`, 'DELETE'); + if (!response || !response.success) { + throw new Error(response?.message || '삭제 실패'); + } + console.log('✅ TBM 세션 삭제:', sessionId); + return response; + } catch (error) { + console.error('❌ TBM 세션 삭제 오류:', error); + throw error; + } + } + + /** + * TBM 팀원 분할 배정 + */ + async splitAssignment(sessionId, splitData) { + try { + const response = await window.apiCall( + `/tbm/sessions/${sessionId}/team/split`, + 'POST', + splitData + ); + if (!response || !response.success) { + throw new Error(response?.message || '분할 실패'); + } + return response; + } catch (error) { + console.error('❌ 분할 배정 오류:', error); + throw error; + } + } + + /** + * TBM 팀원 단일 추가/수정 (POST /team) + */ + async updateTeamMember(sessionId, memberData) { + try { + const response = await window.apiCall( + `/tbm/sessions/${sessionId}/team`, + 'POST', + memberData + ); + if (!response || !response.success) { + throw new Error(response?.message || '팀원 수정 실패'); + } + return response; + } catch (error) { + console.error('❌ 팀원 수정 오류:', error); + throw error; + } + } + + /** + * TBM 인원 이동 (분할→이동 / 빼오기) + */ + async transfer(transferData) { + try { + const response = await window.apiCall('/tbm/transfers', 'POST', transferData); + if (!response || !response.success) { + throw new Error(response?.message || '이동 실패'); + } + return response; + } catch (error) { + console.error('❌ TBM 이동 오류:', error); + throw error; + } + } + + /** + * 작업 생성 + */ + async createTask(taskData) { + try { + const response = await window.apiCall('/tasks', 'POST', taskData); + if (!response || !response.success) { + throw new Error(response?.message || '작업 생성 실패'); + } + return response; + } catch (error) { + console.error('❌ 작업 생성 오류:', error); + throw error; + } + } + + /** + * 활성 작업장 전체 목록 (active/list) + */ + async loadActiveWorkplacesList() { + try { + const response = await window.apiCall('/workplaces/active/list'); + if (response && response.success) { + return response.data || []; + } + return []; + } catch (error) { + console.error('❌ 활성 작업장 목록 오류:', error); + return []; + } + } + + /** + * 당일 배정 현황 조회 + */ + async loadTodayAssignments(date) { + try { + const response = await window.apiCall(`/tbm/sessions/date/${date}/assignments`); + if (response && response.success) { + return response.data || []; + } + return []; + } catch (error) { + console.error('❌ 배정 현황 조회 오류:', error); + return []; + } + } + + /** + * 특정 날짜의 TBM 세션 조회 (raw - 상태 변경 없음) + */ + async fetchSessionsByDate(date) { + try { + const response = await window.apiCall(`/tbm/sessions/date/${date}`); + if (response && response.success) { + return response.data || []; + } + return []; + } catch (error) { + console.error('❌ TBM 세션 조회 오류:', error); + return []; + } + } + + /** + * TBM 세션 완료 처리 (근태 정보 포함) + */ + async completeTbmWithAttendance(sessionId, attendanceData) { + try { + const response = await window.apiCall( + `/tbm/sessions/${sessionId}/complete`, + 'POST', + { attendance: attendanceData } + ); + if (!response || !response.success) { + throw new Error(response?.message || '완료 처리 실패'); + } + console.log('✅ TBM 완료 처리 (근태 포함):', sessionId); + return response; + } catch (error) { + console.error('❌ TBM 완료 처리 오류:', error); + throw error; + } + } } // 전역 인스턴스 생성 @@ -486,5 +632,7 @@ window.loadMoreTbmDays = async function() { await window.TbmAPI.loadRecentTbmGroupedByDate(); window.showToast?.(`최근 ${window.TbmState.loadedDaysCount}일의 TBM을 로드했습니다.`, 'success'); }; +window.deleteTbmSession = (sessionId) => window.TbmAPI.deleteSession(sessionId); +window.fetchSessionsByDate = (date) => window.TbmAPI.fetchSessionsByDate(date); console.log('[Module] tbm/api.js 로드 완료');