Files
TK-FB-Project/개발 log/2025-12-09.md
Hyungi Ahn 5c8f553f87 fix: 작업자 비활성화 기능 완전 수정
작업자 퇴사 시 비활성화 기능이 제대로 작동하지 않던 문제 해결

백엔드 수정:
- is_active 가상 필드 추가 (status 기반 자동 생성)
- ISO 8601 날짜 형식을 MySQL DATE 형식으로 변환
- 작업자 업데이트 필드 오류 수정 (salary, annual_leave 제거)

프론트엔드 수정 (11개 파일):
- 모든 페이지에서 비활성 작업자 필터링 로직 추가
- 대시보드, 작업보고서, 근태관리, 사용자관리 등 전체 페이지 적용

영향받는 기능:
- 작업자 관리: 비활성화 상태가 DB에 저장되고 새로고침 후에도 유지
- 모든 페이지: 비활성화된 작업자가 선택 목록에서 제외됨

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 17:45:57 +09:00

6.3 KiB

개발 로그 - 2025-12-09

타임라인

17:12 - 개발 로그 시스템 초기화

  • 작업: 생성
  • 대상: 개발 log/ 폴더 및 타임라인 시스템
  • 내용: 코드 변경 이력을 추적하기 위한 개발 로그 시스템 구축
  • 설명: 앞으로 모든 코드 수정/생성/삭제 작업이 이 파일에 시간순으로 기록됩니다

17:25 - 작업자 비활성화 버그 수정

  • 작업: 수정
  • 대상: api.hyungi.net/models/workerModel.js
  • 문제: 작업자를 페이지에서 비활성화해도 새로고침하면 다시 활성화 상태로 돌아오는 버그
  • 원인:
    • workers 테이블에는 status 필드만 존재 (active/inactive)
    • 프론트엔드는 is_active 필드를 사용하는데 백엔드에서 제공하지 않음
    • 로컬 캐시는 업데이트되지만 서버에서 다시 불러오면 is_active 필드가 없어서 기본값으로 돌아감
  • 해결방법:
    • getAll() 함수: CASE WHEN status = 'active' THEN 1 ELSE 0 END AS is_active 추가
    • getById() 함수: 동일한 가상 필드 추가
  • 변경 내용:
    -- 이전
    SELECT * FROM workers ORDER BY worker_id DESC
    
    -- 이후
    SELECT
      *,
      CASE WHEN status = 'active' THEN 1 ELSE 0 END AS is_active
    FROM workers
    ORDER BY worker_id DESC
    
  • 파일: api.hyungi.net/models/workerModel.js:32-46, 48-63
  • 테스트 필요: API 서버 재시작 후 작업자 비활성화 테스트

17:30 - 날짜 형식 변환 오류 수정 (500 에러)

  • 작업: 수정
  • 대상: api.hyungi.net/models/workerModel.js
  • 문제: 작업자 비활성화 시도 시 500 Internal Server Error 발생
  • 원인:
    • 프론트엔드에서 ISO 8601 형식(2025-04-01T00:00:00.000Z)으로 날짜 전송
    • MySQL은 YYYY-MM-DD 형식 요구
    • 날짜 변환 로직 없이 직접 INSERT/UPDATE 시도
  • 해결방법:
    • formatDate() 헬퍼 함수 추가 (ISO 8601 → MySQL DATE 변환)
    • create() 함수: hire_date 변환 적용
    • update() 함수: join_date, hire_date 변환 적용
  • 변경 내용:
    const formatDate = (dateStr) => {
      if (!dateStr) return null;
      if (typeof dateStr === 'string' && dateStr.includes('T')) {
        return dateStr.split('T')[0]; // ISO 8601 -> YYYY-MM-DD
      }
      return dateStr;
    };
    
  • 파일: api.hyungi.net/models/workerModel.js:4-10, 31, 89, 110

