промежуточный положительный результат. Отчеты коррктно формируются. Перед автоматической загрузкой файлов 1С.

This commit is contained in:
2026-07-30 12:42:41 +03:00
parent 2fc417f3a7
commit 9347c42d22
10 changed files with 477 additions and 237 deletions
+36 -7
View File
@@ -3,12 +3,13 @@ import pandas as pd
import warnings
from config import (
normalize_fio, clean_scud_fio_light, load_exceptions,
DATA_DIR, SCUD_FILE, SCUD_FILE_TODAY, SCUD_FILE_YESTERDAY,
SCUD_FILE, SCUD_FILE_TODAY, SCUD_FILE_YESTERDAY,
STAFF_FILE_1C, ABSENT_FILE_1C
)
warnings.filterwarnings('ignore', category=UserWarning, module='pandas')
def is_excluded(fio, dept, pos, exceptions):
fio_clean = normalize_fio(fio)
dept_str = str(dept).strip().upper() if pd.notna(dept) else ""
@@ -20,6 +21,7 @@ def is_excluded(fio, dept, pos, exceptions):
return True
return False
def load_staff_data():
if not os.path.exists(STAFF_FILE_1C):
raise FileNotFoundError(f"Файл штатного расписания не найден по пути: {STAFF_FILE_1C}")
@@ -28,6 +30,7 @@ def load_staff_data():
df_staff['fio_clean'] = df_staff['ФИО'].apply(normalize_fio)
return df_staff
def load_absent_data():
if not os.path.exists(ABSENT_FILE_1C):
raise FileNotFoundError(f"Файл отсутствий не найден по пути: {ABSENT_FILE_1C}")
@@ -37,10 +40,24 @@ def load_absent_data():
df_absent['fio_clean'] = df_absent['ФИО'].apply(normalize_fio)
return df_absent[['fio_clean', 'Вид_отсутствия']].dropna(subset=['fio_clean'])
def load_scud_data():
scud_path = SCUD_FILE_TODAY if os.path.exists(SCUD_FILE_TODAY) else (SCUD_FILE_YESTERDAY if os.path.exists(SCUD_FILE_YESTERDAY) else SCUD_FILE)
def load_scud_data(target_date_type="today"):
"""
Загружает файл СКУД за конкретную дату:
• target_date_type="today" -> data/scud/Сотрудники_СЕГОДНЯ.xlsx
• target_date_type="yesterday" -> data/scud/Сотрудники_ВЧЕРА.xlsx
"""
if target_date_type == "yesterday":
scud_path = SCUD_FILE_YESTERDAY
else:
scud_path = SCUD_FILE_TODAY
# Резервный фоллбэк, если конкретный файл отсутствия еще не создан
if not os.path.exists(scud_path):
raise FileNotFoundError(f"Файл СКУД не найден в папке data/scud: {scud_path}")
if os.path.exists(SCUD_FILE):
scud_path = SCUD_FILE
else:
raise FileNotFoundError(f"Файл СКУД [{target_date_type}] не найден по пути: {scud_path}")
df_scud = pd.read_excel(scud_path)
exceptions = load_exceptions()
@@ -51,7 +68,6 @@ def load_scud_data():
start_col = 'Начало_дня' if 'Начало_дня' in df_scud.columns else ('Начало дня' if 'Начало дня' in df_scud.columns else None)
status_col = 'Статус' if 'Статус' in df_scud.columns else None
# 🎯 ФИЗИЧЕСКИЙ ФАКТ ПРИСУТСТВИЯ
def is_person_present(row):
val_status = str(row.get(status_col, '')).strip().lower() if status_col else ''
val_time = str(row.get(start_col, '')).strip() if start_col else ''
@@ -68,9 +84,22 @@ def load_scud_data():
)
return df_scud
def load_all_data():
df_scud = load_scud_data()
"""
Загружает слитный датасет за сегодня, а также отдельный датасет за вчера.
Возвращает: df_scud_today, df_scud_yesterday, staff_fios_clean, df_absent
"""
df_scud_today = load_scud_data(target_date_type="today")
# Пытаемся забрать вчерашние данные СКУД
try:
df_scud_yesterday = load_scud_data(target_date_type="yesterday")
except FileNotFoundError:
df_scud_yesterday = df_scud_today.copy()
df_staff = load_staff_data()
df_absent = load_absent_data()
staff_fios_clean = df_staff['fio_clean'].dropna().tolist()
return df_scud, staff_fios_clean, df_absent
return df_scud_today, df_scud_yesterday, staff_fios_clean, df_absent