Update wehago matching logic and exclude reports
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user