From c68fd4471e7f62e31f5ca063b4588a3d23cb0613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Raduli=C4=87?= Date: Tue, 5 May 2026 10:22:36 +0200 Subject: [PATCH] HNS endpoints: /clan/{id}/hns-career + /klubovi/pgz-financirani + /dashboard/hns-coverage Backed by: pgz_sport.hns_player_seasons, hns_klub_roster, v_pgz_financirani_klubovi Used by: cc-hns subagents for UI integration --- .../fullstack_20260505_0858_consolidated.md | 119 ++++++ _audit/sub4_manifestacije.md | 91 +++++ pgz_sport_api.py | 74 ++++ routers/enrich_router.py | 19 +- scripts/hns_master_harvester.py | 349 ++++++++++++++++++ 5 files changed, 651 insertions(+), 1 deletion(-) create mode 100644 _audit/fullstack_20260505_0858_consolidated.md create mode 100644 _audit/sub4_manifestacije.md create mode 100755 scripts/hns_master_harvester.py diff --git a/_audit/fullstack_20260505_0858_consolidated.md b/_audit/fullstack_20260505_0858_consolidated.md new file mode 100644 index 0000000..3a0368c --- /dev/null +++ b/_audit/fullstack_20260505_0858_consolidated.md @@ -0,0 +1,119 @@ +# FULLSTACK SPRINT — KONSOLIDIRANI IZVJEŠTAJ + +**Sprint ID:** fullstack_20260505_0858 +**Sprint trajao:** 09:00 → 09:25 (≈25 min, 5 paralelnih subagenata) +**Compiled:** 2026-05-05 09:25 by orchestrator (Claude Opus 4.7 / 1M) + +## TL;DR + +| # | Subagent | Status | Live test | Persistencija | +|---|---|---|---|---| +| 1 | Dashboard Top Primatelji UI | ✅ DONE | ✅ 5/5 curl pass | ✅ commit 31e0374 | +| 2 | Role-based OIB display | ✅ DONE | ✅ 7/7 scope tests | ✅ commit 8e13635 | +| 3 | GDPR consent verify + Art.7 | ✅ DONE | ✅ withdraw 401, privacy 200 | ✅ files written | +| 4 | Manifestacije enrichment | ⚠️ PARTIAL | — | ❌ apply.sql REJECTED by orchestrator | +| 5 | Klubovi cleanup | ⚠️ DISCREPANCY | ❌ DB ≠ izvještaj | ❌ NIJE persistirano | + +**Score: 3 ✅ + 2 ⚠️.** Damir mora pregledati Sub4 i Sub5 ručno. + +--- + +## Sub1 — Dashboard Top Primatelji ✅ + +- File: `/opt/pgz-sport/_audit/sub1_dashboard_done.md` +- Commit: `31e0374` +- **Backend** (`pgz_sport_api.py:308-341`): `dashboard_top_primatelji()` refaktoriran, godina≤0 = sve, doc_id regex za PDF, fix psycopg2 ILIKE escape (`%%`). +- **Frontend** (`static/sport2.html:907-957`): dropdown `Sve|2026|2025*|2024|...`, default=2025, 7 kolona uključujući PDF link. +- **Stari endpoint** `/v2/potpore/by-year` za 2025 vraćao samo 1 redak (RSS Rijeka aggregat) — **root cause** Damirovog "vidim samo 1 klub" simptoma. +- **Live:** 2025=13 redaka, 2026=120 redaka, sve godine=0 fallback. + +## Sub2 — Role-based OIB ✅ + +- File: `/opt/pgz-sport/_audit/sub2_oib_done.md` +- Commit: `8e13635` (Damir umergeao za vrijeme sub2 work) +- **Root cause:** `is_admin()` u `pgz_sport_api.py` matchao samo literal `"admin"` — pgz_admin/super_admin/savez_admin/klub_admin svi su padali u viewer-tier i dobivali maskirane OIB-e. +- Fix: `is_admin()` recognize sve PGŽ tiers; nove `auth_context()`, `can_see_full_pii(auth, klub_id, savez_id)`, `apply_privacy(authorization=)`, `_audit_oib_access()`. +- **Frontend:** `/static/oib_format.js` — single source of truth, `