feat(sync): sync all FDISK members, auto-creating dashboard accounts for users not yet logged in
This commit is contained in:
170
.claude/plans/feature-extensions.md
Normal file
170
.claude/plans/feature-extensions.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# Feature Extensions Plan — Feuerwehr Dashboard
|
||||
|
||||
> Generated 2026-03-16. Features that extend existing functionality.
|
||||
|
||||
## Selected for Implementation (current sprint)
|
||||
- #3 Inspection Schedule Export (PDF/CSV)
|
||||
- #4 Vehicle Availability Calendar
|
||||
- #8 Atemschutz Recertification Alert
|
||||
- #19 Events Conflict Detection
|
||||
- #21 Bulk Member Communication
|
||||
- #22 Audit Log Alerts
|
||||
|
||||
---
|
||||
|
||||
## Backlog — Vehicles & Equipment
|
||||
|
||||
### Maintenance Cost Trend Reports [Medium]
|
||||
- Aggregate costs from `wartungslog` by vehicle/type, with YoY trends
|
||||
- Add new tab or section to `FahrzeugDetail.tsx` maintenance tab
|
||||
- Backend: new `GET /api/vehicles/:id/wartung/stats` endpoint
|
||||
- Frontend: bar/line chart using existing chart pattern from `IncidentStatsChart`
|
||||
- Data available: `wartungslog.kosten`, `wartungslog.datum`, `wartungslog.art`
|
||||
|
||||
### Equipment Move History [Quick Win]
|
||||
- Track when equipment moves between vehicles/storage via audit_log entries
|
||||
- Show timeline in `AusruestungDetail.tsx` with location change history
|
||||
- Backend: query audit_log for equipment UPDATE actions where fahrzeug_id changed
|
||||
- Frontend: simple timeline list component
|
||||
|
||||
### Equipment Inventory by Category Report [Quick Win]
|
||||
- Dashboard card showing equipment count by category/status with drill-down
|
||||
- Use existing `equipmentService.getEquipmentStats()` data
|
||||
- Frontend: new `EquipmentCategoryCard` in dashboard Status group
|
||||
- Chip counts per category, color-coded by status
|
||||
|
||||
---
|
||||
|
||||
## Backlog — Personnel & Atemschutz
|
||||
|
||||
### Member Qualification Matrix Export [Medium]
|
||||
- CSV/PDF showing all members × qualifications (licenses, certifications, training status)
|
||||
- Backend: new `GET /api/members/qualifications/export` joining ausbildung, atemschutz_traeger, fahrgenehmigungen, untersuchungen
|
||||
- Frontend: export button on Mitglieder page
|
||||
- PDF template: table with member rows × qualification columns
|
||||
|
||||
### Rank Promotion Timeline [Quick Win]
|
||||
- Visual timeline of rank changes per member
|
||||
- Data: `dienstgrad_verlauf` table already has full history
|
||||
- Frontend: timeline component in MitgliedDetail "Beförderungen" tab
|
||||
- Use MUI Timeline component or simple vertical list
|
||||
|
||||
### Qualifications Expiring Soon Widget [Medium]
|
||||
- Dashboard widget showing members with soon-to-expire qualifications
|
||||
- Query: JOIN ausbildung.ablaufdatum, atemschutz.gueltig_bis, untersuchungen.gueltig_bis
|
||||
- WHERE expiry date BETWEEN now AND now + 90 days
|
||||
- Backend: new `GET /api/members/expiring-qualifications?days=90`
|
||||
- Frontend: new dashboard card in Status group
|
||||
|
||||
### Member On-Duty Roster Widget [Quick Win]
|
||||
- Quick view showing who is on active duty (status=aktiv + specific function)
|
||||
- Backend: filter members by status and funktion
|
||||
- Frontend: simple card widget showing avatar + name list
|
||||
|
||||
---
|
||||
|
||||
## Backlog — Incidents & Operations
|
||||
|
||||
### Response Time Analytics [Medium]
|
||||
- Dashboard showing hilfsfrist trends, median times by incident type
|
||||
- Data: `einsatz_statistik` materialized view has `hilfsfrist_min`
|
||||
- Backend: new `GET /api/incidents/response-times?groupBy=einsatz_art`
|
||||
- Frontend: line chart or box plot in Einsaetze page analytics section
|
||||
|
||||
### Personnel Availability During Incident [Medium]
|
||||
- Incident detail view showing who was on-duty vs. who responded
|
||||
- Cross-reference einsatz_personal with member status at time of incident
|
||||
- Backend: extend `getIncidentById` to include non-responding active members
|
||||
- Frontend: new section in EinsatzDetail with available/responded columns
|
||||
|
||||
### Vehicle Usage by Incident Type [Quick Win]
|
||||
- Report: which vehicles deployed per incident type
|
||||
- Backend: aggregate einsatz_fahrzeuge grouped by einsatz_art
|
||||
- Simple query on existing data, return as stats
|
||||
- Frontend: table or chart in Einsaetze page
|
||||
|
||||
### Incident Debriefing Template [Medium]
|
||||
- Structured post-incident notes (what went well, improvements, training needs)
|
||||
- Extend `bericht_text` or add new JSON column `debrief` with structured fields
|
||||
- Backend: migration for new column, extend PATCH endpoint
|
||||
- Frontend: collapsible section in EinsatzDetail with structured fields
|
||||
|
||||
### Callout Distribution Report [Quick Win]
|
||||
- Personnel workload analysis: how many callouts per member
|
||||
- Backend: `SELECT user_id, COUNT(*) FROM einsatz_personal GROUP BY user_id`
|
||||
- Frontend: table or chart in admin dashboard or Mitglieder page
|
||||
|
||||
---
|
||||
|
||||
## Backlog — Training & Events
|
||||
|
||||
### Training Attendance Statistics [Medium]
|
||||
- Member participation trends (% events attended, absences, by type)
|
||||
- Backend: aggregate uebung_teilnahmen by user_id with status counts
|
||||
- Frontend: new admin tab or member profile tab with charts
|
||||
- Could show per-member attendance rate badge
|
||||
|
||||
### Training Requirement Tracking [Significant]
|
||||
- Mark Übungen as mandatory for certain roles/ranks
|
||||
- Schema: new `training_requirements` table (role, training_type, frequency)
|
||||
- Backend: CRUD for requirements, validation check for members
|
||||
- Frontend: admin config page + dashboard alerts for non-compliant members
|
||||
- Notifications for members missing required training
|
||||
|
||||
### QR Code Check-In [Medium]
|
||||
- Mobile-friendly quick check-in for training events
|
||||
- Generate QR code containing `POST /api/training/:id/attendance` URL
|
||||
- Frontend: QR code display on UebungDetail page
|
||||
- Scanner: simple camera component or link to URL
|
||||
|
||||
---
|
||||
|
||||
## Backlog — Notifications & Admin
|
||||
|
||||
### Customizable Notification Preferences [Medium]
|
||||
- Per-user opt-in/out of notification types (training, incidents, roster)
|
||||
- Extend user preferences schema with notification_preferences object
|
||||
- Backend: check preferences before creating notifications
|
||||
- Frontend: new section in Settings page with toggle switches per type
|
||||
|
||||
---
|
||||
|
||||
## Backlog — Reporting & Analytics
|
||||
|
||||
### Annual Department Report (PDF) [Significant]
|
||||
- Compile incident stats, training participation, member roster, equipment inventory
|
||||
- Backend: new `GET /api/reports/annual?year=2025` generating comprehensive PDF
|
||||
- Use existing PDF generation pattern from Kalender
|
||||
- Sections: executive summary, incident stats, training stats, personnel changes, equipment inventory
|
||||
|
||||
### Member Hours Tracking [Medium]
|
||||
- Calculate firefighter hours from training events + incidents + on-duty shifts
|
||||
- Backend: aggregate event duration (datum_von to datum_bis) + incident time (alarm to einrueck)
|
||||
- Frontend: member profile analytics tab + dashboard card
|
||||
|
||||
### Equipment Utilization Report [Quick Win]
|
||||
- Usage by category/vehicle/incident type
|
||||
- Backend: join ausruestung with einsatz_fahrzeuge to correlate
|
||||
- Frontend: table in admin dashboard or Ausruestung page
|
||||
|
||||
### Member Skills Matrix [Medium]
|
||||
- Export showing member name × all certifications
|
||||
- Backend: JOIN across ausbildung, atemschutz_traeger, fahrgenehmigungen
|
||||
- Frontend: exportable table with color-coded validity indicators
|
||||
- PDF export using existing PDF generation pattern
|
||||
|
||||
---
|
||||
|
||||
## Backlog — System
|
||||
|
||||
### Incident Photo/Document Gallery [Medium]
|
||||
- Upload photos/PDFs to incidents
|
||||
- Schema: new `einsatz_dokumente` table (einsatz_id, filename, mime_type, storage_path)
|
||||
- Backend: multipart upload endpoint, file storage (local or Nextcloud)
|
||||
- Frontend: gallery component in EinsatzDetail with drag-and-drop
|
||||
|
||||
### Incident Stats Year Selector [Quick Win]
|
||||
- View historical stats for previous years
|
||||
- Backend: already supports `year` query parameter
|
||||
- Frontend: add year selector dropdown to IncidentStatsChart
|
||||
- Simple UI change, no backend work needed
|
||||
Reference in New Issue
Block a user