feat(sprint8): Phase 4 — Dokumentenarchiv + Vorstandsverwaltung

Backend:
- V20 migration: documents table with category, access_level, file storage
- V21 migration: board_positions + board_members with term tracking
- Document entity + DocumentCategory/DocumentAccessLevel enums
- BoardPosition + BoardMember entities
- Extended AuditEventType (DOCUMENT_UPLOADED/DELETED, BOARD_MEMBER_ELECTED/REMOVED)
- Extended StaffPermission (MANAGE_DOCUMENTS)
- Extended NotificationType (BOARD_TERM_EXPIRING)
- DocumentService: upload, list, download, delete, storage usage
- BoardService: positions CRUD, elect/remove members, current/history
- DocumentController: multipart upload, filtered list, download, delete, portal
- BoardController: positions, elect, remove, current board, history, portal

Frontend:
- documents.ts + board.ts service layers
- Admin /documents page: grouped by category, upload dialog, filter, download/delete
- Admin /board page: current board cards, position management, elect member dialog
- Navigation: added Dokumente + Vorstand to sidebar
- i18n: documents.* + board.* keys in de.json + en.json
This commit is contained in:
Patrick Plate
2026-06-15 08:53:38 +02:00
parent b22702317a
commit e4698827ee
24 changed files with 1812 additions and 5 deletions
+56 -1
View File
@@ -949,5 +949,60 @@
"paymentHistory": "Zahlungshistorie",
"noPayments": "Noch keine Zahlungen vorhanden"
}
},
"documents": {
"title": "Dokumentenarchiv",
"description": "Vereinsdokumente verwalten und archivieren",
"upload": "Hochladen",
"uploadDocument": "Dokument hochladen",
"documentTitle": "Titel",
"titlePlaceholder": "z.B. Vereinssatzung 2024",
"category": "Kategorie",
"selectCategory": "Kategorie wählen",
"accessLevel": "Zugriff",
"allMembers": "Alle Mitglieder",
"boardOnly": "Nur Vorstand",
"descriptionLabel": "Beschreibung",
"descriptionPlaceholder": "Optionale Beschreibung...",
"file": "Datei",
"fileHint": "PDF, DOCX, XLSX, PNG, JPG — max. 10 MB",
"uploadButton": "Dokument hochladen",
"allCategories": "Alle Kategorien",
"documentsCount": "Dokumente",
"name": "Name",
"access": "Zugriff",
"size": "Größe",
"date": "Datum",
"actions": "Aktionen"
},
"board": {
"title": "Vorstand",
"description": "Vorstandspositionen und -mitglieder verwalten",
"addPosition": "Position anlegen",
"electMember": "Mitglied wählen",
"createPosition": "Position erstellen",
"positionTitle": "Titel",
"positionTitlePlaceholder": "z.B. 1. Vorsitzender",
"positionDescription": "Beschreibung",
"positionDescPlaceholder": "z.B. Gesetzlicher Vertreter gem. §26 BGB",
"sortOrder": "Reihenfolge",
"save": "Speichern",
"electBoardMember": "Vorstandsmitglied wählen",
"position": "Position",
"selectPosition": "Position wählen",
"member": "Mitglied",
"selectMember": "Mitglied wählen",
"electedAt": "Gewählt am",
"termStart": "Amtszeit Beginn",
"termEnd": "Amtszeit Ende",
"confirmElection": "Wahl bestätigen",
"elected": "Gewählt",
"term": "Amtszeit",
"unlimited": "unbefristet",
"termExpiringSoon": "Läuft bald ab",
"termActive": "Aktiv",
"positions": "Positionen",
"active": "Aktiv",
"inactive": "Inaktiv"
}
}
}