feat(reports): add simplified report builder, fix nan/inf crash and separate unhired/no-pass staff

This commit is contained in:
2026-09-24 09:25:57 +03:00
parent 9c89b6592e
commit 30651672ab
10 changed files with 437 additions and 89 deletions
+18 -4
View File
@@ -134,12 +134,24 @@ def main():
if df_scud_today is not None and not df_scud_today.empty:
export_raw_scud(df_scud_today, filename=f"СКУД_Сырые_данные_{today_str}.xlsx")
# [Этап 3] Детальный отчет за вчера через otchet_generator
print(f"\n[3/5] Обработка и построение детального отчета за ВЧЕРА ({yesterday_str})...")
# [Этап 3] Детальный и Упрощенный отчеты за вчера
print(f"\n[3/5] Обработка и построение детального и упрощенного отчетов за ВЧЕРА ({yesterday_str})...")
res_otchet = generate_otchet_service(target_date=yesterday_str)
if res_otchet.get("status") == "success":
print(f"[✓] {res_otchet.get('message')}: {res_otchet.get('filepath')}")
# Генерация Упрощенного отчета за вчера
try:
from services.reports.simplified_builder import generate_simplified_excel
df_scud_y = load_best_snapshot_for_date(yesterday_str, prefer_final_y=True)
df_staff_y, df_abs_y = load_1c_files_for_date(yesterday_str)
df_merged_y = merge_scud_and_1c(df_scud_y, df_staff_y, df_abs_y)
simplified_path = generate_simplified_excel(df_merged_y, date_str=yesterday_str)
print(f"[✓] Упрощенный отчет за {yesterday_str} успешно сформирован: {simplified_path}")
except Exception as e:
print(f"[⚠️] Ошибка формирования упрощенного отчета: {e}")
# [Этап 4] Сводка за сегодня через svodka_generator
print(f"\n[4/5] Обработка и построение Ежедневной сводки за {today_str} {args.time or ''}...")
res_svodka = generate_svodka_service(
@@ -165,8 +177,10 @@ def main():
]
absent_unexplained = df_merged_today[
(df_merged_today['Пришел'] == False) &
(df_merged_today['Вид_отсутствия'].isna() | (df_merged_today['Вид_отсутствия'].astype(str).str.strip() == '')) &
(df_merged_today.get('is_excluded', False) == False)
(df_merged_today['Вид_отсутствия'].isna() | (df_merged_today['Вид_отсутствия'].astype(str).str.strip().isin(['', 'nan', 'None']))) &
(df_merged_today.get('is_excluded', False) == False) &
(df_merged_today.get('not_hired_yet', False) == False) &
(df_merged_today.get('no_scud_pass', False) == False)
]
summary_md = generate_markdown_report(