Files
dashboard/.claude/plans/feature-extensions.md

171 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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