""" =============================================================================== FILE: services/scud_etl/pipeline.py =============================================================================== """ import os import logging from typing import Optional, Dict, Any, Tuple import pandas as pd from core.connection import get_connection from core.database import load_scud_from_db_by_snapshot from config import DATA_DIR from services.data_loader import load_staff_data, load_absent_data logger = logging.getLogger("SCUD_PIPELINE") def load_best_snapshot_for_date(date_str: str, prefer_final_y: bool = False) -> Optional[pd.DataFrame]: """ Загружает наилучший срез СКУД за дату. Если prefer_final_y=True — отдает предпочтение финишному Y (23:59:59). """ with get_connection() as conn: cursor = conn.cursor() target_snap_id = None if prefer_final_y: cursor.execute(""" SELECT snapshot_id FROM scud_logs WHERE log_date = ? AND (snapshot_id LIKE 'Y%' OR snapshot_time LIKE '%23:59:59' OR snapshot_time LIKE '%22:00:00') ORDER BY id DESC LIMIT 1 """, (date_str,)) row = cursor.fetchone() if row: target_snap_id = row[0] if not target_snap_id: cursor.execute(""" SELECT snapshot_id FROM scud_logs WHERE log_date = ? ORDER BY id DESC LIMIT 1 """, (date_str,)) row = cursor.fetchone() if row: target_snap_id = row[0] if not target_snap_id: return None return load_scud_from_db_by_snapshot(date_str, snapshot_param=target_snap_id) def load_1c_files_for_date(date_str: str) -> Tuple[Optional[pd.DataFrame], Optional[pd.DataFrame]]: """ Загружает реестры штата и отсутствий 1С на указанную дату через data_loader. """ df_staff = load_staff_data(date_str) df_abs = load_absent_data(date_str) return df_staff, df_abs