проект теперь работает с использованием локальной базы данных SQLite. Все данные аккумулируются и хранятся в ней. Впереди - разработка веб интерфейса.
This commit is contained in:
+57
-36
@@ -3,14 +3,14 @@ import pandas as pd
|
||||
import warnings
|
||||
from config import (
|
||||
normalize_fio, clean_scud_fio_light, load_exceptions,
|
||||
SCUD_FILE, SCUD_FILE_TODAY, SCUD_FILE_YESTERDAY,
|
||||
STAFF_FILE_1C, ABSENT_FILE_1C
|
||||
DATE_TODAY, DATE_YESTERDAY, find_dated_file, ZUP_1C_DIR, SCUD_DIR
|
||||
)
|
||||
|
||||
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 ""
|
||||
pos_str = str(pos).strip().lower() if pd.notna(pos) else ""
|
||||
@@ -22,42 +22,54 @@ def is_excluded(fio, dept, pos, exceptions):
|
||||
return False
|
||||
|
||||
|
||||
def load_staff_data():
|
||||
if not os.path.exists(STAFF_FILE_1C):
|
||||
raise FileNotFoundError(f"Файл штатного расписания не найден по пути: {STAFF_FILE_1C}")
|
||||
df_staff = pd.read_excel(STAFF_FILE_1C, skiprows=7)
|
||||
df_staff = df_staff.rename(columns={df_staff.columns[1]: 'ФИО'})
|
||||
def load_staff_data(date_str):
|
||||
"""
|
||||
Загружает файл Штатного расписания 1С за конкретную дату.
|
||||
Если файла за эту дату нет — возвращает None без подмены на старые даты.
|
||||
"""
|
||||
filepath = find_dated_file("Штат", date_str)
|
||||
if not filepath:
|
||||
return None
|
||||
|
||||
df_raw = pd.read_excel(filepath, skiprows=8)
|
||||
df_staff = df_raw.iloc[:, [1, 5, 12]].copy()
|
||||
df_staff.columns = ['ФИО', 'Подразделение', 'Должность']
|
||||
df_staff = df_staff.dropna(subset=['ФИО']).reset_index(drop=True)
|
||||
df_staff = df_staff[~df_staff['ФИО'].astype(str).str.contains('Всего|Организация|Сотрудник|ФИО', case=False, na=False)]
|
||||
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}")
|
||||
df_absent_raw = pd.read_excel(ABSENT_FILE_1C, skiprows=3)
|
||||
df_absent = df_absent_raw[1:].copy().reset_index(drop=True)
|
||||
df_absent = df_absent.rename(columns={df_absent.columns[0]: 'ФИО', df_absent.columns[2]: 'Вид_отсутствия'})
|
||||
def load_absent_data(date_str):
|
||||
"""
|
||||
Загружает файл Отсутствий сотрудников 1С за конкретную дату.
|
||||
Если файла за эту дату нет — возвращает None без подмены на старые даты.
|
||||
"""
|
||||
filepath = find_dated_file("Отсутствия", date_str)
|
||||
if not filepath:
|
||||
return None
|
||||
|
||||
df_raw = pd.read_excel(filepath, skiprows=3)
|
||||
df_absent = df_raw[1:].copy().reset_index(drop=True)
|
||||
df_absent = df_absent.rename(columns={
|
||||
df_absent.columns[0]: 'ФИО',
|
||||
df_absent.columns[2]: 'Вид_отсутствия'
|
||||
})
|
||||
df_absent = df_absent[['ФИО', 'Вид_отсутствия']].dropna(subset=['ФИО', 'Вид_отсутствия'])
|
||||
df_absent = df_absent[~df_absent['ФИО'].astype(str).str.contains('АО "ЛЕНМОРНИИПРОЕКТ"|Сотрудник', case=False, na=False)]
|
||||
df_absent['fio_clean'] = df_absent['ФИО'].apply(normalize_fio)
|
||||
return df_absent[['fio_clean', 'Вид_отсутствия']].dropna(subset=['fio_clean'])
|
||||
|
||||
|
||||
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
|
||||
"""Загружает файл СКУД за 'today' или 'yesterday'."""
|
||||
target_date = DATE_TODAY if target_date_type == "today" else DATE_YESTERDAY
|
||||
scud_path = find_dated_file("Сотрудники", target_date, search_dirs=[SCUD_DIR])
|
||||
|
||||
# Резервный фоллбэк, если конкретный файл отсутствия еще не создан
|
||||
if not os.path.exists(scud_path):
|
||||
if os.path.exists(SCUD_FILE):
|
||||
scud_path = SCUD_FILE
|
||||
else:
|
||||
raise FileNotFoundError(f"Файл СКУД [{target_date_type}] не найден по пути: {scud_path}")
|
||||
if not scud_path:
|
||||
scud_path = find_dated_file("Сотрудники", DATE_TODAY, search_dirs=[SCUD_DIR])
|
||||
if not scud_path:
|
||||
raise FileNotFoundError(f"Файл СКУД [{target_date_type}] за {target_date} не найден в {SCUD_DIR}!")
|
||||
|
||||
df_scud = pd.read_excel(scud_path)
|
||||
exceptions = load_exceptions()
|
||||
@@ -87,19 +99,28 @@ def load_scud_data(target_date_type="today"):
|
||||
|
||||
def load_all_data():
|
||||
"""
|
||||
Загружает слитный датасет за сегодня, а также отдельный датасет за вчера.
|
||||
Возвращает: df_scud_today, df_scud_yesterday, staff_fios_clean, df_absent
|
||||
Загружает слитные датасеты за Сегодня и за Вчера.
|
||||
Если файла 1С за Сегодня нет, соответствующие датасеты вернет как None.
|
||||
"""
|
||||
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()
|
||||
# Загружаем 1С за Сегодня (может быть None)
|
||||
df_staff_today = load_staff_data(DATE_TODAY)
|
||||
df_absent_today = load_absent_data(DATE_TODAY)
|
||||
|
||||
return df_scud_today, df_scud_yesterday, staff_fios_clean, df_absent
|
||||
# Загружаем 1С за Вчера (гарантированно есть)
|
||||
df_staff_yesterday = load_staff_data(DATE_YESTERDAY)
|
||||
df_absent_yesterday = load_absent_data(DATE_YESTERDAY)
|
||||
|
||||
return (
|
||||
df_scud_today,
|
||||
df_scud_yesterday,
|
||||
df_staff_today,
|
||||
df_absent_today,
|
||||
df_staff_yesterday,
|
||||
df_absent_yesterday
|
||||
)
|
||||
Reference in New Issue
Block a user