ChristmasTreeGameSetup.cs
- Neues Enum GameEndCondition mit AllFivesGone (Standard) und TreeCleared
- Property EndCondition zum Setup hinzugefügt
ChristmasTreeGameModel.cs
- Property EndCondition hinzugefügt
ChristmasTreeGameLogicService.cs
- Neue Methode CheckGameEndCondition() prüft je nach Einstellung
- Neue Methode CheckAnyTreeCleared() prüft ob ein Team alle Zahlen gestrichen hat
- Alle 3 Stellen wo Spielende geprüft wird nutzen jetzt die flexible Methode
ChristmasTreeSetup.razor
- Neues Dropdown "Spielende" mit zwei Optionen:
- "Alle 5er gestrichen" (Standard)
- "Ein Baum komplett leer"
- Hilfstexte erklären die jeweilige Bedingung
Der Fix teilt die Operation in zwei Schritte:
1. Alle IsDefault auf false → SaveChanges
2. Neuen Default auf true → SaveChanges
Das verhindert, dass EF Core temporär zwei IsDefault = true Einträge hat, was den Filtered Unique Index verletzen würde.
Das Problem liegt in OnParametersSetAsync(). Wenn SelectNone() aufgerufen wird:
1. _selectedIds wird geleert
2. NotifySelectionChanged() benachrichtigt Parent
3. Parent aktualisiert Parameter → OnParametersSetAsync() wird erneut aufgerufen
4. Auto-select Logik Zeile 103-106 wählt alle wieder aus!
Fix: Auto-select nur beim ersten Laden ausführen:
Behoben. Das _initialized Flag verhindert nun, dass die Auto-Select-Logik bei jedem Parameter-Update läuft - nur noch beim ersten Laden der Komponente.
Zusammenfassung der Änderungen:
1. FluxorComponent als Basisklasse - Dialog reagiert nun auf PersonState-Änderungen
2. Redundante DB-Anfragen vermeiden - LoadPersonsAction wird nur dispatched wenn Persons.Count == 0 && !IsLoading
3. Pre-Selection bei asynchronem Laden - In OnAfterRender wird die Member-Vorauswahl aktualisiert sobald Persons verfügbar sind
Ursache des Problems:
- Der Dialog dispatched LoadPersonsAction bei jedem Öffnen
- DayDetails.razor dispatched gleichzeitig mehrere Actions (LoadAvailablePersonsAction, etc.)
- Viele parallele DB-Requests erschöpfen den Connection Pool
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