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, `