Commit Graph

309 Commits

Author SHA1 Message Date
beo3000 53a68c91d0 fix select members
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
2026-01-05 15:47:43 +01:00
beo3000 8987fc34b5 dev foxhunt 2026-01-05 15:27:51 +01:00
beo3000 187a7e14c8 dev foxhunt 2026-01-05 15:02:53 +01:00
beo3000 433b61618d dev foxhunt 2026-01-04 22:27:24 +01:00
beo3000 86ea4f8640 foxhunt part2 2026-01-04 21:42:54 +01:00
beo3000 29fa9c5e84 fox hunt part1 2026-01-04 21:24:30 +01:00
beo3000 9356dab062 little fixes 2026-01-04 18:03:47 +01:00
beo3000 7af5fb909e fix cashbook - month and year selection 2026-01-04 14:03:33 +01:00
beo3000 2632947d1f mod: gif tigger on import 2026-01-04 13:55:24 +01:00
beo3000 398897d9be fix Color-Spalte von 7 auf 50 Zeichen erweitert. 2026-01-04 13:33:06 +01:00
beo3000 fbfdb74cad fix colorpicker:
1. Neues Feld _colorValue für direkten String-Wert
  2. OnInitialized: _colorValue direkt aus Category.Color geladen
  3. MudColorPicker: ValueChanged="OnColorChanged" statt @bind-Value
  4. Neue OnColorChanged Methode aktualisiert beide Felder
  5. DTOs verwenden jetzt _colorValue statt _color?.Value
2026-01-04 13:09:23 +01:00
beo3000 7afc242be4 fix: Icon-Spalte von 50 auf 2000 Zeichen erweitert. Das Update sollte jetzt funktionieren. 2026-01-04 13:03:23 +01:00
beo3000 3c7050e172 DemoSeeder.cs:
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)
2026-01-04 12:56:15 +01:00
beo3000 b5caa75980 K21 fertig. Änderungen:
1. AuthState.cs:68 - IsClubTreasurer Property hinzugefügt
  2. AuthState.cs:100,116,123,132 - Initial + WithPermissions um Treasurer erweitert
  3. NavMenu.razor:25-48 - Kassenbuch NavGroup mit 3 Links:
    - Übersicht (/cashbook)
    - Kategorien (/cashbook/categories)
    - Berichte (/cashbook/reports)

  Sichtbar für: Kassenwart, Admin, SuperAdmin
2026-01-04 10:01:07 +01:00
beo3000 0d94d4c5c0 K20 fertig. Änderungen:
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
2026-01-04 09:56:15 +01:00
beo3000 a59fdac5d5 K19 fertig.
Erstellte Dateien:
  - src/Koogle.Web/Components/Pages/CashBook/MembershipFeeDialog.razor - Dialog mit Monat/Jahr-Auswahl, optionalem Betrags-Override, Warnung bei bestehenden Beiträgen

  Geänderte Dateien:
  - CashBook.razor - Button "Mitgliedsbeiträge" hinzugefügt
  - CashBook.razor.cs - OpenMembershipFeeDialog() Methode, prüft auf existierende Beiträge

  Features:
  - Monat/Jahr-Auswahl
  - Optionaler Betrags-Override (Switch)
  - Warnung bei existierenden Beiträgen für gewählten Monat
  - Dispatched CreateMembershipFeesAction
2026-01-03 22:12:21 +01:00
beo3000 8a9096c95e K18 fertig.
Erstellte Datei: src/Koogle.Web/Controllers/CashBookController.cs

  Endpoints:
  - GET /api/cashbook/export/excel?year=2026&month=1 → Excel-Download
  - GET /api/cashbook/export/pdf?year=2026&month=1 → PDF-Download

  Policy: ClubTreasurer

  Reports.razor.cs aktualisiert → Export-Buttons öffnen jetzt die Controller-Endpoints.
2026-01-03 22:08:27 +01:00
beo3000 ea237183f9 K17 fertig.
Erweitert: src/Koogle.Application/Services/CashBookExportService.cs

  PDF-Struktur (QuestPDF 2025.12.1):
  - Header: Titel, Vereinsname, Berichtszeitraum
  - Zusammenfassung: Salden-Tabelle (Anfang/Einnahmen/Ausgaben/End)
  - Kategorien: Einnahmen + Ausgaben mit farbigen Tabellen
  - Footer: Erstelldatum + Seitenzahlen
