v2.13.1: 일일보고 시간연차 분 단위 표시

Fixed:
- 30분 연차(0.0625일)가 int(days * 8) 절삭으로 "0시간"으로 표시되어
  보고서 수신자가 사용 내역을 알 수 없던 문제. 분 단위까지 표시.
- 보고서만 1일=8시간으로 하드코딩되어 단축근무(7h30m) 사용자의 반차가
  4시간으로 표시되던 오류. DB 정본(days * work_minutes) 기준으로 통일.

Added:
- utils.time_format.format_leave_amount(days, work_minutes) 공용 헬퍼
  + 자체 검사 9건 (python utils/time_format.py)
- i18n 키 report.leave_used_days_time (ko/en)

테스트: 유닛 200 / 통합 53 / GUI 8 / i18n 5 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
KINDNICK
2026-09-01 12:41:13 +09:00
co-authored by Claude Opus 5
parent f28f0619a4
commit 21a01df97a
5 changed files with 73 additions and 25 deletions
+18 -24
View File
@@ -34,7 +34,7 @@ from ui.settings_view import SettingsView
from ui.break_view import BreakView
from core.notifier import Notifier
from utils.system_tray import SystemTrayIcon
from utils.time_format import format_hours_minutes
from utils.time_format import format_hours_minutes, format_leave_amount
from ui.styles import get_theme, ThemeColors, apply_dark_titlebar
from utils.debug_log import dlog
@@ -2265,6 +2265,21 @@ class MainWindow(QMainWindow):
if self.is_clocked_in and self.clock_in_time:
self.update_display()
def _format_leave_used(self, days: float) -> str:
"""연차 사용량을 '30분' / '3시간 45분' / '1일 4시간' 형태로.
기존에는 `int(days * 8)`로 시간만 뽑아 30분 연차(0.0625일)가 "0시간"으로
표시됐다. 환산 기준도 DB 정본(`days * work_minutes`)에 맞춰 단축근무
사용자의 반차가 4시간으로 뻥튀기되지 않게 한다.
"""
d, rem = format_leave_amount(days, self.db.get_work_minutes())
if d and rem:
return tr('report.leave_used_days_time', days=d,
time=format_hours_minutes(rem, omit_zero_minutes=True))
if d:
return tr('report.leave_used_days', days=d)
return format_hours_minutes(rem, omit_zero_minutes=True)
def _append_meal_section(self, report_lines, today: str, label: str,
flag: bool, records: list, default_min: int) -> None:
"""일일 보고서의 점심/저녁 섹션 출력.
@@ -2458,16 +2473,7 @@ class MainWindow(QMainWindow):
if filtered_leave_records:
total_leave_days = sum(r['days'] for r in filtered_leave_records)
if total_leave_days >= 1:
days = int(total_leave_days)
hours = int((total_leave_days - days) * 8)
if hours > 0:
value = tr('report.leave_used_days_hours', days=days, hours=hours)
else:
value = tr('report.leave_used_days', days=days)
else:
hours = int(total_leave_days * 8)
value = tr('report.leave_used_hours', hours=hours)
value = self._format_leave_used(total_leave_days)
report_lines.append(tr('report.leave_used', value=value))
for lr in filtered_leave_records:
@@ -2483,19 +2489,7 @@ class MainWindow(QMainWindow):
'반반차': tr('leave.type.quarter')
}.get(lr.get('leave_type', ''), lr.get('leave_type', tr('leave.type.annual')))
days_used = lr['days']
# 일수를 시간으로 표시
if days_used >= 1:
d = int(days_used)
h = int((days_used - d) * 8)
if h > 0:
time_str = tr('report.leave_used_days_hours', days=d, hours=h)
else:
time_str = tr('report.leave_used_days', days=d)
else:
h = int(days_used * 8)
time_str = tr('report.leave_used_hours', hours=h)
time_str = self._format_leave_used(lr['days'])
memo = f" - {lr['memo']}" if lr.get('memo') else ""
report_lines.append(f" - {leave_type_name}: {time_str}{memo}")