87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
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()
|