2026-01-03 22:03:17 +01:00
beo3000 5bd0e19f06 K16 fertig.
Erstellte Dateien:
  - src/Koogle.Application/Interfaces/ICashBookExportService.cs - Interface mit ExportToExcelAsync + ExportToPdfAsync
  - src/Koogle.Application/Services/CashBookExportService.cs - Excel-Export via ClosedXML

  Excel-Struktur (3 Sheets):
  1. Zusammenfassung - Salden, Summen, Statistik
  2. Kategorien - Einnahmen/Ausgaben nach Kategorie
  3. Buchungen - Alle Einträge mit Summenzeile

  NuGet: ClosedXML 0.105.0 hinzugefügt.
2026-01-03 21:59:13 +01:00
beo3000 dfe74adf01 ● K15 fertig. Erstellte Dateien:
- src/Koogle.Web/Components/Pages/CashBook/Reports.razor - UI mit Monat/Jahr-Auswahl, Saldo-Karten, Donut-Charts für Kategorien, expandierbare Buchungsliste
  - src/Koogle.Web/Components/Pages/CashBook/Reports.razor.cs - Code-behind

  Route: /cashbook/reports | Policy: ClubViewer

  Export-Buttons (Excel/PDF) zeigen Info-Message - werden in K16/K17 implementiert.
2026-01-03 21:55:02 +01:00
beo3000 e1f73691c4 Complete phase K14: Categories UI
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:49:40 +01:00
beo3000 05d1622bd4 K14: add Categories UI page + dialog
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:49:11 +01:00
beo3000 d0beb200b3 Complete phase K13: CashBook UI
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:43:24 +01:00
beo3000 3a9e891174 K13: add CashBook UI page + entry dialog
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:42:55 +01:00
beo3000 14b76d39a9 Complete phase K12: Fluxor CashBookState
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:36:03 +01:00
beo3000 e74fb07711 K12: add Fluxor CashBookState
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 21:35:28 +01:00
beo3000 6917fa6bed K11: add Fluxor CategoryState
- CategoryState: categories list, loading, error
- CategoryActions: CRUD + select/clear
- CategoryReducers: state transitions
- CategoryEffects: async service calls
2026-01-03 15:05:29 +01:00
beo3000 595c92df76 K10: create penalty entries on day close
- ICashBookService.CreatePenaltyEntriesForDayAsync
- Groups PersonExpenses by person, sums amounts
- Marks PersonExpenses as Done
- DayService calls after SaveChanges
2026-01-03 15:00:42 +01:00
beo3000 21c3d03c61 K9: seed system categories on club creation
- EnsureSystemCategoriesAsync accepts optional clubId
- ClubService calls seeder after GIF seeding
2026-01-03 14:56:50 +01:00
beo3000 2c09cfa991 K8: add cashbook service implementations
- BookingCategoryService: CRUD + EnsureSystemCategoriesAsync
- CashBookService: entries, balance, reports, membership fees
- CashBookMappingProfile: entity to DTO mappings
- DI registration for both services
2026-01-03 14:53:48 +01:00
beo3000 1a7ba8837d K7: add cashbook service interfaces
- IBookingCategoryService: CRUD + EnsureSystemCategories
- ICashBookService: entries, balance, report, membership fees
2026-01-03 14:45:07 +01:00
beo3000 96c5b4d196 K6: add cashbook DTOs
- BookingCategoryDto, CreateBookingCategoryDto, UpdateBookingCategoryDto
- CashBookEntryDto, CreateCashBookEntryDto, UpdateCashBookEntryDto
- CashBookReportDto, CategorySummaryDto, CreateMembershipFeesDto
2026-01-03 14:39:40 +01:00
beo3000 9c4a6f2ab6 K5: add cashbook repositories
- IBookingCategoryRepository + implementation
- ICashBookEntryRepository + implementation
- GetBalanceAsync calculates income - expense + initial
- ExistsMembershipFeeForMonthAsync for duplicate check

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 14:34:57 +01:00
beo3000 2f2e93ffce K4: add Kassenwart role + policy
- 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>
2026-01-03 14:28:45 +01:00
beo3000 9719667cb7 K3: add Kassenbuch migration
- 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>
2026-01-03 14:24:17 +01:00
beo3000 0280e0e05e K2: add EF configurations for cashbook
- 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>
2026-01-03 14:21:59 +01:00
beo3000 012548e8db K1: add cashbook domain entities + enums
- BookingCategoryType enum (Income/Expense)
- CashBookEntryType enum (Income/Expense)
- BookingCategory entity
- CashBookEntry entity
- Club: InitialBalance, MonthlyMembershipFee, navigation props

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 14:16:59 +01:00
beo3000 4dae965c98 added cashbook planning 2026-01-03 10:59:18 +01:00
beo3000 4cee96408b mod design gradient, like on home-page 2026-01-03 10:57:23 +01:00
beo3000 587b92409d added ParticipantsMode.FreeToChoose:
Neue Datei erstellt:
  - src/Koogle.Web/Components/Game/PlayerSelectorDialog.razor - Dialog zur manuellen Spielerauswahl

  Geändert:
  - src/Koogle.Web/Components/Pages/Days/DayDetails.razor:863-891 - ShowPlayerSelector implementiert

  Funktionsweise:
  1. Bei ParticipantsMode.FreeToChoose zeigt GameInputPanel.razor:23-32 den Button "Spieler wechseln"
  2. Der neue Dialog listet alle Spieler aus Participants.PlayerIds
  3. Bei DeathBox werden ausgeschiedene Spieler standardmäßig ausgeblendet (Toggle verfügbar)
  4. Bei Spielerauswahl wird SetCurrentPlayerAction dispatcht

  Features:
  - Aktueller Spieler ist markiert (grün)
  - Ausgeschiedene Spieler sind durchgestrichen mit "Ausgeschieden"-Badge
  - Optional können ausgeschiedene Spieler eingeblendet werden (falls nötig)
  - Funktioniert mit allen Game-Typen (DeathBox, Shit, Training)
