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:
@@ -17,8 +17,7 @@
|
||||
{% if not authenticated %}
|
||||
<div class="alert alert-warning">
|
||||
<i class="bi bi-exclamation-triangle"></i>
|
||||
Azure ist nicht verbunden. Bitte unter <a href="/settings">Einstellungen</a> konfigurieren und
|
||||
<code>python app.py --auth</code> ausfuehren.
|
||||
Azure ist nicht verbunden. Bitte unter <a href="/settings">Einstellungen</a> konfigurieren und verbinden.
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -38,7 +37,7 @@
|
||||
<div class="mb-2">
|
||||
<small class="text-muted d-block mb-1">Segment {{ seg.index }}</small>
|
||||
{% if seg.user %}
|
||||
{% if seg.aida == '-' and seg.teams == '-' %}
|
||||
{% if seg.attendance == '-' and seg.teams == '-' %}
|
||||
<div class="segment-bar" style="background: #f0f0f0; border-color: #ccc;">
|
||||
<span class="status-dot me-2" style="background: #ccc;"></span>
|
||||
{{ seg.user }}
|
||||
@@ -50,14 +49,14 @@
|
||||
{{ seg.user }}
|
||||
</div>
|
||||
<div class="d-flex gap-2 mt-1">
|
||||
{% if seg.aida == 'anwesend' %}
|
||||
{% if seg.attendance == 'anwesend' %}
|
||||
<span class="badge bg-success"><i class="bi bi-building"></i> Anwesend</span>
|
||||
{% elif seg.aida == 'abwesend' %}
|
||||
{% elif seg.attendance == 'abwesend' %}
|
||||
<span class="badge bg-secondary"><i class="bi bi-door-open"></i> Abwesend</span>
|
||||
{% elif seg.aida == 'homeoffice' %}
|
||||
{% elif seg.attendance == 'homeoffice' %}
|
||||
<span class="badge bg-warning text-dark"><i class="bi bi-house"></i> Homeoffice</span>
|
||||
{% else %}
|
||||
<span class="badge bg-light text-dark">{{ seg.aida }}</span>
|
||||
<span class="badge bg-light text-dark">{{ seg.attendance }}</span>
|
||||
{% endif %}
|
||||
|
||||
{% if seg.teams != '-' %}
|
||||
|
||||
+3
-3
@@ -15,7 +15,7 @@
|
||||
<tr>
|
||||
<th>Zeitpunkt</th>
|
||||
<th>Benutzer</th>
|
||||
<th>AIDA-Status</th>
|
||||
<th>Zeiterfassung</th>
|
||||
<th>Teams-Status</th>
|
||||
<th>WLED-URL</th>
|
||||
<th>Ergebnis</th>
|
||||
@@ -27,8 +27,8 @@
|
||||
<td class="text-nowrap">{{ log.timestamp }}</td>
|
||||
<td>{{ log.user_name }}</td>
|
||||
<td>
|
||||
<span class="badge {% if log.aida_status == 'anwesend' %}bg-success{% elif log.aida_status == 'abwesend' %}bg-secondary{% elif log.aida_status == 'homeoffice' %}bg-warning text-dark{% else %}bg-light text-dark{% endif %}">
|
||||
{{ log.aida_status or '-' }}
|
||||
<span class="badge {% if log.attendance_status == 'anwesend' %}bg-success{% elif log.attendance_status == 'abwesend' %}bg-secondary{% elif log.attendance_status == 'homeoffice' %}bg-warning text-dark{% else %}bg-light text-dark{% endif %}">
|
||||
{{ log.attendance_status or '-' }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
|
||||
+26
-15
@@ -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>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<th>Status</th>
|
||||
<th>Name</th>
|
||||
<th>E-Mail</th>
|
||||
<th>Personal-Nr (AIDA)</th>
|
||||
<th>Personal-Nr</th>
|
||||
<th>Durchwahl</th>
|
||||
<th>Zuordnung</th>
|
||||
<th>Aktionen</th>
|
||||
|
||||
Reference in New Issue
Block a user