/
Soitch
/
vacation-schedule
Обзор
Документация
Войти
/
Soitch
/
vacation-schedule
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/utils.py
69 строк
3 KB
Soitch
draft
12 дек 2025, 00:12
12 дек 2025, 00:12
5b3d7e2
Код
Авторство
О чём код?
""" Вспомогательные утилиты для модуля отпусков. """ import math from datetime import datetime, date, timedelta from typing import Optional, Tuple, List, Dict, Any def is_finite(value: float) -> bool: """Проверяет, является ли число конечным (не NaN и не бесконечностью).""" return isinstance(value, (int, float)) and math.isfinite(value) def round2(x: float) -> float: """Округление до 2 знаков после запятой.""" return float(f"{x:.2f}") def parse_date(date_str: str, format: str = "%Y-%m-%d") -> Optional[date]: """Преобразует строку в дату.""" try: return datetime.strptime(date_str, format).date() except (ValueError, TypeError): return None def is_working_day(check_date: date) -> bool: """Проверяет, является ли день рабочим (не выходной).""" return check_date.weekday() < 5 # 0-4 = понедельник-пятница def calculate_working_days(start_date: date, end_date: date) -> int: """Рассчитывает количество рабочих дней между двумя датами (включительно).""" if start_date > end_date: return 0 days = (end_date - start_date).days + 1 working_days = 0 for i in range(days): current_date = start_date + timedelta(days=i) if is_working_day(current_date): working_days += 1 return working_days def date_to_str(d: date) -> str: """Преобразует дату в строку формата YYYY-MM-DD.""" return d.strftime("%Y-%m-%d") def get_fiscal_year(date_obj: date) -> int: """Определяет финансовый год для даты.""" return date_obj.year def calculate_vacation_overlap(start1: date, end1: date, start2: date, end2: date) -> int: """Рассчитывает количество дней пересечения двух отпусков.""" latest_start = max(start1, start2) earliest_end = min(end1, end2) if latest_start <= earliest_end: return (earliest_end - latest_start).days + 1 return 0 def calculate_monthly_salary(daily_salary: float, working_days_per_month: int = 22) -> float: """Рассчитывает месячную зарплату на основе дневной.""" return round2(daily_salary * working_days_per_month) def calculate_vacation_payment_days(total_days: int, include_weekends: bool = True) -> int: """Рассчитывает количество оплачиваемых дней отпуска.""" if include_weekends: return total_days # Примерная оценка - примерно 5/7 дней рабочие return int(total_days * 5 / 7)