from __future__ import annotations from dataclasses import dataclass from datetime import date, timedelta @dataclass(frozen=True) class BusinessCalendar: """Нерабочие дни загруженных лет (D30). Для года без календаря рабочими считаются будни.""" years: frozenset[int] = frozenset() non_working: frozenset[date] = frozenset() def is_business_day(self, day: date) -> bool: if day.year in self.years: return day not in self.non_working return day.weekday() < 5 def previous_business_day( today: date | None = None, calendar: BusinessCalendar | None = None ) -> date: """Дата отчёта по умолчанию — предыдущий рабочий день (в Excel — WORKDAY.INTL по списку праздников).""" calendar = calendar or BusinessCalendar() day = (today or date.today()) - timedelta(days=1) while not calendar.is_business_day(day): day -= timedelta(days=1) return day