1. HardDeleteClubDataAsync: Löscht jetzt auch CashBookEntries und BookingCategories (Zeilen 200-201)
2. ResetDemoClubAsync: Ruft jetzt SeedSystemBookingCategoriesAsync auf (Zeile 183)
3. Neue Methode SeedSystemBookingCategoriesAsync (Zeilen 578-606): Erstellt die 4 System-Kategorien:
- Spielstrafe (Income, grün)
- Mitgliedsbeitrag (Income, blau)
- Korrekturbuchung (Income, orange)
- Saldoanpassung (Income, grau)
added tests and fixes
Bereits vorhanden:
- ClubService.CreateAsync: Ruft bereits EnsureSystemCategoriesAsync für neue Clubs auf (Zeile 101)
Die System-Kategorien werden jetzt automatisch:
- Bei Anlage eines neuen Clubs (via ClubService)
- Beim Zurücksetzen des Demo-Clubs (via DemoSeeder)
1. ClubService.cs:134 - MonthlyMembershipFee in UpdateAsync hinzugefügt
2. Settings.razor:358-364 - Laden der Kassenbuch-Einstellungen beim Init
3. Settings.razor:665-689 - SaveCashBookSettings() Methode implementiert
Der Kassenbuch-Tab in den Vereins-Einstellungen funktioniert jetzt:
- Zeigt aktuellen Kontostand
- Erlaubt Ändern des monatlichen Mitgliedsbeitrags
- Speichert Änderungen via Fluxor-Action
- Quick-Links zu Kassenbuch, Kategorien, Berichten
- ICashBookService.CreatePenaltyEntriesForDayAsync
- Groups PersonExpenses by person, sums amounts
- Marks PersonExpenses as Done
- DayService calls after SaveChanges
- UserRole.Treasurer = "Kassenwart"
- IdentityRoleSeeder: seed Kassenwart role
- ClubRoleRequirement: rank Admin=4, Kassenwart=3
- ClubTreasurer policy in DI
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BookingCategories table with unique name per club
- CashBookEntries table with FK to Category, Day, Person
- Club: InitialBalance, MonthlyMembershipFee columns
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BookingCategoryConfiguration with unique index
- CashBookEntryConfiguration with FK relationships
- ClubConfiguration: InitialBalance, MonthlyMembershipFee
- AppDbContext: BookingCategories, CashBookEntries DbSets
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Extend Game entity with GameType, Status, StartedAt, CompletedAt, RowVersion
- Add GameConfiguration with RowVersion for optimistic concurrency
- Create IGamePersistenceService interface
- Implement GamePersistenceService with CRUD operations
- Create GameStateSerializationDto for JSON serialization
- Extend GameEffects with full persistence lifecycle:
- HandleStartGame: Creates game in DB
- HandleEndGame: Updates status to Completed/Aborted
- HandleLoadActiveGame: Recovery from page reload
- HandleRecordThrow: Debounced save (500ms)
- HandleSaveGameState: Explicit save with concurrency check
- Add migration ExtendGameEntity
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add UndoButton.razor as reusable component
- Refactor GameInputPanel to use UndoButton component
- Enhance GameEffects with proper UndoThrowAction handler
- IState injection for state access in effects
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GameBoardPanel: Dynamic board component rendering
- CompletedGamesList: Shows game history for day
- DayDetails: 3 tabs (Details/Eingabe/Tafel) + Start/End Game buttons
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GameTypeSelector: Select game type from registry
- ParticipantSelector: Multi-select participants from day
- CommonSetupOptions: ThrowMode, ThrowsPerRound, ParticipantsMode
- GameSetupDialog: Full setup wizard with DynamicComponent
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>