lk: hide empty months from timesheet menu, show only months with data
This commit is contained in:
+58
-36
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user