lk: hide empty months from timesheet menu, show only months with data

This commit is contained in:
Денис Кривоченко
2026-07-26 17:47:23 +07:00
parent 94bd664be8
commit 3f239267d2
+57 -35
View File
@@ -204,31 +204,57 @@ async def send_dynamic_lk_main_menu(msg: Message, user_id: str):
await msg.answer(menu_text, parse_mode="html") await msg.answer(menu_text, parse_mode="html")
async def send_tabel_months_menu(msg: Message, user_id: str): async def send_tabel_months_menu(msg: Message, user_id: str):
now = datetime.now() card_id = await asyncio.to_thread(get_card_id_from_ad, user_id)
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)
months_ru = { months_ru = {
1: "Январь", 2: "Февраль", 3: "Март", 4: "Апрель", 5: "Май", 6: "Июнь", 1: "Январь", 2: "Февраль", 3: "Март", 4: "Апрель", 5: "Май", 6: "Июнь",
7: "Июль", 8: "Август", 9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь" 7: "Июль", 8: "Август", 9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь"
} }
m0_str = f"{months_ru[m0.month]} {m0.year} г." now = datetime.now()
m1_str = f"{months_ru[m1.month]} {m1.year} г." # Генерируем список из 4 месяцев: текущий, прошлый, позапрошлый, за два месяца
m2_str = f"{months_ru[m2.month]} {m2.year} г." candidates = []
m3_str = f"{months_ru[m3.month]} {m3.year} г." m = now
for _ in range(4):
candidates.append((m.year, m.month))
m = m.replace(day=1) - timedelta(days=1)
menu_text = ( # Проверяем какие месяцы имеют данные в БД
"⏱ <b>Выберите месяц для просмотра табеля:</b>\n\n" import lk.info_service as info_service
f"{EMOJI_DIGITS['1']}{m0_str}\n" conn = info_service.get_db_connection()
f"{EMOJI_DIGITS['2']}{m1_str}\n" cursor = conn.cursor()
f"{EMOJI_DIGITS['3']}{m2_str}\n" try:
f"{EMOJI_DIGITS['4']}{m3_str}\n\n" available = []
f"<i>{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню</i>" 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("⚠️ <b>Данные табеля отсутствуют.</b>\n\nЗа указанный период данные в системе не найдены.", parse_mode="html")
return
# Строим динамическое меню
lines = ["⏱ <b>Выберите месяц для просмотра табеля:</b>\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<i>{EMOJI_DIGITS['9']} — Назад\n{EMOJI_DIGITS['0']} — В главное меню</i>")
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") set_state(user_id, "LK_TABEL_MONTHS")
await msg.answer(menu_text, parse_mode="html") await msg.answer(menu_text, parse_mode="html")
@@ -409,30 +435,26 @@ async def lk_router_handler(msg: Message):
elif cmd == "9": elif cmd == "9":
set_state(user_id, "LK_MODE") set_state(user_id, "LK_MODE")
await send_dynamic_lk_main_menu(msg, user_id) await send_dynamic_lk_main_menu(msg, user_id)
elif cmd in ["1", "2", "3", "4"]: elif cmd.isdigit():
log_menu_stats(user_id, "Личный кабинет", f"Просмотр табеля (вариант {cmd})") 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") await msg.answer(lk_tabel_loading(EMOJI_DIGITS), parse_mode="html")
try: try:
card_id = await asyncio.to_thread(get_card_id_from_ad, user_id) 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( tabel_report = await asyncio.to_thread(
get_tabel_report_text, get_tabel_report_text,
card_id, card_id,
target_date.year, target_year,
target_date.month target_month
) )
set_state(user_id, "LK_TABEL_VIEW") set_state(user_id, "LK_TABEL_VIEW")
await msg.answer(tabel_report + nav_text, parse_mode="html") await msg.answer(tabel_report + nav_text, parse_mode="html")