Commit Graph

296 Commits

Author SHA1 Message Date
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
beo3000 f5c8e07730 add reset password mail 2026-01-02 13:58:28 +01:00
beo3000 7ba1307bac fix typo 2026-01-01 20:15:13 +01:00
beo3000 c3b71bcbec mod home-page 2026-01-01 20:13:28 +01:00
beo3000 b163fb30c7 send day protocol by email 2026-01-01 20:04:55 +01:00
beo3000 0d8289563d add email service:
Neue Dateien

  - src/Koogle.Domain/Interfaces/IEmailService.cs - Interface
  - src/Koogle.Infrastructure/Configuration/SmtpSettings.cs - SMTP-Konfiguration
  - src/Koogle.Infrastructure/Services/SmtpEmailService.cs - MailKit-basierte Implementierung

  Geänderte Dateien

  | Datei                  | Änderung                                    |
  |------------------------|---------------------------------------------|
  | Club.cs                | + SenderEmail Property                      |
  | Person.cs              | + UserProfileId + Navigation zu UserProfile |
  | ClubConfiguration.cs   | + SenderEmail Config                        |
  | PersonConfiguration.cs | + UserProfileId FK + Index                  |
  | DayService.cs          | + E-Mail-Versand bei Day-Close              |
  | ClubDto.cs             | + SenderEmail in allen DTOs                 |
  | PersonDto.cs           | + UserProfileId                             |
  | DependencyInjection.cs | + SmtpSettings + SmtpEmailService           |
  | appsettings.json       | + SmtpSettings Section                      |

  Gelöschte Dateien

  - StubEmailService.cs
  - IEmailService.cs (Application → Domain verschoben)

  Migration

  - AddEmailFeatures - Neue Spalten SenderEmail (Clubs) und UserProfileId (Persons)

  Konfiguration (appsettings.json)

  "SmtpSettings": {
    "Host": "smtp.example.com",
    "Port": 587,
    "Enabled": false  // Auf true setzen um E-Mails zu aktivieren
  }

  Funktionen

  1. Club-spezifische Absender-Adresse - Club.SenderEmail (Fallback: DefaultSenderEmail)
  2. Spieltag-Protokoll - HTML-E-Mail mit Tabelle der Strafen pro Teilnehmer
  3. Empfänger - Nur Teilnehmer mit verknüpftem UserProfile
  4. Error Handling - Log & Continue (Day-Close schlägt nicht fehl)
2026-01-01 19:13:05 +01:00
beo3000 6903e13425 mod claude permissions 2026-01-01 15:38:44 +01:00
beo3000 c9d2f4d0a0 del koogleApp 2026-01-01 14:56:17 +01:00
beo3000 bd8a562183 del former KoogleApp 2026-01-01 14:55:33 +01:00
beo3000 49463ba6cf typo 2026-01-01 14:52:50 +01:00
beo3000 c25fa0c0ec mod Club-Editor for demo 2026-01-01 14:42:11 +01:00
beo3000 fc9dfcaca0 added club-settings:
Neue Datei: src/Koogle.Web/Components/Pages/Settings.razor
  - Route /settings mit ClubAdmin-Policy
  - Zeigt Name, LoginName, Kostenberechnung
  - "Bearbeiten" Button öffnet bestehenden ClubEditDialog
  - Kein Löschen, keine Neuanlage

  Geändert: src/Koogle.Web/Components/Layout/NavMenu.razor
  - Neuer Link "Vereins-Einstellungen" in "Stammdaten"-Gruppe (Icon: Tune)
2026-01-01 14:34:02 +01:00
beo3000 4666056e24 add expenses, on day closing
1. Neue Methode CreateAbsentMemberExpensesAsync() (Zeile 322-421)
    - Prüft Club.ExpenseCalculation (None → skip)
    - Berechnet Average/Maximum aller Tages-Expenses
    - Findet Absent-Expense via ExpenseTriggerType.Absent
    - Erstellt PersonExpense für alle abwesenden Members
  2. Aufruf in AdvanceStatusAsync() (Zeile 312-316)
    - Wird aufgerufen wenn Status → Closed wechselt
    - Vor SaveChangesAsync() → eine Transaktion
2026-01-01 14:18:34 +01:00
beo3000 8fd8c37952 added Home-Advertising page 2026-01-01 13:23:49 +01:00