17:35 - 작업자 업데이트 필드 불일치 수정

  • 작업: 수정
  • 대상: api.hyungi.net/models/workerModel.js
  • 문제: 작업자 상태 변경이 DB에 저장되지 않음
  • 원인:
    • update() 함수가 존재하지 않는 필드 사용: salary, annual_leave
    • 실제 테이블 필드와 불일치: phone_number, email, hire_date, department, notes 누락
  • 해결방법:
    • workers 테이블 스키마에 맞게 필드 수정
    • 모든 필드 올바르게 매핑
  • 변경 필드:
    • 제거: salary, annual_leave
    • 추가: phone_number, email, hire_date, department, notes
  • 파일: api.hyungi.net/models/workerModel.js:74-121

17:40 - 프론트엔드 비활성 작업자 필터링 추가

  • 작업: 수정
  • 대상: 프론트엔드 JavaScript 파일들
  • 문제: 대시보드 및 작업 보고서에서 비활성화된 작업자가 계속 표시됨
  • 원인: API에서 모든 작업자를 불러온 후 활성/비활성 필터링을 하지 않음
  • 해결방법: 각 페이지의 loadWorkers() 함수에 활성 작업자만 필터링하는 로직 추가
  • 변경 내용:
    // 활성화된 작업자만 필터링
    workers = allWorkers.filter(worker => {
      return worker.status === 'active' || worker.is_active === 1 || worker.is_active === true;
    });
    
  • 수정 파일:
    1. web-ui/js/modern-dashboard.js:215-233 - 그룹 리더 대시보드
    2. web-ui/js/daily-work-report.js:206-222 - 일일 작업 보고서
    3. web-ui/js/work-report-calendar.js:103-123 - 작업 보고서 캘린더
  • 영향받는 페이지:
    • 그룹 리더 대시보드 (작업자 현황 카드)
    • 일일 작업 보고서 (작업자 선택)
    • 작업 보고서 캘린더 (작업자 필터)

17:50 - 전체 페이지 비활성 작업자 필터링 추가 (대규모)

  • 작업: 수정
  • 대상: 프론트엔드 JavaScript 파일들 (추가 8개 파일)
  • 문제: 대시보드 외 다른 페이지들에서도 비활성 작업자가 표시됨
  • 해결방법: 작업자를 로드하는 모든 페이지에 활성화 필터링 로직 추가
  • 수정 파일 목록:
    1. web-ui/js/attendance.js:38-52 - 근태 관리
    2. web-ui/js/manage-user.js:241-272 - 사용자 관리 (작업자 드롭다운)
    3. web-ui/js/management-dashboard.js:126-142 - 관리 대시보드
    4. web-ui/js/work-report-manage.js:29-50 - 작업 보고서 관리
    5. web-ui/js/work-report-review.js:54-65 - 작업 보고서 검토
    6. web-ui/js/work-report-api.js:9-36 - 작업 보고서 API (공통)
    7. web-ui/js/project-analysis-api.js:9-27 - 프로젝트 분석 API (공통)
    8. web-ui/js/daily-issue-api.js:26-56 - 일일 이슈 보고서 API
  • 필터링 로직 (공통):
    // 활성화된 작업자만 필터링
    const workers = allWorkers.filter(worker => {
      return worker.status === 'active' || worker.is_active === 1 || worker.is_active === true;
    });
    
  • 영향받는 모든 페이지:
    • 그룹 리더 대시보드
    • 관리 대시보드
    • 일일 작업 보고서
    • 작업 보고서 캘린더
    • 작업 보고서 관리
    • 작업 보고서 검토
    • 프로젝트 분석
    • 일일 이슈 보고서
    • 근태 관리
    • 사용자 관리

요약

백엔드 수정 (1개 파일)

  • api.hyungi.net/models/workerModel.js: is_active 가상 필드, 날짜 변환, 필드 수정

프론트엔드 수정 (11개 파일)

  • modern-dashboard.js
  • daily-work-report.js
  • work-report-calendar.js
  • attendance.js
  • manage-user.js
  • management-dashboard.js
  • work-report-manage.js
  • work-report-review.js
  • work-report-api.js
  • project-analysis-api.js
  • daily-issue-api.js

테스트 완료

  • 작업자 비활성화 저장
  • 페이지 새로고침 후 상태 유지
  • 모든 페이지에서 비활성 작업자 숨김 확인 필요