from __future__ import annotations import argparse import json import sqlite3 import sys from datetime import date from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import main def load_latest_payloads(years: list[int]) -> dict[int, dict[str, object]]: conn = sqlite3.connect(main.DB_PATH) conn.row_factory = sqlite3.Row rows = conn.execute( """ SELECT params_json FROM system_jobs WHERE page_key = 'hanmac_browser' AND job_type = 'hanmac_aggregate_cache' AND status = 'done' ORDER BY updated_at DESC """ ).fetchall() latest: dict[int, dict[str, object]] = {} fallback: dict[str, object] = {} for row in rows: try: payload = json.loads(row["params_json"] or "{}") except Exception: continue if not isinstance(payload, dict): continue if not fallback and payload.get("host") and payload.get("user") and payload.get("password"): fallback = payload start_text = str(payload.get("start_date") or "") for year in years: if year not in latest and start_text.startswith(str(year)): latest[year] = payload return {year: dict(latest.get(year) or fallback) for year in years} def rebuild_year(year: int, base_payload: dict[str, object], end_today: bool = False) -> dict[str, object]: if not base_payload: raise RuntimeError(f"{year}년 캐시를 만들 접속정보가 없습니다.") end_date = date.today().isoformat() if end_today and year == date.today().year else f"{year}-12-31" payload = { **base_payload, "database": main.normalize_text(base_payload.get("database")) or main.HANMAC_PRIMARY_MANHOUR_SCHEMA, "view": "member", "employment": main.normalize_text(base_payload.get("employment") or "all"), "start_date": f"{year}-01-01", "end_date": end_date, } result = main.get_hanmac_aggregate_summary(payload) cache_key = main._hanmac_aggregate_cache_key(payload) main._store_hanmac_aggregate_cache(cache_key, result) diagnostics = result.get("source_diagnostics") or {} return { "year": year, "start_date": result.get("start_date"), "end_date": result.get("end_date"), "row_count": len(result.get("rows") or []), "cache_key": cache_key, "joint_assignment_records": diagnostics.get("joint_assignment_records", 0), "joint_assignment_regular_rows": diagnostics.get("joint_assignment_regular_rows", 0), "joint_assignment_overtime_rows": diagnostics.get("joint_assignment_overtime_rows", 0), } def main_cli() -> None: parser = argparse.ArgumentParser() parser.add_argument("--years", nargs="+", type=int, default=[2022, 2023, 2024, 2025, 2026]) parser.add_argument("--end-today", action="store_true") args = parser.parse_args() payloads = load_latest_payloads(args.years) for year in args.years: summary = rebuild_year(year, payloads.get(year) or {}, end_today=args.end_today) print(json.dumps(summary, ensure_ascii=False, sort_keys=True)) if __name__ == "__main__": main_cli()