8c969c610f
Phase 4 — Frontend Import Wizard:
- bank-import.ts service: types (BankImportSession, BankTransaction,
CsvColumnMapping, ImportSessionStatus, MatchStatus) + 12 React Query hooks
(sessions, transactions, mappings, upload/confirm/skip/assign/complete)
- /finance/import page: 4-step wizard (Upload -> Map -> Review -> Confirm)
* Drag-and-drop upload with bank format auto-detect (MT940/CAMT.053/CSV)
* CSV column mapping editor (saves as reusable mapping)
* Review table with color-coded MATCHED/SUGGESTED/UNMATCHED/CONFIRMED rows,
confidence % badges, member-assign Combobox, skip/confirm/bulk-confirm
* Completion summary + import history table with resume action
- de.json + en.json: full bankImport.* namespace (steps, upload, map, review,
complete, history, status, sessionStatus, actions, errors)
- Navigation: Finanzen converted to nested submenu (Uebersicht + Import)
Phase 5 — Integration Testing:
- docker compose down -v + up -d --build (clean rebuild)
- Playwright e2e/sprint10-system-test.spec.ts: verifies /finance/import
unauthenticated -> /login?callbackUrl=%2Ffinance%2Fimport (PASS)
- Backend health + frontend route registration verified
Bugfix bundled (blocked backend startup):
- PaymentRepository: countOverdueByClubId* queries referenced non-existent
Payment.dueDate column (regression from Sprint 9 Phase 6, commit 57f418f).
Switched to Payment.periodTo (the implicit due date for billing periods).
16 lines
526 B
TypeScript
16 lines
526 B
TypeScript
import { test, expect } from "@playwright/test"
|
|
|
|
test("Sprint 10 — /finance/import redirects unauthenticated user to /login with callbackUrl", async ({
|
|
page,
|
|
}) => {
|
|
await page.goto("http://localhost:3000/finance/import", {
|
|
waitUntil: "domcontentloaded",
|
|
})
|
|
await page.waitForURL(/\/login/, { timeout: 15000 })
|
|
const url = page.url()
|
|
console.log("Redirected to:", url)
|
|
expect(url).toContain("/login")
|
|
expect(url).toContain("callbackUrl")
|
|
expect(decodeURIComponent(url)).toContain("/finance/import")
|
|
})
|