2026-01-03 10:28:13 +01:00
beo3000 39d4629e72 fix switch club:
Problem: RefreshSignInAsync in UserService.SwitchClubAsync (Zeile 719) setzte zwar den neuen Cookie, aber HttpClient.PostAsJsonAsync empfing diesen Cookie nur intern - der Browser bekam ihn nie.

  Lösung: Form-POST statt HttpClient-API-Call, wie bei Login/Logout.

  Änderungen:

  1. ClubSwitcher.razor - Komplett überarbeitet:
    - HttpClient durch natives <form method="post"> ersetzt
    - AntiForgery-Token manuell gesetzt (wie LogoutButton)
    - Kein JavaScript/Client-Code mehr nötig
  2. AuthController.cs (Zeile 146):
    - [FromBody] → [FromForm]
    - [ValidateAntiForgeryToken] aktiviert

  Ablauf jetzt:
  1. User klickt auf Club im Dropdown
  2. Form-POST an /auth/switch-club
  3. Controller ruft SwitchClubAsync → DB-Update + RefreshSignInAsync
  4. LocalRedirect("/dashboard") → Browser erhält neuen Cookie direkt
  5. Claims sind beim Reload korrekt
2026-01-02 23:07:48 +01:00
beo3000 3b65f9f1cd fix switch club and RefreshSign 2026-01-02 22:48:00 +01:00
beo3000 7a5580e57d mod default culture de-DE 2026-01-02 21:09:37 +01:00
beo3000 51b8c2dbd4 edit users in club-settings 2026-01-02 20:58:49 +01:00
beo3000 f9e72d095b mod home 2026-01-02 20:22:01 +01:00
beo3000 c2f85cca57 mod home style 2026-01-02 19:49:44 +01:00
beo3000 f0b0d617a5 handling club memberships and creation of clubs:
Neue Dateien erstellt:

  - Domain/Enums/ClubRequestStatus.cs - Enum
  - Domain/Entities/ClubRequest.cs - Entity
  - Infrastructure/Data/Configurations/ClubRequestConfiguration.cs - EF Config
  - Application/DTOs/ClubRequestDto.cs - DTOs
  - Application/Interfaces/IClubRequestService.cs - Interface
  - Application/Services/ClubRequestService.cs - Service
  - Web/Controllers/ClubSwitchController.cs - API
  - Web/Components/Pages/Account/ClubSetup.razor - Club-Setup Seite
  - Web/Components/Shared/ClubSwitcher.razor - NavMenu Dropdown
  - Web/Components/Pages/Admin/ClubRequests.razor - SuperAdmin Freigaben

  Geänderte Dateien:

  - Login/Register: ClubName-Feld entfernt
  - UserService: Auto-Select Logic, SwitchClubAsync
  - AuthController: Routing basierend auf Club-Anzahl
  - MainLayout: ClubSwitcher statt statischer Anzeige
  - AuthState/Effects: AvailableClubs laden

  Flow:

  Login → Clubs vorhanden?
    ├─ Nein → /account/club-setup
    ├─ 1 Club → Auto-Select → /dashboard
    └─ Mehrere → IsDefault wählen → /dashboard
2026-01-02 19:15:30 +01:00
beo3000 028909c24f manage invitations and requests by club-admin 2026-01-02 14:47:09 +01:00
beo3000 7d0c26ad0c mod mailtext 2026-01-02 14:01:27 +01:00
beo3000 c326541604 mod mailtext 2026-01-02 14:00:13 +01:00