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);
+ }
+ }
}