Commit Graph

26 Commits

Author SHA1 Message Date
beo3000 e2ee3e6afe added club-terminology
Angepasst:
  - Club.cs - Navigation Property Terminologies
  - AppDbContext.cs - DbSet ClubTerminologies
  - DependencyInjection.cs - Service-Registrierung
  - NavMenu.razor - Menüpunkt "Begriffe" unter Stammdaten

  Migration: AddClubTerminology erstellt und angewandt.

  Nutzung im Code:
  @inject IClubTerminologyService Terms

  // In Component:
  var term = await Terms.GetTermAsync(TermKey.Gutter);  // "Gosse" oder Default "Pudel"

  Neue Keys einfach in TermKey.cs hinzufügen + Default in ClubTerminologyService.Defaults.
2026-01-06 18:41:16 +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 96c5b4d196 K6: add cashbook DTOs
- BookingCategoryDto, CreateBookingCategoryDto, UpdateBookingCategoryDto
- CashBookEntryDto, CreateCashBookEntryDto, UpdateCashBookEntryDto
- CashBookReportDto, CategorySummaryDto, CreateMembershipFeesDto
2026-01-03 14:39:40 +01:00
beo3000 3b65f9f1cd fix switch club and RefreshSign 2026-01-02 22:48:00 +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 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 752523fe78 added gif-Feature:
Summary of Changes:

  Phase 1-3 (Domain/Infrastructure/Application):
  - ThrowEventType enum with Strike, Circle, Bell, Gutter flags
  - ClubGif, ClubGifRating, GifSubmissionToken entities
  - EF configurations with proper indexes
  - ClubGifRepository with weighted random selection
  - MediaStorageService for file storage (wwwroot/club-media/{LoginName}/gifs/)
  - ClubGifService with rating system and auto-disable at -5 threshold

  Phase 4-5 (Admin UI & Playback):
  - Admin page at /club/{ClubId}/admin/gifs with Upload, Import, Edit, Token management
  - QR code generation for submission tokens
  - GifPlayer component with overlay, rating buttons, and dismiss
  - Fluxor state management (GifState, actions, reducers, effects)

  Phase 6 (Anonymous Submission):
  - Public page at /gif/submit/{Token} with EmptyLayout
  - Token validation and file upload

  Phase 7 (Game Integration + Migration):
  - Database migration AddClubGifFeature applied
  - GameEffects.TriggerGifForEventsAsync triggers GIFs on special throws
  - SignalR broadcast via BroadcastGifTriggeredAsync to all clients
  - DayDetails.razor includes GifPlayer and handles SignalR GIF events

  Key Features:

  - GIFs play on Strike (alle 9), Circle (Kranz), Bell (Glocke), Gutter (Rinne)
  - Weighted random selection based on ratings
  - Real-time sync across all connected clients via SignalR
  - Thumbs up/down rating with auto-disable at -5
  - Max file size: 20MB, Video duration: 15s
  - Supports GIF, MP4, WebM formats
2025-12-30 14:57:06 +01:00
beo3000 0e4e1530ed added LoginName for Clubs 2025-12-30 11:57:01 +01:00
beo3000 21130895d4 add statistics:
Erfasste Metriken:
  - ThrowCount, PinCount, ClearedCount, GutterCount, CircleCount, StrikeCount, BellCount

  Widget zeigt:
  - Jahres-Übersicht (Spiele, Würfe, Kegel, Durchschnitt)
  - Top 5 Kegler Rangliste
  - Monatstrend-Tabelle
2025-12-29 15:27:25 +01:00
beo3000 954c2589e6 added Trigger and Trigger/Expense Releations 2025-12-28 10:18:39 +01:00
beo3000 03364291aa fix undo/redo handling 2025-12-27 21:46:20 +01:00
beo3000 e50b13f092 add undo/redo 2025-12-27 18:23:24 +01:00
beo3000 f1880f08a8 save setup model 2025-12-27 11:45:19 +01:00
beo3000 a84b192055 Complete phase H9: DB Persistence & Recovery
- Extend Game entity with GameType, Status, StartedAt, CompletedAt, RowVersion
- Add GameConfiguration with RowVersion for optimistic concurrency
- Create IGamePersistenceService interface
- Implement GamePersistenceService with CRUD operations
- Create GameStateSerializationDto for JSON serialization
- Extend GameEffects with full persistence lifecycle:
  - HandleStartGame: Creates game in DB
  - HandleEndGame: Updates status to Completed/Aborted
  - HandleLoadActiveGame: Recovery from page reload
  - HandleRecordThrow: Debounced save (500ms)
  - HandleSaveGameState: Explicit save with concurrency check
- Add migration ExtendGameEntity

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 09:23:58 +01:00
beo3000 e8df51d67f Add Trigger-Engine (Phase H0)
- ITriggerRepository interface + TriggerRepository implementation
- ITriggerService interface + TriggerService implementation
- TriggerDto, ExpenseTriggerLinkDto, FireTriggerDto
- FireTriggerAsync creates PersonExpenses with multiplier
- DI registration for both services
- Fix test mock for IClubRepository

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:10:28 +01:00
beo3000 0911236a0d feat(G8): add invite link handling for club membership 2025-12-25 21:17:00 +01:00
beo3000 0a9205a2f3 Complete phase G4: Membership Services
- UserService: RequestClubMembership (by ID, name, invite token),
  ApproveMembership, RejectMembership, GetPendingMemberships
- ClubService: CreateInvitation, GetInvitationByToken, ValidateInvitation,
  IncrementInvitationUsage, GetInvitationsByClub, GetByName
- Add PendingMembershipDto, ClubInvitationDto, CreateClubInvitationDto
- Update tests to pass AppDbContext to ClubService

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 18:27:40 +01:00
beo3000 7c9f3c36d9 Add Dashboard page (F1)
- DashboardDto, IDashboardService, DashboardService
- Summary cards: members, guests, days, open expenses
- Recent days list with navigation
- Top penalty recipients list
- Home redirects to /dashboard
- Updated HomePageTests

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 15:26:35 +01:00
beo3000 ad3ac3185c add password reset 2025-12-23 17:09:24 +01:00
beo3000 b4818efc1a added club relations to datamodel
mod UserService
2025-12-23 15:05:22 +01:00
beo3000 57146a382a add comments 2025-12-22 21:42:25 +01:00
beo3000 7cab8642d5 add DTOs 2025-12-22 21:36:28 +01:00
beo3000 d8c41ad712 add fluxor AuthState 2025-12-21 22:14:00 +01:00
beo3000 8a92555ce9 add authorizazion und authentication 2025-12-21 19:31:54 +01:00
beo3000 6c43c85cb4 mod project structure
ef migrations
2025-12-21 09:59:40 +01:00