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")