# 🛠 Issue & Task Log

## 🔴 우선순위: 높음 (Current Sprint)

### [완료] Controller 리팩토링 및 에러 처리 강화 ✅
- **목표**: Controller 730줄 → 350줄로 감소, Manager 패턴 적용, 에러 처리 체계 구축
- **관련 파일**: 
  - `app/controllers/controller.py` (730줄 → 487줄)
  - `app/controllers/scheduler_manager.py`
  - `app/controllers/notification_manager.py`
  - `app/controllers/report_manager.py` (신규)
  - `app/controllers/file_manager.py` (신규)
  - `app/controllers/ui_manager.py` (신규)
  - `app/core/exceptions.py`
- **완료 내역**:
  - [x] 에러 처리 체계 구축 (`core/exceptions.py`)
  - [x] SchedulerManager 분리 (크롤링, DB 체크 로직)
  - [x] NotificationManager 분리 (알림 로직)
  - [x] ReportManager 신규 생성 (보고서 생성/인쇄/PDF)
  - [x] FileManager 신규 생성 (첨부파일 처리)
  - [x] UIManager 신규 생성 (UI 창 관리)
  - [x] Controller에서 Manager 위임 패턴 적용
- **완료일**: 2026-02-18

---

### [완료] 알람 시스템 개선 ✅
- **목표**: 미확인 글 알림, 중복 방지, 설정 영속화
- **관련 파일**:
  - `app/controllers/scheduler_manager.py`
  - `app/utils/database.py`
- **완료 내역**:
  - [x] 키워드 기반 알림 필터링 제거 (모든 관심글 알림)
  - [x] 미확인 글 주기적 알림 기능 추가 (30분마다 체크)
  - [x] last_check_time 영속화 (scheduler_state.json 저장)
  - [x] 중복 알림 방지 메커니즘 추가 (notified_post_ids 세트)
- **완료일**: 2026-02-18

### [완료] 알림 주기 설정화 및 미확인 조건 토글 ✅
- **목표**: 신규/미확인 알림 주기를 설정에서 제어하고, 미확인 30분 경과 조건을 ON/OFF로 제어
- **관련 파일**:
  - `app/view/dialogs/settings_dialog.py`
  - `app/controllers/scheduler_manager.py`
  - `app/controllers/controller.py`
  - `app/data/settings.json`
- **완료 내역**:
  - [x] 신규 알림 주기 설정 추가 (`noti.db_check_interval_minutes`, 기본 3분)
  - [x] 미확인 알림 주기 설정 추가 (`noti.unchecked_check_interval_minutes`, 기본 10분)
  - [x] 미확인 30분 경과 조건 토글 추가 (`noti.unchecked_delay_enabled`)
  - [x] 관심 조건 알림 토글 추가 (`noti.use_related_filter`)
  - [x] 설정 토글 설명용 `?` 툴팁 추가 (관심 조건 토글, 30분 지연 토글)
  - [x] 설정 역할 분리 정리: 알림 탭의 중복 키워드 UI 제거, 키워드/부서는 수집 설정으로 일원화
  - [x] 설정 UI 입력 위젯 충돌 버그 수정 (`entry_kw` 분리)
  - [x] 알림 팝업에 `전체내역 보기` 버튼 추가 (신규/미확인 공통), 다건 알림에서도 목록 즉시 열기 지원
  - [x] 다건 미확인 알림 목록 표시 로직 동작 확인
  - [x] 수집 키워드 기본값을 `1호선 + 1호선 전체 역사`로 반영, 관심 부서 기본값 `차량` 유지
- **완료일**: 2026-02-18

### [진행중] 업데이터 모듈 단독 검증/안정화 🔄
- **목표**: 통합 전 updater 모듈 단독 실행 검증, 에러처리 강화, 테스트 코드 확보
- **관련 파일**:
  - `app/updater/update_manager.py`
  - `app/updater/updater_gui.py`
  - `docs/updater_validation.md`
- **진행 내역**:
  - [x] Supabase 설정 누락 사전 검증
  - [x] config.json 원자적 저장 적용
  - [x] updater.exe 누락 시 명시적 실패 처리
  - [x] 압축 해제/교체 경로 안정화 및 롤백 보강
  - [x] updater 단위 테스트 작성 및 실행
    - 버전 비교
    - Supabase 설정 누락 예외
    - updater.exe 누락/권한 오류
    - 손상 zip 처리
    - 설치 실패 시 롤백 검증
  - [x] 샘플 zip 수동 리허설 절차 문서화 (`docs/updater_validation.md`)
  - [x] 연결정보 외부화: `app/updater/config.json` + `settings.json(update)` 기반 로드
  - [x] m1tcloud 테스트 환경 실조회 검증 (`program_id=voc_monitor`, `program_versions`)
