diff --git a/lk/handlers.py b/lk/handlers.py
index 922f2ef..0a023d8 100644
--- a/lk/handlers.py
+++ b/lk/handlers.py
@@ -204,31 +204,57 @@ async def send_dynamic_lk_main_menu(msg: Message, user_id: str):
await msg.answer(menu_text, parse_mode="html")
async def send_tabel_months_menu(msg: Message, user_id: str):
- now = datetime.now()
- m0 = now # Текущий месяц
- m1 = now.replace(day=1) - timedelta(days=1) # Прошлый месяц (M-1)
- m2 = m1.replace(day=1) - timedelta(days=1) # Позапрошлый месяц (M-2)
- m3 = m2.replace(day=1) - timedelta(days=1) # За два месяца (M-3)
-
+ card_id = await asyncio.to_thread(get_card_id_from_ad, user_id)
months_ru = {
1: "Январь", 2: "Февраль", 3: "Март", 4: "Апрель", 5: "Май", 6: "Июнь",
7: "Июль", 8: "Август", 9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь"
}
- m0_str = f"{months_ru[m0.month]} {m0.year} г."
- m1_str = f"{months_ru[m1.month]} {m1.year} г."
- m2_str = f"{months_ru[m2.month]} {m2.year} г."
- m3_str = f"{months_ru[m3.month]} {m3.year} г."
-
- menu_text = (
- "⏱ Выберите месяц для просмотра табеля:\n\n"
- f"{EMOJI_DIGITS['1']} — {m0_str}\n"
- f"{EMOJI_DIGITS['2']} — {m1_str}\n"
- f"{EMOJI_DIGITS['3']} — {m2_str}\n"
- f"{EMOJI_DIGITS['4']} — {m3_str}\n\n"
- f"{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню"
- )
+ now = datetime.now()
+ # Генерируем список из 4 месяцев: текущий, прошлый, позапрошлый, за два месяца
+ candidates = []
+ m = now
+ for _ in range(4):
+ candidates.append((m.year, m.month))
+ m = m.replace(day=1) - timedelta(days=1)
+ # Проверяем какие месяцы имеют данные в БД
+ import lk.info_service as info_service
+ conn = info_service.get_db_connection()
+ cursor = conn.cursor()
+ try:
+ available = []
+ for year, month in candidates:
+ cursor.execute(
+ "SELECT TOP 1 1 FROM UOV_SELFSERVICE_TB_TABEL WHERE EMP_ID IN (SELECT ID FROM UOV_SELFSERVICE_PR_EMP WHERE CARD_ID=%s) AND YEAR(D)=%s AND MONTH(D)=%s",
+ (card_id, year, month)
+ )
+ if cursor.fetchone():
+ available.append((year, month))
+ finally:
+ conn.close()
+
+ if not available:
+ await msg.answer("⚠️ Данные табеля отсутствуют.\n\nЗа указанный период данные в системе не найдены.", parse_mode="html")
+ return
+
+ # Строим динамическое меню
+ lines = ["⏱ Выберите месяц для просмотра табеля:\n\n"]
+ for idx, (year, month) in enumerate(available, 1):
+ digit = EMOJI_DIGITS.get(str(idx), str(idx))
+ lines.append(f"{digit} — {months_ru[month]} {year} г.")
+
+ lines.append(f"\n{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню")
+ menu_text = "\n".join(lines)
+
+ # Сохраняем доступные месяцы в сессию для обработчика
+ user_page_sessions[user_id] = {
+ "tabel_months": available,
+ "current_page": 0,
+ "per_page": 5,
+ "static_header": "",
+ "items": []
+ }
set_state(user_id, "LK_TABEL_MONTHS")
await msg.answer(menu_text, parse_mode="html")
@@ -409,30 +435,26 @@ async def lk_router_handler(msg: Message):
elif cmd == "9":
set_state(user_id, "LK_MODE")
await send_dynamic_lk_main_menu(msg, user_id)
- elif cmd in ["1", "2", "3", "4"]:
- log_menu_stats(user_id, "Личный кабинет", f"Просмотр табеля (вариант {cmd})")
+ elif cmd.isdigit():
+ session = user_page_sessions.get(user_id)
+ if not session or not session.get("tabel_months"):
+ await msg.answer(UNKNOWN_MAIN_CMD_TEXT, parse_mode="html")
+ return
+ idx = int(cmd) - 1
+ available = session["tabel_months"]
+ if idx < 0 or idx >= len(available):
+ await msg.answer(UNKNOWN_MAIN_CMD_TEXT, parse_mode="html")
+ return
+ target_year, target_month = available[idx]
+ log_menu_stats(user_id, "Личный кабинет", f"Просмотр табеля ({target_month}.{target_year})")
await msg.answer(lk_tabel_loading(EMOJI_DIGITS), parse_mode="html")
try:
card_id = await asyncio.to_thread(get_card_id_from_ad, user_id)
- now = datetime.now()
-
- m0 = now
- m1 = now.replace(day=1) - timedelta(days=1)
- m2 = m1.replace(day=1) - timedelta(days=1)
- if cmd == "1":
- target_date = m0 # Текущий месяц
- elif cmd == "2":
- target_date = m1 # Прошлый месяц
- elif cmd == "3":
- target_date = m2 # Позапрошлый месяц
- elif cmd == "4":
- target_date = m2.replace(day=1) - timedelta(days=1) # За два месяца
-
tabel_report = await asyncio.to_thread(
get_tabel_report_text,
card_id,
- target_date.year,
- target_date.month
+ target_year,
+ target_month
)
set_state(user_id, "LK_TABEL_VIEW")
await msg.answer(tabel_report + nav_text, parse_mode="html")