{"id":39939860,"url":"https://github.com/cschog/kanucontrol","last_synced_at":"2026-03-05T17:38:20.158Z","repository":{"id":219746634,"uuid":"749805322","full_name":"cschog/KanuControl","owner":"cschog","description":"Multi-tenant web application for managing KJFP funding workflows for canoe clubs and associations (Spring Boot, PostgreSQL, Keycloak)","archived":false,"fork":false,"pushed_at":"2026-02-17T13:28:23.000Z","size":104602,"stargazers_count":2,"open_issues_count":9,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-17T18:51:06.826Z","etag":null,"topics":["club-management","java","keycloak","liquibase","multi-tenancy-application","open-source","postgresql-database","react","schema-per-tenant","sports-management","spring-boot-3","typescript","vite"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cschog.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE.md","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-29T12:40:35.000Z","updated_at":"2026-02-17T13:24:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"2374eaa2-31c2-424e-992a-ae966514c5f4","html_url":"https://github.com/cschog/KanuControl","commit_stats":null,"previous_names":["cschog/kanucontrol"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/cschog/KanuControl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cschog%2FKanuControl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cschog%2FKanuControl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cschog%2FKanuControl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cschog%2FKanuControl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cschog","download_url":"https://codeload.github.com/cschog/KanuControl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cschog%2FKanuControl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29980763,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T16:35:47.903Z","status":"ssl_error","status_checked_at":"2026-03-01T16:35:44.899Z","response_time":124,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["club-management","java","keycloak","liquibase","multi-tenancy-application","open-source","postgresql-database","react","schema-per-tenant","sports-management","spring-boot-3","typescript","vite"],"created_at":"2026-01-18T19:04:47.605Z","updated_at":"2026-03-01T19:00:43.217Z","avatar_url":"https://github.com/cschog.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KanuControl\n\n\u003e ⚠️ Hinweis:\n\u003e KanuControl befindet sich aktuell in aktiver Entwicklung und ist noch nicht produktiv einsetzbar.\n\n---\n\n## 🎯 Ziel von KanuControl\n\nKanuControl ist eine Webanwendung zur Beantragung, Verwaltung und Abrechnung von Zuschüssen\naus dem Kinder-, Jugend- und Freizeitplan (KJFP) des Landessportbundes NRW (LSB NRW).\n\nDie Anwendung richtet sich an:\n\n- Kanuvereine\n- Kanuverbände (z. B. KVNRW)\n- Geschäftsstellen, die Förderanträge prüfen und abrechnen\n\nZiel ist es, die heute oft manuellen, fehleranfälligen und papierbasierten Prozesse\ndurch eine strukturierte, digitale Lösung zu ersetzen.\n\n---\n\n## 🧭 Fachlicher Ablauf\n\n### Grunddaten\n\n- Anlegen eines Vereins (falls noch nicht vorhanden)\n- Anlegen von Personen\n- Zuordnung von Personen zu Vereinen (Mitgliedschaften)\n\n---\n\n### Antragstellung\n\n- Anlegen einer Jugend-Veranstaltung\n- Erfassen der relevanten Eckdaten\n- Erzeugung von Antragsformularen (später als PDF)\n\n---\n\n### Durchführung der Veranstaltung\n\n- Erfassen der Teilnehmer\n  - Personen werden bei Bedarf automatisch angelegt\n  - Zuordnung zur Veranstaltung erfolgt direkt\n- Pflege von Teilnehmerlisten\n\n---\n\n### Abrechnung\n\n- Erfassen von:\n  - Einnahmen\n  - Ausgaben\n  - optional Reisekosten\n- Automatische Berechnung relevanter Summen\n- Ausgabe der Abrechnungsunterlagen als PDF:\n  - Deckblatt\n  - Erhebungsbogen\n  - Teilnehmerliste\n  - ggf. Reisekostenübersicht\n\nHinweis:\nPDF-Erzeugung ist ein späterer Ausbauschritt.\nFokus liegt zunächst auf stabilen Datenmodellen und Prozessen.\n\n---\n\n## 🧱 Technische Architektur\n\nKanuControl ist eine Client-Server-Webanwendung.\n\n### Überblick\n```\nBrowser (React)\n   |\n   v\nSpring Boot REST API\n   |\nService Layer\n   |\nMapper (DTO \u003c-\u003e Entity)\n   |\nRepository (JPA)\n   |\nPostgreSQL (Schema-per-Tenant)\n```\n---\n\n## 🌐 Mandantenfähigkeit\n\nKanuControl ist mandantenfähig (Multi-Tenant) aufgebaut.\n\n- Jeder Verein sieht ausschließlich seine eigenen Daten\n- Trennung erfolgt strikt über Schema-per-Tenant\n- Tenant-Ermittlung erfolgt über:\n  - JWT (Keycloak)\n  - HTTP-Header\n- Ein neutrales Default-Schema (kanu) wird ausschließlich für Systemzwecke genutzt\n\nSchemas werden lazy erzeugt.\n\n- Das Baseline-Schema (`kanu`) wird ausschließlich über Liquibase verwaltet\n- Neue Tenant-Schemas werden zur Laufzeit aus dieser Baseline abgeleitet\n- Die Struktur der Tenant-Schemas ist damit garantiert identisch\n- Schema-Initialisierung erfolgt kontrolliert und idempotent\n\n---\n\n## 🗄️ Datenbankstruktur (PostgreSQL)\n\n```\nDatabase: kanu\n├── kanu                (System / Default-Schema)\n├── ekc_test\n│   ├── person\n│   ├── verein\n│   ├── mitglied\n│   └── …\n├── tenant_verein_2\n│   ├── person\n│   ├── verein\n│   ├── mitglied\n│   └── …\n```\n\n- Das Schema `kanu` dient als technisches Baseline- und System-Schema\n- Tenant-Schemas enthalten ausschließlich fachliche Daten\n- Änderungen an der Struktur erfolgen immer zuerst im Baseline-Schema\n\n---\n\n## 🔐 Authentifizierung \u0026 Autorisierung\n\nZur Benutzerverwaltung wird Keycloak eingesetzt.\n\n- Open-Source IAM\n- OAuth2 / OpenID Connect\n- Rollen- \u0026 Rechteverwaltung\n- Saubere Trennung von Authentifizierung und Fachlogik\n- Mandantenzuordnung über Gruppen / Claims\n\n---\n\n## 🧪 Qualität \u0026 Tests\n\n- Controller-Tests (@WebMvcTest)\n- Integrationstests für:\n  - REST-Endpunkte\n  - Mandanten-Initialisierung\n  - Liquibase-Migrationen\n- Smoke-Tests für Systemstart \u0026 Grundfunktionen\n\n### Besonderer Fokus liegt auf der Absicherung der Mandantenarchitektur:\n\n- Baseline-Migrationstests (Liquibase)\n- Smoke-Tests für Tenant-Schema-Provisionierung\n- Verifikation der Schema-Isolation\n\n---\n\n## 📦 Backend\n\n### Technologien\n\n- Java 21\n- Spring Boot 3.5.10\n- Spring Data JPA (Hibernate 6)\n- Liquibase\n- PostgreSQL\n- Maven\n- Apache pdfbox V3.02\n\n### Architekturprinzipien\n\n- Kein Business-Code im Controller\n- Kein Datenbankzugriff im Controller\n- DTO \u003c-\u003e Entity strikt getrennt\n- Zentrale Fehlerbehandlung (@RestControllerAdvice)\n- Mandantenlogik strikt außerhalb der Fachlogik\n\n---\n\n## 🎨 Frontend\n\n### Technologien\n\n- React\n- Vite\n- node v22.x\n- TypeScript\n- Material UI ab V7.x\n- VS Code\n\nDas Frontend kommuniziert ausschließlich über die REST-API\nund enthält keine Businesslogik.\n\n---\n\n# 🗺️ KanuControl – Roadmap\n\nStand: **Release v0.4.0**  \nStatus: **Core-System funktionsfähig – Übergang zu Business-Features**\n\n---\n\n# 📊 Gesamtfortschritt\n\n**≈ 70 % bis v1.0**\n\n- 🟢 Architektur stabil\n- 🟢 Stammdaten vollständig\n- 🟢 Veranstaltungen \u0026 Teilnehmer nahezu komplett\n- 🟡 Import \u0026 Datenqualität teilweise\n- 🟡 Abrechnung begonnen\n- ⚪ Stabilisierung \u0026 Produktion offen\n\n---\n\n# Phase 0 – Fundament → Release 0.1.x ✅\n\n**Ziel:** stabile Architektur \u0026 Stammdaten  \n**Status:** abgeschlossen\n\n## Backend\n- [x] Spring Boot 3 Basis\n- [x] Multi-Tenant (Schema-per-Tenant)\n- [x] Keycloak Integration\n- [x] Liquibase Migration\n- [x] Hibernate Runtime Schema Switching\n\n## Domäne\n- [x] Verein CRUD\n- [x] Person CRUD\n- [x] Mitglied (Join Entity)\n- [x] Hauptverein-Logik\n- [x] Fachliche Validierungen\n\n## Frontend\n- [x] Vereinsverwaltung\n- [x] Personenverwaltung\n- [x] Mitgliedszuordnung\n\n## Import\n- [x] CSV Import Personen\n- [x] Mapping-Datei\n- [x] Dry-Run\n- [x] Fehleranzeige\n- [x] Upload-Infrastruktur\n\n---\n\n# Phase 1 – Frontend \u0026 Nutzung → Release 0.2.x 🟡\n\n**Ziel:** komfortable Bedienung\n\n## UI\n- [x] Navigation\n- [x] Pagination\n- [x] Sortierung\n- [x] Filter\n- [ ] Keycloak UX verbessern\n\n## Technik\n- [ ] Multipart Handling finalisieren\n- [ ] Upload Limits\n- [ ] Global Error Handling verbessern\n\n---\n\n# Phase 2 – Import \u0026 Datenqualität → Release 0.3.x 🟡\n\n**Ziel:** robuste Massendaten\n\n## CSV Import Mitglieder\n- [x] Upload\n- [x] Dry-Run\n- [ ] Pflichtfeld Validierung\n- [ ] Fachliche Regeln\n- [ ] Dublettenprüfung\n- [ ] Fehlerreport (Zeile + Ursache)\n\n## Mapping\n- [ ] Person ↔ Mitglied ↔ Verein\n\n## Stabilität\n- [ ] Idempotenter Import\n\n---\n\n# Phase 3 – Veranstaltungen \u0026 Teilnehmer → Release 0.4.x 🟢\n\n**Ziel:** Veranstaltungsmanagement vollständig\n\n## Veranstaltung\n- [x] CRUD\n- [x] Aktiv-Status\n- [x] Leiter Domain-Regel\n\n## Teilnehmer\n- [x] Join-Entity\n- [x] Rollen (L / M)\n- [x] Bulk Add / Remove\n- [x] Leiter immer Teilnehmer\n- [x] Sortierung (Leiter zuerst)\n\n## UI\n- [x] Teilnehmerverwaltung\n- [x] Dual-List Auswahl\n- [x] Multi-Select stabil\n- [x] SelectAll stabil\n- [x] Filter Reset\n\n## Teilnehmerliste PDF\n- [x] Mehrseitig\n- [x] Editierbares Formular\n- [x] Alter zum Veranstaltungsbeginn\n- [x] Header / Footer / Zeitraum\n- [x] Checkbox Mapping (JEM/FM/BM)\n- [x] Sortierung (Leiter → Verein → Name)\n- [x] Dynamischer Dateiname\n- [x] Download im FE\n\n## Offen\n- [ ] Anmeldeformular PDF\n- [ ] Abrechnungsdeckblatt PDF\n- [ ] Erhebungsbogen PDF\n\n---\n\n# Phase 4 – Abrechnung → Release 0.5.x 🟡\n\n**Ziel:** finanzielle Abwicklung\n\n## Finanzen\n- [ ] Einnahmen\n- [ ] Ausgaben\n- [ ] Teilnehmergebühren\n- [ ] Reisekosten\n\n## Logik\n- [ ] Plausibilitätsprüfungen\n- [ ] Summen \u0026 Reports\n- [ ] Abschlusslogik Veranstaltung\n\n---\n\n# Phase 5 – Dokumente \u0026 Formulare → Release 0.6.x 🟡\n\n**Ziel:** vollständige Verwaltungsdokumente\n\n## PDF Engine\n- [x] Formular-basierte PDFs\n- [x] Mehrseitig\n- [x] Editierbar\n- [ ] Template-System\n\n## Dokumente\n- [x] Teilnehmerliste\n- [ ] Anmeldung\n- [ ] Erhebungsbogen\n- [ ] Abrechnung\n- [ ] Reisekosten\n\n---\n\n# Phase 6 – Stabilisierung → Release 1.0.0 ⚪\n\n## Qualität\n- [ ] Performance\n- [ ] Memory / PDF Optimierung\n- [ ] Query Optimierung\n\n## Sicherheit\n- [ ] Rollen \u0026 Rechte\n- [ ] Audit Logging\n\n## Betrieb\n- [ ] Monitoring\n- [ ] Backup \u0026 Restore\n- [ ] Deployment\n- [ ] Dokumentation\n\n---\n\n# 🎯 Nächste Meilensteine\n\n## → v0.5 Fokus\n- Abrechnung starten\n- Anmeldung PDF\n- Erhebungsbogen PDF\n- Import Validierung\n- Fehlerreport CSV\n\n## → v0.6 Fokus\n- Alle Dokumente fertig\n- Template System\n- PDF Engine stabilisieren\n\n## → v1.0 Fokus\n- Stabilität\n- Performance\n- Security\n- Produktivbetrieb\n\n---\n\n# 🧭 Projektstatus\n\n**KanuControl ist jetzt ein funktionsfähiges Fachsystem.**  \nDie nächsten Releases bringen Vollständigkeit, Stabilität und Produktionsreife.\n\n---\n\n## 🌍 Open-Source \u0026 Contributions\n\nKanuControl ist von Beginn an als Open-Source-Projekt gedacht.\n\nZiele:\n- Nachvollziehbarer Code\n- Klare Struktur\n- Einsteigerfreundlich\n- Fachlich verständlich (auch für Nicht-Informatiker)\n\nContributions sind willkommen:\n- Bugfixes\n- Refactorings\n- Tests\n- Dokumentation\n- Feature-Vorschläge\n\nContribution-Guidelines folgen in einer späteren Version.\n\n---\n\n\n## License\n\nThis project is licensed under the **Apache License 2.0** – see the [LICENSE](LICENSE) file for details.\n\n### Trademark and Branding\n\nThe name **KanuControl**, the KanuControl logo, and the KanuControl icon are **not covered by the Apache License** and remain the exclusive property of the project owner.\n\nYou may use, modify, and distribute the software under the terms of the Apache 2.0 license, but you may **not use the KanuControl name, logo, or icon** in redistributed or modified versions without explicit permission.\n\nIf you distribute a modified version of this software, you must remove all KanuControl branding.\n\nFor trademark permission requests contact:\n**chris.schog@ekc-home.de**\n\n---\n\n## ❤️ Motivation\n\nKanuControl entsteht aus der Praxis für die Praxis –\nmit dem Ziel, ehrenamtliche Arbeit zu entlasten\nund Verwaltungsprozesse einfacher, transparenter und sicherer zu machen.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcschog%2Fkanucontrol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcschog%2Fkanucontrol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcschog%2Fkanucontrol/lists"}