- **상태**: 완료

### [진행중] 업데이터 메인 앱 통합 🔄
- **목표**: 단독 검증 완료된 updater를 컨트롤러/트레이와 연결
- **관련 파일**:
  - `app/controllers/controller.py`
  - `app/view/tray_icon.py`
- **진행 내역**:
  - [x] 앱 시작 시 updater 백그라운드 체크 시작
  - [x] 트레이 메뉴 `업데이트 확인` 추가
  - [x] 업데이트 발견 시 사용자 승인 다이얼로그 연결
  - [x] 승인 시 `prepare_update`/`launch_updater` 실행 후 앱 종료
  - [x] 종료 시 updater 백그라운드/임시파일 정리
  - [x] m1tcloud 실연결 확인 (`voc_monitor`, `program_versions`, 최신 버전 3.5.5 조회)
  - [x] 오류 처리 강화 (설정 오류/네트워크 오류/updater.exe 누락 시 사용자 메시지+로그)
  - [x] 테스트 모드 즉시 확인 옵션 추가 (`--test --test-update-now`)
  - [x] 업데이트 안내 중복 팝업 방지 (표시중 락 + 동일 버전 60초 쿨다운)
  - [x] 업데이터 단독 빌드 스크립트 추가 (`app/update_build_setup.py`)
  - [x] 메인 패키징에 `updater.exe`/`app/updater/config.json` 포함 로직 반영
  - [x] 실제 빌드 실행 및 산출물 검증
    - `app/updater_build/dist/updater.exe`
    - `app/build/exe.win-amd64-3.11/updater.exe`
- **상태**: 완료

---

## 🟡 우선순위: 보통 (In Progress / Pending)

### [완료] CTkComboBox 열차번호 표시 문제 해결 ✅
- **문제**: 열차번호 조회 실패 시 드롭박스에 "CTkComboBox" 텍스트 표시
- **해결**:
  - ComboBox 기본값을 빈 문자열 `""`로 설정
  - `startswith("CTk")` 체크로 위젯 이름 필터링
  - 열차번호 없을 시 파일명/조치사항에서 자동 제거
- **관련 파일**: 
  - `app/view/dialogs/report_option_dialog.py`
  - `app/services/report_service.py`
- **완료일**: 2026-02-18

### [완료] 설정 다이얼로그 Z-order 문제 해결 ✅
- **문제**: HistoryDialog에서 설정 버튼 클릭 시 SettingsDialog가 뒤로 표시
- **해결**:
  - SettingsDialog에 parent 파라미터 추가
  - `transient(parent)` 설정으로 Z-order 고정
  - `lift()` + `focus_force()`로 포커스 보장
- **관련 파일**:
  - `app/controllers/ui_manager.py`
  - `app/view/dialogs/settings_dialog.py`
- **완료일**: 2026-02-18

### [완료] 통계분석 다이얼로그 자식 창 Z-order 문제 해결 ✅
- **문제**: StatisticsDialog에서 미리보기/보고서생성 버튼 클릭 시 자식 다이얼로그가 뒤로 표시
- **해결**:
  - 미리보기 창에 `transient(self)`, `lift()`, `focus_force()` 추가
  - 프로그레스 다이얼로그에 `lift()`, `focus_force()` 추가
- **관련 파일**:
  - `app/view/dialogs/statistics_dialog.py`
- **완료일**: 2026-02-18

### [대기] HWP 비고란 개선
- **문제**: 운행 정보 미조회 시 "운행정보 미조회" 텍스트 삽입
- **해결 방안**:
  - 부분 실패 시 비고란 비워두기
  - 또는 "정보 없음" 등 중립적 표현 사용
- **관련 파일**: `app/services/report_service.py`

### [대기] 로그 뷰어 개선
- **현재 상태**: 설정 창에서 로그 확인 가능
- **개선 사항**:
  - 로그 레벨별 필터링 (INFO/WARNING/ERROR)
  - 검색 기능
  - 자동 스크롤

## 🟢 완료됨 (Resolved)

### [2026-02-17] Controller 리팩토링 및 에러 처리 강화 ✅
- **내용**: Controller 601줄 → 3개 파일로 분리, 에러 처리 체계 구축
- **분리 모듈**:
  - `controllers/controller.py`: 핵심 흐름 제어 (~700줄, 주석 포함)
  - `controllers/scheduler_manager.py`: 스케줄링 로직 (~400줄)
  - `controllers/notification_manager.py`: 알림 로직 (~150줄)
