refactor: AIDA -> modulare Zeiterfassung

- Alle AIDA-Referenzen durch generische Begriffe ersetzt
  (aida -> attendance im Code, "Zeiterfassung" im UI)
- DB-Spalten: last_aida_status -> last_attendance_status
- Settings: aida_csv_path -> attendance_csv_path
- REST API fuer Zeiterfassung auf Port 8081:
  POST /api/attendance/{personal_nr} mit {"status": "anwesend"}
  GET  /api/attendance - alle Status abfragen
- Automatische DB-Migration fuer bestehende Installationen
- CSV bleibt als Option, API als Echtzeit-Alternative

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-03 10:28:45 +02:00
co-authored by Claude Opus 4.6
parent 12aa2d7ea1
commit 0d080ff885
8 changed files with 215 additions and 98 deletions
+26 -15
View File
@@ -94,7 +94,7 @@
</div>
</div>
<!-- Polling & AIDA -->
<!-- Polling & Zeiterfassung -->
<div class="col-lg-6">
<div class="card mb-4">
<div class="card-header">
@@ -129,30 +129,41 @@
<div class="card">
<div class="card-header">
<h6 class="mb-0"><i class="bi bi-file-earmark-spreadsheet"></i> AIDA Zeiterfassung</h6>
<h6 class="mb-0"><i class="bi bi-file-earmark-spreadsheet"></i> Zeiterfassung (CSV)</h6>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">CSV-Pfad</label>
<input type="text" name="aida_csv_path" class="form-control font-monospace"
value="{{ settings.aida_csv_path }}"
placeholder="/mnt/zeiterfassung/Status.csv">
<small class="text-muted">Auf Linux z.B. via SMB-Mount</small>
<input type="text" name="attendance_csv_path" class="form-control font-monospace"
value="{{ settings.attendance_csv_path }}"
placeholder="/opt/busylight/status.csv">
<small class="text-muted">Pfad zur Anwesenheits-CSV (optional, wenn REST API genutzt wird)</small>
</div>
<div class="mb-3">
<label class="form-label">Status: Anwesend</label>
<input type="text" name="aida_status_anwesend" class="form-control"
value="{{ settings.aida_status_anwesend }}">
<label class="form-label">CSV-Code: Anwesend</label>
<input type="text" name="attendance_status_anwesend" class="form-control"
value="{{ settings.attendance_status_anwesend }}"
placeholder="~~1~~">
</div>
<div class="mb-3">
<label class="form-label">Status: Abwesend</label>
<input type="text" name="aida_status_abwesend" class="form-control"
value="{{ settings.aida_status_abwesend }}">
<label class="form-label">CSV-Code: Abwesend</label>
<input type="text" name="attendance_status_abwesend" class="form-control"
value="{{ settings.attendance_status_abwesend }}"
placeholder="~~0~~">
</div>
<div class="mb-3">
<label class="form-label">Status: Homeoffice</label>
<input type="text" name="aida_status_homeoffice" class="form-control"
value="{{ settings.aida_status_homeoffice }}">
<label class="form-label">CSV-Code: Homeoffice</label>
<input type="text" name="attendance_status_homeoffice" class="form-control"
value="{{ settings.attendance_status_homeoffice }}"
placeholder="~~2~~">
</div>
<div class="border rounded p-3 bg-light">
<small class="text-muted">
<strong>Alternativ: REST API</strong><br>
Status kann auch per API gesetzt werden (Port 8081):<br>
<code>POST /api/attendance/{personal_nr}</code><br>
Body: <code>{"status": "anwesend"}</code>
</small>
</div>
</div>
</div>