GET /qr — Czech QR Platba PNG endpoint; ports Python's qr_code() exactly: account validation (^[A-Z]{2}\d{2,34}$|^\d{1,16}/\d{4}$), amount clamping [0, 10M], * stripping, SPD string format. New dep: github.com/skip2/go-qrcode.
GET /sync-bank — runs Fio sync → infer payments for the current year, captures output into the sync.tmpl page with a success/error banner. Wired via web.ActionHandlers{BankSync} closure in serverCmd, which also calls FlushCache after a successful run.
GET /flush-cache + POST /flush-cache — confirmation form (GET) + action (POST) that deletes cache files and shows the deleted count.
GET /version — JSON alias of /api/version (Python parity; same {tag, commit, build_date} shape).
FlushCache() (int, error) added to membership.Sources interface; implemented on realSources via cache.FileCache.Flush(); stubbed on all test fakes.
## Summary
- **`GET /qr`** — Czech QR Platba PNG endpoint; ports Python's `qr_code()` exactly: account validation (`^[A-Z]{2}\d{2,34}$|^\d{1,16}/\d{4}$`), amount clamping `[0, 10M]`, `*` stripping, SPD string format. New dep: `github.com/skip2/go-qrcode`.
- **`GET /sync-bank`** — runs Fio sync → infer payments for the current year, captures output into the `sync.tmpl` page with a success/error banner. Wired via `web.ActionHandlers{BankSync}` closure in `serverCmd`, which also calls `FlushCache` after a successful run.
- **`GET /flush-cache` + `POST /flush-cache`** — confirmation form (GET) + action (POST) that deletes cache files and shows the deleted count.
- **`GET /version`** — JSON alias of `/api/version` (Python parity; same `{tag, commit, build_date}` shape).
- **`FlushCache() (int, error)`** added to `membership.Sources` interface; implemented on `realSources` via `cache.FileCache.Flush()`; stubbed on all test fakes.
- **15 new tests**: `TestQRBuildSPD` (9 table cases), `TestServeQR`, `TestServeFlushCacheGET`, `TestServeFlushCachePOST`, `TestServeSync`, `TestServeVersion`.
## Test plan
- [ ] `cd go && go test ./...` — all green
- [ ] `go run ./cmd/fuj server` → open http://localhost:8080
- [ ] `/adults` → click **Pay** on an unpaid month → modal shows QR image; scan with a Czech banking app
- [ ] Direct: `/qr?account=2702008874/2010&amount=700&message=Test` → PNG renders
- [ ] Nav → **Sync Bank Data** → page shows captured log + green banner
- [ ] Nav → **Flush Cache** → button → success banner with file count
- [ ] `/version` in browser → JSON `{tag, commit, build_date}`
- [ ] `/api/version` still returns identical JSON (parity check)
- [ ] Adults / juniors / payments still render without regressions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
GET /qr— Czech QR Platba PNG endpoint; ports Python'sqr_code()exactly: account validation (^[A-Z]{2}\d{2,34}$|^\d{1,16}/\d{4}$), amount clamping[0, 10M],*stripping, SPD string format. New dep:github.com/skip2/go-qrcode.GET /sync-bank— runs Fio sync → infer payments for the current year, captures output into thesync.tmplpage with a success/error banner. Wired viaweb.ActionHandlers{BankSync}closure inserverCmd, which also callsFlushCacheafter a successful run.GET /flush-cache+POST /flush-cache— confirmation form (GET) + action (POST) that deletes cache files and shows the deleted count.GET /version— JSON alias of/api/version(Python parity; same{tag, commit, build_date}shape).FlushCache() (int, error)added tomembership.Sourcesinterface; implemented onrealSourcesviacache.FileCache.Flush(); stubbed on all test fakes.TestQRBuildSPD(9 table cases),TestServeQR,TestServeFlushCacheGET,TestServeFlushCachePOST,TestServeSync,TestServeVersion.Test plan
cd go && go test ./...— all greengo run ./cmd/fuj server→ open http://localhost:8080/adults→ click Pay on an unpaid month → modal shows QR image; scan with a Czech banking app/qr?account=2702008874/2010&amount=700&message=Test→ PNG renders/versionin browser → JSON{tag, commit, build_date}/api/versionstill returns identical JSON (parity check)🤖 Generated with Claude Code
- GET /qr: Czech QR Platba PNG; ports Python qr_code() exactly (account validation, amount clamping, * stripping, SPD format) - GET /sync-bank: Fio sync → infer → cache flush with captured log - GET+POST /flush-cache: form + action, shows deleted count - GET /version: JSON alias of /api/version (Python parity) - FlushCache() added to membership.Sources; wired through api.Handler - web.ActionHandlers{BankSync} closure-based dep injection for sync - New dep: github.com/skip2/go-qrcode - TestQRBuildSPD (9 cases), TestServeQR, TestServeFlushCache{GET,POST}, TestServeSync, TestServeVersion added Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>