- **개선 효과**:
  - 단일 책임 원칙 준수
  - 의존성 주입 방식 적용
  - 에러 처리 강화 (try-except, 사용자 친화적 메시지)
  - 코드 가독성 향상

### [2026-02-17] 데이터 모델 강화 (Pydantic Validator)
- **내용**: VOCPost 모델에 데이터 유효성 검사 추가
- **추가 Validator**:
  - `validate_id`: ID 비어있지 않음 검증
  - `validate_required_strings`: 필수 문자열 필드 검증
  - `validate_binary_int`: 0 또는 1만 허용
  - `validate_date_format`: 날짜 형식 검증
  - `validate_attachment`: "없음" → None 정규화
- **관련 파일**: `app/models/model.py`

### [2026-02-17] ReportService 리팩토링 (v2.0)
- **내용**: 1056줄 → 400줄 (62% 감소)
- **분리 모듈**:
  - `utils/voc_parser.py`: VOC 텍스트 파싱
  - `utils/date_utils.py`: 날짜 처리
  - `utils/train_analyzer.py`: 열차 정보 분석
- **개선 효과**:
  - 단일 책임 원칙 준수
  - 재사용성 향상
  - 테스트 용이성 증가

### [2026-02-17] 기존 보고서 중복 체크 기능
- **내용**: 동일한 보고서 생성 시 사용자 선택 다이얼로그 표시
- **옵션**: 기존 파일 열기 / 새로 생성 / 취소
- **관련 파일**: 
  - `app/services/report_service.py`
  - `app/controllers/controller.py`

### [2026-02-17] 히스토리 다이얼로그 설정 버튼 추가
- **내용**: "⚙️ 설정" 버튼 추가로 빠른 접근 가능
- **관련 파일**: `app/view/dialogs/history_dialog.py`

### [2026-02-14] 시각표 기반 열차 정보 유추
- **내용**: 역명, 시간 기반 열차번호 자동 추출
- **관련 파일**: 
  - `app/services/timetable_service.py`
  - `app/services/report_service.py`

### [2026-02-14] 주박지 입출고 로직 구현
- **내용**: 다대포 주박지 입출고 순서 매핑 및 익일 예측
- **관련 파일**: `app/services/report_service.py`

---

## ⚠️ 알려진 문제 (Known Bugs)

### BUG-001: 열차번호 조회 실패 시 UI 오류 ✅ 해결됨 (2026-02-18)
- **현상**: 드롭박스에 "CTK" 등 에러 객체 표시
- **원인**: 예외 처리 부재, 에러 객체가 UI로 전파
- **해결**: ComboBox 기본값 설정 및 CTk 문자열 필터링
- **상태**: 완료

### BUG-002: 세션 만료 시 무한 재시도 ✅ 해결됨 (2026-02-18)
- **현상**: 로그인 세션 만료 시 재로그인 무한 반복
- **원인**: 재로그인 실패 시 예외 처리 부재
- **해결**: `max_retries`, `retry_delay` 설정 추가 (settings.json)
- **상태**: 완료

---

## 🎉 최근 완료된 주요 개선사항 (2026-02-18)

### 크롤링 시스템 개선 ✅
- **하드코딩 제거**: `scraper_service.py`의 `target_depts = ['차량', '검수']` 하드코딩 제거
- **설정 연동**: 모든 필터링 설정을 `settings.json`에서 동적 로드
- **필터링 고도화**:
  - AND/OR 모드 지원 (`filter_mode` 설정)
  - `_check_filter_match()` 메서드로 필터링 로직 중앙화
  - 키워드 및 부서 매칭 로직 개선
- **예외처리 강화**: `max_retries`, `retry_delay` 설정 추가
- **관련 파일**: 
  - `app/services/scraper_service.py`
  - `app/controllers/controller.py`
  - `app/data/settings.json`

### BUG-002: 세션 만료 시 무한 재시도
- **현상**: 로그인 세션 만료 시 재로그인 무한 반복
- **원인**: 재로그인 실패 시 예외 처리 부재
- **영향도**: 낮 (수동 재시작으로 해결)
- **수정 계획**: 재시도 횟수 제한 추가

---

## 📝 기술 부채 (Technical Debt)

### DEBT-001: Pydantic 미적용 영역
- **현재**: Controller에서 dict 직접 전달
- **목표**: 모든 데이터 교환을 Pydantic 모델로 변환
- **우선순위**: 낮 (동작에는 문제 없음)

### DEBT-002: 테스트 코드 부재
- **현재**: 수동 테스트만 진행
- **목표**: 주요 모듈 단위 테스트 작성
- **우선순위**: 중

---

작성자: KH.Choi
최종 수정: 2026-02-18
