Scheduler v1
All checks were successful
Test Build / test-build (push) Successful in 23s

This commit is contained in:
2025-07-30 18:28:55 +03:00
parent 8e757afe39
commit 0f1c749b33
7 changed files with 457 additions and 159 deletions

View File

@@ -1,7 +1,8 @@
import json
import logging
from jinja2 import Template
from datetime import datetime
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta
# Настройка логирования
logger = logging.getLogger(__name__)
@@ -138,4 +139,52 @@ def get_dates(start_date, end_date):
logger.error(f"Дата начала '{start_date}' не может быть позже даты окончания '{end_date}'.")
raise ValueError("Дата начала не может быть позже даты окончания.")
return start_date, end_date
return start_date, end_date
def calculate_period_dates(period_key):
"""
Вычисляет начальную и конечную даты на основе строкового ключа.
Возвращает кортеж (start_date_str, end_date_str) в формате YYYY-MM-DD.
"""
if not period_key:
raise ValueError("Period key cannot be empty.")
today = date.today()
yesterday = today - timedelta(days=1)
date_format = "%Y-%m-%d"
# За прошлую неделю (с пн по вс)
if period_key == 'previous_week':
start_of_last_week = today - timedelta(days=today.weekday() + 7)
end_of_last_week = start_of_last_week + timedelta(days=6)
return start_of_last_week.strftime(date_format), end_of_last_week.strftime(date_format)
# За последние 7 дней (не включая сегодня)
if period_key == 'last_7_days':
start_date = today - timedelta(days=7)
return start_date.strftime(date_format), yesterday.strftime(date_format)
# За прошлый месяц
if period_key == 'previous_month':
last_month = today - relativedelta(months=1)
start_date = last_month.replace(day=1)
end_date = start_date + relativedelta(months=1) - timedelta(days=1)
return start_date.strftime(date_format), end_date.strftime(date_format)
# За текущий месяц (до вчера)
if period_key == 'current_month':
start_date = today.replace(day=1)
return start_date.strftime(date_format), yesterday.strftime(date_format)
# Динамический ключ "За последние N дней"
if period_key.startswith('last_') and period_key.endswith('_days'):
try:
days = int(period_key.split('_')[1])
if days <= 0:
raise ValueError("Number of days must be positive.")
start_date = today - timedelta(days=days)
return start_date.strftime(date_format), yesterday.strftime(date_format)
except (ValueError, IndexError):
raise ValueError(f"Invalid dynamic period key: {period_key}")
raise ValueError(f"Unknown period key: {period_key}")