64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""
|
|
===============================================================================
|
|
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 |