diff --git a/api/clockify.py b/api/clockify.py index cc76452..1d35dd7 100644 --- a/api/clockify.py +++ b/api/clockify.py @@ -8,7 +8,7 @@ from tqdm import tqdm from config import ClockifyConfig, config from classes import Activity, Tag, VetroProject from exceptions import InvalidToken -from utils import parse_task_id, time_to_hour +from utils import format_hours, parse_task_id, time_to_hour from .constants import REQUEST_TIMEOUT @@ -112,7 +112,7 @@ class ClockifyAPI(ClockifyConfig): ) ) logger.info(f"Сохранено задач: {len(result)}") - logger.info(f"Отработано часов: {time_worked_out_total:.3f}") + logger.info(f"Отработано часов: {format_hours(time_worked_out_total)}") return result diff --git a/services/tracking.py b/services/tracking.py index 2ad6b21..1afa9d1 100644 --- a/services/tracking.py +++ b/services/tracking.py @@ -4,7 +4,7 @@ import logging from colorama import Fore -from utils import format_date +from utils import format_date, format_hours logger = logging.getLogger(__name__) @@ -80,9 +80,9 @@ class TrackingService: logger.info(f"{Fore.YELLOW}Предпросмотр переноса трудочасов{Fore.RESET}") logger.info(f"Найдено активностей: {len(activities)}") logger.info(f"Готово к переносу: {len(trackable_activities)}") - logger.info(f"Всего часов: {total_hours:.3f}") + logger.info(f"Всего часов: {format_hours(total_hours)}") for activity in trackable_activities: logger.info( f"{activity.date_start.date()} | #{activity.task_id} | " - f"{activity.time_spent:.3f} ч | {activity.description}" + f"{format_hours(activity.time_spent)} | {activity.description}" ) diff --git a/utils.py b/utils.py index 522f04c..3eada41 100644 --- a/utils.py +++ b/utils.py @@ -13,6 +13,19 @@ logger = logging.getLogger(__name__) def time_to_hour(time: timedelta) -> float: return round(time.total_seconds() / 3600, 3) +def format_hours(hours: float) -> str: + """Форматирует десятичные часы и длительность без нулевых старших единиц.""" + total_seconds = round(hours * 3600) + hours_part, remaining_seconds = divmod(total_seconds, 3600) + minutes_part, seconds_part = divmod(remaining_seconds, 60) + if hours_part: + duration = f"{hours_part}:{minutes_part:02}:{seconds_part:02}" + elif minutes_part: + duration = f"{minutes_part}:{seconds_part:02}" + else: + duration = str(seconds_part) + return f"{hours:.3f} ч ({duration})" + def today_start() -> datetime: td = datetime.today() year = td.year