• v2.13.1 Stable

    kindnick released this 2026-09-01 12:41:13 +09:00 | 0 commits to main since this release

    [2.13.1] — 2026-09-01

    Fixed

    • 일일보고에서 시간 단위 연차가 "0시간"으로 표시되던 문제 — 30분 연차(0.0625일)가
      int(days * 8) 절삭으로 0시간이 되어 보고서를 받는 담당자가 사용 내역을 알 수 없었다.
      분 단위까지 표시하도록 수정 (30분, 1시간 30분, 1일 4시간).
    • 단축근무 사용자의 연차 시간 환산 오류 — 보고서만 1일=8시간으로 하드코딩되어 있어
      7h30m 근무자의 반차가 4시간으로 표시됐다. DB 정본(days * work_minutes)과 동일한
      기준으로 통일 — 이제 3시간 45분.

    Added

    • utils.time_format.format_leave_amount(days, work_minutes) — 연차 일수를
      (일수, 나머지 분)으로 분해하는 공용 헬퍼 + 자체 검사(python utils/time_format.py).
    • i18n 키 report.leave_used_days_time ({days}일 {time} / {days}d {time}).
    Downloads
  • v2.13.0 Stable

    kindnick released this 2026-08-12 14:06:18 +09:00 | 1 commits to main since this release

    [2.13.0] — 2026-08-12

    Fixed — 익일(자정 넘김) 퇴근

    • 새벽 퇴근이 출근일 기록에 저장되지 않던 버그clock_out()datetime.now().date()
      대상 행으로 써서, 자정을 넘겨 퇴근하면 해당 날짜 행이 없어 UPDATE가 0건 처리되고 출근일
      기록이 영구 미퇴근으로 남았다. 근무일 경계(기본 6시) 전까지는 출근일이 근무일이라는
      handle_workday_rollover()의 기준을 clock_out()에도 적용. cancel_clock_out() 동일 수정.
    • 야근이 주말/공휴일 근무로 오분류되던 문제 — 근무 성격 판정(is_non_working_day/
      get_day_type)과 외출 시간 집계를 now가 아닌 출근일 기준으로 변경. 금요일 야근이
      토요일 근무로 뒤바뀌어 전 시간이 연장근무로 적립되지 않는다.
    • 익일 퇴근 기록을 수정할 수 없던 문제 — 캘린더의 시간 수정과 과거기록 추가 다이얼로그가
      퇴근 <= 출근을 입력 오류로 반려해 익일 퇴근을 저장할 방법이 아예 없었다. 이제 익일로
      해석하고, 동시각인 경우만 반려. 총 근무시간·연장근무가 음수로 깨지던 계산도 함께 수정.

    Added

    • 일일보고를 다른 날짜로도 복사generate_daily_report(target_date)로 날짜 파라미터화.
      캘린더에서 날짜 선택 → 보고서 복사 버튼으로 지난 날짜 보고서를 다시 뽑을 수 있다.
      생략 시 기본값은 진행 중인 근무일(자정~경계시간 사이면 출근일)이라 새벽 퇴근 후에도
      "기록 없음"이 뜨지 않는다.
    • 연차 직접입력 버튼 (메인 창) — 연장근무 줄과 동일한 구성. 기존 AddLeaveDialog
      재사용해 날짜(캘린더)/유형/시간/사유를 한 화면에서 입력. 그쪽은 주말·공휴일 차단과
      같은 날 1일 초과 중복 검증까지 갖추고 있다. (구현돼 있었으나 어떤 버튼에도 연결되지
      않았던 use_custom_leave()를 연결)
    • 익일 퇴근 표기 — 보고서/캘린더 상세에 익일 01:30, 수정 다이얼로그에 실시간 안내
      (🌙 익일 퇴근으로 저장됩니다 (출근~퇴근 16시간 30분)).
    • core.time_calculator.resolve_work_datetimes() / is_overnight() — 익일 판정을 한 곳으로
      통일 (외출 기록의 자정 처리와 같은 규칙). 유닛 테스트 6개 추가.

    Changed

    • 연차 빠른 사용에서 날짜·메모 입력 팝업 제거 — 30분/1시간/반차/종일 버튼이 연장근무
      사용과 동일하게 확인 1회로 끝난다(팝업 3개 → 1개). 날짜·사유 지정은 직접입력으로.
    • Database.get_today_overtime_usage() / get_total_break_minutes_today()에 선택적
      date_str 파라미터 추가 (기본값은 기존과 동일한 오늘).
    Downloads
  • v2.12.0 Stable

    kindnick released this 2026-06-16 10:54:22 +09:00 | 2 commits to main since this release

    [2.12.0] — 2026-06-16

    Added — 전체 i18n 키화 완료

    • UI 전체 사용자 대면 문자열 i18n 키화ui/ 디렉터리 22개 파일의 버튼/라벨/메시지박스/차트/온볼딩/설정/통계 등을 tr() 기반으로 전환, core/i18n.py에 ko/en 번역 추가.
    • 도전과제 메타데이터 i18ncore/achievements.py의 모든 도전과제 이름/설명을 achieve.{code}.name/desc 키로 분리하고 영문 번역 추가.
    • 차트 위젯 라벨 키화 — matplotlib 차트의 축/툴팁/범례/빈 기록 메시지 등을 언어별로 표시.
    • 반복 연차 패턴 설명 키화core/recurring_leaves.describe_pattern()이 요일/주기 접두사를 i18n 키로 조합.

    Fixed

    • ui/help_view.py의 "온보팅 다시 보기" 버튼이 tr() 호출이 아닌 리터럴 문자열로 잘못 들어가던 버그 수정.
    • core/i18n.py 영문 achievement 번역 중 Children's/Teachers' 작은따옴표로 인한 SyntaxError 수정.
    • _i18n_gui_test.pyCLOCKOUT_DISABLE_HOLIDAY_SYNC=1 추가하여 백그라운드 휴일 동기화 스레드로 인한 세그멘테이션 폴트 방지.

    Changed

    • 공공데이터포털 공휴일 API 키 외부화utils/holiday_api.pyCLOCKOUT_HOLIDAY_API_KEY 환경변수를 사용하도록 변경.
    • ui/main_window.py 1Hz 핫패스 DB 호출 캐싱 추가.
    • utils/csv_importer.py overwrite 시 overtime_usage도 함께 삭제.
    • ui/controllers/lock_monitor.py 컨텍스트 매니저 적용 및 race condition 처리 개선.
    Downloads
  • v2.11.2 Stable

    kindnick released this 2026-06-04 19:22:00 +09:00 | 5 commits to main since this release

    [2.11.2] — 2026-06-04

    Fixed

    • 통계 차트가 빌드(main.exe)에서 안 뜨던 진짜 원인 — frozen 빌드에서 numpy C-확장
      numpy.core._multiarray_tests가 누락(numpy.testing 제외의 영향)되어 matplotlib import가
      ModuleNotFoundError로 실패 → "matplotlib 필요" 폴백. main.spec에 해당 모듈 hiddenimport
      추가 + numpy.testing 제외 제거. (디버그 로그로 원인 확인: chart_widget이 실패 사유를 기록)
    • 도전과제 라이트 테마 가독성 — 헤더 강조 숫자/등급 배지/진행 숫자/진행 바를 라이트에서
      대비 높은 색으로 조정 (다크는 기존 비비드 색 유지).
    Downloads
  • v2.10.2 Stable

    kindnick released this 2026-05-16 18:16:45 +09:00 | 9 commits to main since this release

    [2.10.2] — 2026-05-16

    Fixed

    • 휴일/주말 근무 시 카운터 초가 항상 00 으로 멈춰 보이던 문제 (사용자 보고)
      • 원인: 휴일 분기에서 calculate_holiday_overtime의 분 절삭값(적립 단위)을
        그대로 표시에 사용 → 초 정보 소실
      • 수정: 표시용 remaining을 초 정밀도 timedelta로 분리 계산
        (적립 계산은 퇴근 시 분 단위 그대로 — 영향 없음)
      • 차감 항목(점심·저녁·외출·연장 사용)은 calculate_holiday_overtime과 동일하게 적용
    Downloads
  • kindnick released this 2026-05-01 18:33:55 +09:00 | 10 commits to main since this release

    Fixed — 업데이트 시 cmd 창 깜빡임 제거

    • updater.spec: console=Trueconsole=False (windowed 빌드).
      자동 업데이트 적용 시 잠깐 뜨던 까만 cmd 창이 더 이상 보이지 않음.
    • updater.py: stderr 출력을 ~/.clockout_logs/updater.log 파일 폴백으로 전환
      — windowed 모드라도 진단 로그는 보존. 모든 단계(시작/PID 대기/replace/launch)
      에 타임스탬프 + 결과 기록.
    • updater.py launch(): subprocess.PopenCREATE_NO_WINDOW 플래그 추가
      (DETACHED_PROCESS와 함께) — 자식 프로세스가 콘솔을 새로 만들지 않음.
    • utils/updater_client.py apply_update(): 같은 패턴으로 CREATE_NO_WINDOW 추가.
      main.exe → updater.exe 호출 시점에서도 콘솔 생성 차단.
    Downloads
  • v2.10.0 Stable

    kindnick released this 2026-05-01 13:51:33 +09:00 | 11 commits to main since this release

    [2.10.0] — 2026-05-01

    Added — 정부 공휴일 API 자동 동기화

    • 공공데이터포털 특일정보 API 연동 (utils/holiday_api.py)
      • 한국천문연구원 운영 공식 데이터 — /getRestDeInfo 엔드포인트
      • 임시공휴일·근로자의 날까지 정부 공인 데이터로 보강
      • 일일 한도 10,000회 / 사용자 50명 = 0.5% 사용
      • 키는 dev 본인 계정의 특일정보 API 한정 키
    • Database.add_korean_holidays_from_api(year) — 정부 API 1차 시도
    • add_korean_holidays_auto() 동작 변경 — 1차 정부 API → 2차 fallback holidays 패키지
    • migrate_v290_holidays_auto_sync — 일 1회 자동 동기화 (백그라운드 스레드)
      • sentinel: settings['holidays_synced_date']
      • 매일 호출 → 정부가 임시공휴일 발표하면 다음 날 자동 반영
      • 부트스트랩 비차단 (네트워크 호출은 daemon thread)
      • 테스트 환경: CLOCKOUT_DISABLE_HOLIDAY_SYNC=1 로 비활성화

    Changed

    • 설정 → "한국 공휴일 자동 추가" 버튼 안내문 — 1차 정부 API / 2차 holidays 패키지

    Tests

    • tests/test_holiday_api.py 14개 신규 (응답 파싱 / 단일/다중 item / 401·timeout / 응답 검증)
    • tests/conftest.py — 모든 테스트에서 백그라운드 동기화 비활성화
    • pytest: 175 → 189

    주의

    • 키 활용기간 시작 직후엔 백엔드 propagation으로 401 가능 (1~2시간 또는 익일 활성화).
      401 시 fallback (holidays 패키지 + 근로자의 날 명시 추가) 정상 동작 — 사용자 영향 없음.
    Downloads
  • v2.9.0 Stable

    kindnick released this 2026-05-01 13:13:01 +09:00 | 12 commits to main since this release

    [2.9.0] — 2026-05-01

    Fixed — 휴일 hot-path 버그 (사용자 보고)

    • 휴일에 출근해도 정상 출근으로 처리되어 추가근무 적립이 안 되던 문제
      • update_display() 1Hz 루프에 is_non_working_day 분기 누락으로 휴일에도
        "남은 시간 8h"부터 카운트다운 → 실제 출근 즉시 적립이 시작되지 않음
      • 수정: 출근 직후부터 음수 remaining 표시, "공휴일 근무 (전체 적립)" 그룹 타이틀
      • 진행바: 휴일은 100% 고정 (의미 없음)
      • 예상 퇴근: "휴일 근무 (정해진 퇴근시각 없음)"
    • 휴일 "퇴근 30분 전" 알림 게이팅 — 휴일엔 정해진 퇴근시각이 없으니 무의미한 알림 스킵
    • 자동복구 퇴근 3곳의 // 30) * 30 하드코딩 → 사용자 overtime_unit (15/30/60) 설정 적용
    • 4곳에 중복되던 휴일 연장 계산 로직을 TimeCalculator.calculate_holiday_overtime() 헬퍼로 통합

    Added — 연차 미리등록 + 통합 스케줄 + 반복 연차 (Phase 1+2)

    Phase 1 — 연차 미리등록 + 자동 적용

    • DB: get_leave_minutes_for(date) / has_full_day_leave(date) /
      get_leave_records_by_date(date) / get_leave_records_by_range(start, end)
    • TimeCalculator: effective_work_minutes(date_obj, db) — 부분 연차만큼 정규 근무 차감
    • 종일 연차일 자동 처리:
      • 자동 출근감지 스킵 (event_monitor 호출 안 함)
      • "🌴 오늘은 휴가" 카드 표시, 카운트다운 제거
      • 메인/미니 위젯/트레이 모두 일관된 휴가 상태 표시
    • 종일 연차 + 출근 override: 휴일처럼 전체 시간 적립 (사용자 확인 후)
    • 부분 연차 (반차/반반차/시간): 기존 leave_used 경로로 카운트다운 단축
    • AddLeaveDialog 검증 강화: 미래 1년 setMaximumDate / 주말·공휴일 차단 / 같은 날 1일 초과 차단
    • leave_calendar_view: 예정(파랑) / 사용완료(녹·노·보) 색상 분리

    Phase 2 — 통합 스케줄 + 반복 연차

    • recurring_leaves 테이블 (pattern/leave_type/days/start_date/end_date/memo)
    • core/recurring_leaves.py: weekly / biweekly / monthly 패턴 파서 + expand_for_range/date
    • 자동 합산: get_leave_minutes_for() / has_full_day_leave()가 반복 패턴 인스턴스도 함께 검사
    • ui/recurring_leave_dialog.py: 매주/격주 요일 또는 매월 N일 입력
    • ui/schedule_view.py: 월간 통합 캘린더 (휴일·연차·반복 색상 구분 + 우클릭 삭제)
    • 진입점: MainWindow.show_schedule(), 트레이 "🗓️ 스케줄", LeaveView "🗓️ 스케줄"

    Changed

    • 근로자의 날(5/1) 자동 추가holidays.KR 패키지가 누락하는 노동자 휴일을
      add_korean_holidays_auto()에서 명시적 보강 (매년 반복)

    Tests

    • pytest: 122 → 175 (+53)
      • tests/test_recurring_leaves.py 32개 (패턴 파싱/매칭/expand/describe)
      • tests/test_database.py +12 (TestLeaveQueriesByDate + TestRecurringLeavesDB)
      • tests/test_time_calculator.py +9 (TestHolidayOvertime)
    • 통합 시나리오: 48 → 53 (+5)
      • S52A 휴일 hot-path / S52B 종일 연차 / S52C 반복 패턴 / S52D 반차 effective / S52E 종일 effective
    Downloads
  • kindnick released this 2026-05-01 01:11:13 +09:00 | 15 commits to main since this release

    Added — 도전과제 시스템 + 디자인 리뉴얼

    • 🏆 도전과제 시스템 (153개 자동 평가) — 출근·퇴근·연장·연차·식사·외출·계절·시간대·시크릿 등 16개 카테고리.
      • core/achievements.py: Achievement dataclass + evaluate_all(db) + sync_definitions_to_db(db).
      • 5분 throttle로 자동 평가, 신규 잠금 해제 시 시스템 알림 + Discord embed push.
      • achievements 테이블 확장: code(UNIQUE), category, tier, is_secret, progress, target, created_at 컬럼 추가 (idempotent 마이그레이션).
      • 5단계 등급: 🥉 브론즈 / 🥈 실버 / 🥇 골드 / 💎 플래티넘 / 🌟 레전드.
      • 시크릿 9개 (회문, 잭팟 시각, 13일의 금요일, 7-7-7, 정확 8시간, π day, 피보나치 등).
      • 메타 도전과제 (도전과제 자체 달성 카운트).
    • ui/achievements_view.py — 4탭 다이얼로그 (전체 / 진행 중 / 완료 / 시크릿).
      • 등급별 그라디언트 카드, 진행 게이지, 카테고리 태그, 시크릿 처리.
    • 자동 hire_date 추적 — 첫 add_work_record 호출 시 settings에 자동 기록 (1주년, 365일 후 출근 등 도전과제 활성화).
    • 뷰 진입 카운터stat_*_view_count, calendar_view_count, daily_report_count 등 8개 settings 키. 도전과제 + 사용 통계용.

    Changed — 다크 테마 디자인 리뉴얼

    • ui/dark_components.py 신설 — 재사용 가능한 다크 디자인 컴포넌트:
      • dialog_qss(), tabs_qss(), scroll_qss(), button_qss(variant).
      • build_gradient_header(), build_stat_card(), build_section_card().
      • style_progressbar(), transparent_label() — 글로벌 QSS 충돌 회피.
      • 카드 테마 7종: blue / cyan / green / gold / pink / red / gray.
    • ui/stats_view.py — 4분할 카드 + 차트 섹션 카드. 골드 강조 탭. ghost 닫기 버튼.
    • ui/help_view.py — 다크 톤 + HelpHTML 내부에 다크 CSS 주입 (h1/h2/h3, code, blockquote, table 컬러).
    • ui/chart_widget.py — 모든 matplotlib 차트 다크 테마 적용 (figure/axes facecolor, grid, ticks, legend).
    • 온보딩 위저드 — 저녁 분(minutes) 입력 옵션 + i18n화 (Korean/English 프리셋 라벨).

    Fixed — 안정성·일관성

    • 타임존 자정 경계 버그: has_notification_todayCURRENT_TIMESTAMP(UTC) vs DATE('now', 'localtime') mismatch로 KST 0~9시 사이 알림 중복 발송 가능 — DATE(sent_at, 'localtime') 양쪽 적용.
    • DB 연결 누수 가드_conn() 컨텍스트 매니저 도입, 40+ 메서드 변환 (직접 get_connection() 호출 0건).
    • DB 이중 부트스트랩 제거MainWindow(db=None) 옵션 인자 추가, main.py가 만든 db를 재사용.
    • crash_handler 폴백 — DB 로깅/다이얼로그 단계 분리, 모두 실패해도 ~/.clockout_logs/crashes.log에 기록.
    • updater PID race window — 지수 backoff 재시도 (0.3→4.8s, 총 ~9초). Windows Defender 락 해제 대기 충분.
    • Discord URL 형식 검증 — Snowflake ID 17~20자리 + 50+자 토큰 정규식.
    • MealTimeDialog — 출근 시각 범위 검증 + 야간 출근자 자정 경계 자동 처리.
    • CSV importer/exporterdinner_minutes 컬럼 round-trip 지원.
    • 일일 보고서 — 저녁 섹션 추가 (이전엔 점심만 표시), break_type 분리, 자정 경계 처리.
    • 저녁 알림check_dinner_reminder() 신규 (점심 알림과 대칭).
    • 알림 임계값 설정화 — 5개 하드코딩 값(점심/저녁 알림 시간, 연장 누적, 주간 한도, 연속 야근)을 settings로 노출.
    • closeEvent 정리aboutToQuit 시그널로 timer/notifier/tray 정리.
    • 마이그레이션 일관성 — 12개 마이그레이션 모두 _conn() + try/finally 보장.

    DB 인덱스 (성능)

    • idx_break_records_date_type, idx_break_records_date.
    • idx_overtime_bank_date, idx_overtime_usage_date, idx_leave_records_date.

    Tests

    • pytest 116개 PASS, 통합 시나리오 44/48 PASS (PyQt 환경 4개 제외).
    • 도전과제 한 사이클 시나리오 검증 (30일 시뮬레이션 → 19개 자동 잠금 해제).
    Downloads
  • v2.7.0 Stable

    kindnick released this 2026-04-30 19:30:47 +09:00 | 16 commits to main since this release

    [2.7.0] — 2026-04-30

    Added — 폴리싱 릴리스 (사용자 가시 변화는 작지만 i18n + 테스트 + 구조 개선)

    • i18n 사전 100% 커버리지break_view, overtime_view, leave_view,
      clock_in_dialog 의 내부 라벨/메시지/플레이스홀더까지 전부 ko/en 키화.
      새 키 50+개 추가 (view.break.*, view.overtime.*, view.leave.*, dlg.*).
    • i18n 런타임 재번역 — 재시작 없이 메인 화면 즉시 언어 전환.
      • ui/i18n_runtime.py: register(widget, key) + set_language_and_retranslate(lang)
      • 위젯은 weakref로 보관되어 삭제 시 자동 정리
      • 메인 윈도우 타이틀/하단 메뉴 5개 버튼 등록 완료 (점진 확대)
      • 일부 다이얼로그는 여전히 재시작 필요 (다음 릴리스에서 점진 등록)
    • MealController 분리main_window.py 에서 점심/저녁 토글·라벨 갱신 로직을
      ui/controllers/meal_controller.py 로 추출. 기존 LockMonitor/AutoLunch/
      NotificationOrchestrator 패턴 준수.

    Tests

    • 통합 테스트 +15 시나리오 (S36–S52): 온보딩 신규/기존, salary 추정, CSV 가져오기
      (skip/overwrite/overtime 적립까지), notification_log dedupe, meal_record,
      crash_log, updater semver 비교, Discord 입력 검증, goal/accessibility 키 등.
    • 신규 pytest 모듈 4종 — test_salary.py, test_csv_importer.py,
      test_discord_webhook.py(network mocked), test_crash_handler.py.
    • test_i18n_runtime.py — register/retranslate/post-callback/dead-widget 정리 검증.
    • 총 pytest 케이스: 90 → 122, 통합 시나리오: 33 → 48.

    Docs

    • README.md v2.4–v2.6 신기능 섹션 정리, 재번호.
    • CLAUDE.md v2.6+ 아키텍처 — 컨트롤러 모듈, 35+ 설정 키, 릴리스 플로우 반영.
    • INSTALL.md 최신 단일파일 배포 + 온보딩 + 디스코드 + 환경변수 정리.
    • AGENTS.md 10+ DB 테이블, 컨트롤러 맵, Past Incidents 갱신.
    Downloads