From 0d94d4c5c0f6cbef054ed6d62dc8a8998d9ed1c0 Mon Sep 17 00:00:00 2001 From: beo3000 Date: Sun, 4 Jan 2026 09:56:15 +0100 Subject: [PATCH] =?UTF-8?q?K20=20fertig.=20=C3=84nderungen:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- docs/IMPLEMENTATION_PLAN.md | 2 +- src/Koogle.Application/DTOs/ClubDto.cs | 10 ++ .../Services/ClubService.cs | 1 + .../Components/Pages/Settings.razor | 94 +++++++++++++++++++ 4 files changed, 106 insertions(+), 1 deletion(-) diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md index ef7a2c9..f338c16 100644 --- a/docs/IMPLEMENTATION_PLAN.md +++ b/docs/IMPLEMENTATION_PLAN.md @@ -1718,7 +1718,7 @@ public enum CashBookEntryType { Income = 0, Expense = 1 } | ✓ | K17 | Application | PDF Export (QuestPDF) | 1 | | ✓ | K18 | Web | Export Controller | 1 | | ✓ | K19 | Web | Membership Fees Feature | 2 | -| ☐ | K20 | Web | Club Settings Extension | 3 | +| ✓ | K20 | Web | Club Settings Extension | 3 | | ☐ | K21 | Web | Navigation Integration | 1 | | ☐ | K22 | Tests | Unit Tests | 2 | | ☐ | K23 | Tests | Integration Tests | 1 | diff --git a/src/Koogle.Application/DTOs/ClubDto.cs b/src/Koogle.Application/DTOs/ClubDto.cs index f8dcd17..1a507eb 100644 --- a/src/Koogle.Application/DTOs/ClubDto.cs +++ b/src/Koogle.Application/DTOs/ClubDto.cs @@ -66,6 +66,11 @@ public record ClubDto /// Sender email for club notifications. /// public string? SenderEmail { get; init; } + + /// + /// Monthly membership fee amount. + /// + public decimal MonthlyMembershipFee { get; init; } } /// @@ -123,6 +128,11 @@ public record UpdateClubDto /// Sender email for club notifications. /// public string? SenderEmail { get; init; } + + /// + /// Monthly membership fee amount. + /// + public decimal MonthlyMembershipFee { get; init; } } /// diff --git a/src/Koogle.Application/Services/ClubService.cs b/src/Koogle.Application/Services/ClubService.cs index 6f09d8b..4c7d018 100644 --- a/src/Koogle.Application/Services/ClubService.cs +++ b/src/Koogle.Application/Services/ClubService.cs @@ -131,6 +131,7 @@ public class ClubService : IClubService existing.ExpenseCalculation = dto.ExpenseCalculation; existing.ModifiedAt = DateTime.UtcNow; existing.SenderEmail = dto.SenderEmail; + existing.MonthlyMembershipFee = dto.MonthlyMembershipFee; var updated = await _clubRepository.UpdateAsync(existing, ct); return _mapper.Map(updated); diff --git a/src/Koogle.Web/Components/Pages/Settings.razor b/src/Koogle.Web/Components/Pages/Settings.razor index 257e27b..9d3b8bf 100644 --- a/src/Koogle.Web/Components/Pages/Settings.razor +++ b/src/Koogle.Web/Components/Pages/Settings.razor @@ -24,6 +24,7 @@ @inject IState AuthState @inject NavigationManager NavigationManager @inject IJSRuntime JSRuntime +@inject ICashBookService CashBookService Vereins-Einstellungen @@ -251,6 +252,58 @@ else + + + + + Kassenbuch-Einstellungen + + + + + + + Aktueller Kontostand + + @_currentBalance.ToString("C") + + + + + + + Schnellzugriff + + + Kassenbuch öffnen + + + Kategorien verwalten + + + Berichte anzeigen + + + + + + Speichern + + + + } @@ -265,6 +318,13 @@ else private List _pendingMemberships = new(); private List _clubMembers = new(); + // Cashbook settings + private decimal _monthlyMembershipFee; + private decimal _originalMembershipFee; + private decimal _currentBalance; + + private bool HasCashBookChanges => _monthlyMembershipFee != _originalMembershipFee; + protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); @@ -294,6 +354,14 @@ else _clubMembers = (await UserService.GetUsersByClubAsync(clubId)).ToList(); _isLoadingMembers = false; + + // Load cashbook settings + if (_club != null) + { + _monthlyMembershipFee = _club.MonthlyMembershipFee; + _originalMembershipFee = _club.MonthlyMembershipFee; + _currentBalance = await CashBookService.GetBalanceAsync(); + } } } finally @@ -593,4 +661,30 @@ else StateHasChanged(); } } + + private async Task SaveCashBookSettings() + { + if (_club is null) return; + + try + { + var dto = new UpdateClubDto + { + Id = _club.Id, + Name = _club.Name, + LoginName = _club.LoginName, + ExpenseCalculation = _club.ExpenseCalculation, + SenderEmail = _club.SenderEmail, + MonthlyMembershipFee = _monthlyMembershipFee + }; + + Dispatcher.Dispatch(new UpdateClubAction(dto)); + _originalMembershipFee = _monthlyMembershipFee; + Snackbar.Add("Kassenbuch-Einstellungen gespeichert", Severity.Success); + } + catch (Exception ex) + { + Snackbar.Add($"Fehler: {ex.Message}", Severity.Error); + } + } }