171 lines
7.2 KiB
Markdown
171 lines
7.2 KiB
Markdown
# 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
|