0c27d7ac86
- Implemented `excel_export.py` for generating library item exports in Excel format. - Created `pdf_export.py` for generating audit reports compliant with DIN 5008 standards, including detailed event tables and signature blocks. - Developed `generate_user.py` for interactive user creation with validation for usernames and passwords. - Introduced `module_registry.py` for managing module states and path matching. - Added a basic `__init__.py` in the `terminplaner` module for initialization.
440 lines
11 KiB
Markdown
440 lines
11 KiB
Markdown
# PDF-Audit-Export Implementation Guide
|
|
|
|
## Überblick
|
|
|
|
Das Audit-PDF-Export-System von Invario bietet professionelle, behördengerechte PDF-Reports für deutsche Schulen. Es folgt allen aktuellen Standards für Verwaltungsberichte und ist speziell für Schulträger und Rechnungsprüfungsämter optimiert.
|
|
|
|
## Installation & Setup
|
|
|
|
### Schritt 1: Abhängigkeiten installieren
|
|
```bash
|
|
cd Web
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
Das System wird bereits mit allen notwendigen Abhängigkeiten ausgeliefert:
|
|
- `reportlab` - PDF-Generierung
|
|
- `qrcode` - QR-Code Support
|
|
- `pillow` - Bildbearbeitung
|
|
|
|
### Schritt 2: Schulinformationen konfigurieren (optional)
|
|
|
|
Bearbeiten Sie `config.json` und fügen Sie Schulinformationen hinzu:
|
|
|
|
```json
|
|
{
|
|
"school": {
|
|
"name": "Musterschule",
|
|
"address": "Schulstraße 123",
|
|
"postal_code": "12345",
|
|
"city": "Musterhausen",
|
|
"school_number": "123456",
|
|
"it_admin": "John Doe"
|
|
}
|
|
}
|
|
```
|
|
|
|
Falls nicht konfiguriert, verwendet das System automatisch Platzhalter.
|
|
|
|
### Schritt 3: Flask App starten
|
|
|
|
```bash
|
|
python app.py
|
|
```
|
|
|
|
Die neuen Export-Funktionen sind sofort verfügbar.
|
|
|
|
## Verwendung
|
|
|
|
### Web-Oberfläche
|
|
|
|
1. Navigieren Sie zum **Audit Dashboard**: `/admin/audit`
|
|
2. Klicken Sie auf einen der PDF-Export-Buttons:
|
|
- **"🚀 Schnell-Check"** - Kompakte Übersicht
|
|
- **"📋 Amtlicher Bericht"** - Behördenkonformer Report
|
|
|
|
### API Endpoints
|
|
|
|
#### Quick-Check PDF
|
|
```
|
|
GET /admin/audit/export/pdf/quick?limit=500
|
|
```
|
|
|
|
**Parameter:**
|
|
- `limit` (optional): Anzahl der Einträge (default: 500, max: 5000)
|
|
|
|
**Antwort:** PDF-Datei mit Name `audit-quick-check-YYYYMMDD-HHMMSS.pdf`
|
|
|
|
**Beispiel:**
|
|
```bash
|
|
curl -b cookies.txt "http://localhost:8000/admin/audit/export/pdf/quick?limit=100" \
|
|
-o audit-quick.pdf
|
|
```
|
|
|
|
#### Official Report PDF
|
|
```
|
|
GET /admin/audit/export/pdf/official?limit=1000
|
|
```
|
|
|
|
**Parameter:**
|
|
- `limit` (optional): Anzahl der Einträge (default: 1000, max: 5000)
|
|
|
|
**Antwort:** PDF-Datei mit Name `audit-official-report-YYYYMMDD-HHMMSS.pdf`
|
|
|
|
**Beispiel:**
|
|
```bash
|
|
curl -b cookies.txt "http://localhost:8000/admin/audit/export/pdf/official?limit=500" \
|
|
-o audit-official.pdf
|
|
```
|
|
|
|
## Format-Spezifikationen
|
|
|
|
### Quick-Check Format
|
|
|
|
**Zielgruppe**: Schulverwaltung, Management
|
|
|
|
**Umfang**:
|
|
- Seiten: 1-2
|
|
- Einträge: Letzte 20-500 (einstellbar)
|
|
- Details: Minimal
|
|
|
|
**Spalten der Audit-Tabelle**:
|
|
1. **Index** - Sequenznummer im Audit-Log
|
|
2. **Zeit** - Zeitstempel (gekürzt: YYYY-MM-DD HH:MM)
|
|
3. **Ereignis** - Ereignistyp
|
|
4. **Benutzer** - Benutzer/Actor
|
|
5. **Hashwert** - Gekürzte Hash (erste 12 Zeichen)
|
|
|
|
**Zusätzliche Inhalte**:
|
|
- Schulinformationen (Briefkopf)
|
|
- Audit-Chain Summary (Status, Einträge, Fehler)
|
|
- Ereignistyp-Verteilung
|
|
- DSGVO-Hinweis (Fußzeile)
|
|
|
|
### Official Report Format
|
|
|
|
**Zielgruppe**: Schulträger, Behörden, Rechnungsprüfungsamt
|
|
|
|
**Umfang**:
|
|
- Seiten: 2-10+
|
|
- Einträge: Alle (bis 1000)
|
|
- Details: Vollständig
|
|
|
|
**Spalten der Audit-Tabelle**:
|
|
1. **Idx** - Chain-Index
|
|
2. **Zeitstempel** - ISO 8601 Format (YYYY-MM-DD HH:MM:SS)
|
|
3. **Ereignistyp** - Type des Events
|
|
4. **Benutzer** - Actor/Benutzer
|
|
5. **Quelle** - Source (Web, API, System)
|
|
6. **IP-Adresse** - Quell-IP des Events
|
|
7. **Hashwert** - Vollständiger Hash (gekürzt angezeigt)
|
|
|
|
**Zusätzliche Inhalte**:
|
|
- Professioneller Briefkopf (DIN 5008)
|
|
- Schulinformationen + Schulnummer
|
|
- Audit-Chain Prüfsummary
|
|
- Ereignistyp-Verteilung
|
|
- **Integritätsabweichungen** (bei Fehlern)
|
|
- **Unterschriftsfeld** für Schulleitung + IT-Beauftragter
|
|
- DSGVO-Compliance Fußzeile
|
|
- Technischer Hinweis (PDF/A, revisionssicher)
|
|
|
|
## DIN 5008 Compliance Details
|
|
|
|
### Seitenformat
|
|
- **Größe**: DIN A4 (210 x 297 mm)
|
|
- **Seitenränder**:
|
|
- Links: 2,5 cm (Abheften)
|
|
- Rechts: 1,5 cm
|
|
- Oben: 4,5 cm (Briefkopf)
|
|
- Unten: 2,0 cm
|
|
|
|
### Briefkopf-Bereich (4,5 cm)
|
|
```
|
|
+-----------------------------------+-----------------------------------+
|
|
| Schullogo (optional) | Erstellungsdatum: |
|
|
| Schulname | Schulnummer: |
|
|
| Schuladresse | Verantwortliche Person: |
|
|
| PLZ Stadt | System: Invario v2.6 |
|
|
+-----------------------------------+-----------------------------------+
|
|
```
|
|
|
|
### Schriften
|
|
- **Header**: Helvetica-Bold, 12pt
|
|
- **Body Text**: Helvetica, 10pt (min 9pt für Barrierefreiheit)
|
|
- **Tabellen**: Helvetica, 8-9pt
|
|
- **Alle**: Serifenlos für maximale Lesbarkeit
|
|
|
|
### Farben
|
|
- **Header Hintergrund**: #2c3e50 (dunkelblau)
|
|
- **Header Text**: Weiß
|
|
- **OK Status**: Grün mit Text "✓ OK"
|
|
- **Fehler Status**: Rot mit Text "✗ FEHLER"
|
|
- **Tabellenzeilen**: Alternierend weiß und hellgrau
|
|
|
|
### Barrierefreiheit (BFSG)
|
|
- ✓ Hoher Kontrast (Ratio > 4.5:1)
|
|
- ✓ Serifenlose Schrift
|
|
- ✓ Keine reinen Farbcodes
|
|
- ✓ Logische Tabellenstruktur
|
|
- ✓ Klare Hierarchie
|
|
- ✓ Lesbare Schriftgrößen (min 9pt)
|
|
|
|
## Revisionssicherheit
|
|
|
|
### Audit-Chain Verifikation
|
|
Das System zeigt automatisch:
|
|
- **Chain Status**: OK oder FEHLER
|
|
- **Gesamteinträge**: Anzahl aller Audit-Logs
|
|
- **Letzter Index**: Sequenznummer des letzten Eintrags
|
|
- **Hashwerte**: SHA256-Hashes für Integritätsprüfung
|
|
- **Integritätsabweichungen**: Auflistung von Fehlern (falls vorhanden)
|
|
|
|
### Hash-Verifikation
|
|
Jeder Audit-Eintrag enthält:
|
|
- `entry_hash`: SHA256 des aktuellen Eintrags
|
|
- `prev_hash`: SHA256 des vorherigen Eintrags
|
|
- `chain_index`: Sequenzielle Nummer für Ordnung
|
|
|
|
### Unterschriftsfeld
|
|
Der amtliche Report enthält Platz für:
|
|
- Schulleitung (Unterschrift + Datum)
|
|
- IT-Beauftragter (Unterschrift + Datum)
|
|
|
|
Dieser Prüfvermerk bestätigt die Richtigkeit und Revisionssicherheit.
|
|
|
|
## Datenschutz & DSGVO
|
|
|
|
### DSGVO-Hinweis
|
|
Alle PDF-Exporte enthalten eine Fußzeile:
|
|
```
|
|
Dieses Dokument wurde datenschutzkonform erstellt.
|
|
Speicherung auf zertifizierten Servern in Deutschland.
|
|
```
|
|
|
|
### Datenschutz-Praktiken
|
|
- ✓ Keine personenbezogenen Daten in Hashwerten
|
|
- ✓ IP-Adressen nur für Audit-Zwecke
|
|
- ✓ Benutzer nur als System-Identifier
|
|
- ✓ Keine Passwörter oder Secrets im Log
|
|
- ✓ Payload gekürzt für Datenschutz
|
|
|
|
### Langzeitarchivierung
|
|
Die Berichte sind optimiert für:
|
|
- **PDF/A-Kompatibilität** (30+ Jahre Lesbarkeit)
|
|
- **Deutsche Behörden** (Bundesarchiv Standard)
|
|
- **Rechtssicherheit** (gerichtlich verwertbar)
|
|
|
|
## Technische Architektur
|
|
|
|
### Klassenliste
|
|
|
|
#### `DIN5008AuditPDF`
|
|
Hauptklasse für PDF-Generierung
|
|
|
|
**Constructor:**
|
|
```python
|
|
DIN5008AuditPDF(school_info=None, export_type='official')
|
|
```
|
|
|
|
**Parameter:**
|
|
- `school_info` (dict): Schulinformationen (optional)
|
|
- `export_type` (str): 'quick' oder 'official'
|
|
|
|
**Methoden:**
|
|
- `generate_quick_check(verify_result, event_counts, audit_rows)` → PDF bytes
|
|
- `generate_official_report(verify_result, event_counts, audit_rows)` → PDF bytes
|
|
|
|
**Interne Methoden:**
|
|
- `_add_header()` - Briefkopf
|
|
- `_add_title()` - Titel
|
|
- `_add_audit_summary()` - Zusammenfassung
|
|
- `_add_events_table()` - Ereignistabelle
|
|
- `_add_mismatches()` - Fehler-Sektion
|
|
- `_add_signature_block()` - Unterschriftsfeld
|
|
- `_add_footer_info()` - DSGVO & Tech-Info
|
|
- `_create_qr_code()` - QR-Code Generator
|
|
|
|
#### `generate_audit_pdf()` Function
|
|
Convenience-Funktion für PDF-Generierung
|
|
|
|
```python
|
|
generate_audit_pdf(
|
|
verify_result, # dict - Verifikationsergebnis
|
|
event_counts, # list - Ereignistypen
|
|
audit_rows, # list - Audit-Einträge
|
|
export_type='official', # str
|
|
school_info=None # dict
|
|
) → bytes
|
|
```
|
|
|
|
**Rückgabewert**: PDF als Bytes (bereit zum Download)
|
|
|
|
### Code-Integration in app.py
|
|
|
|
#### Helper-Funktion
|
|
```python
|
|
def _get_school_info_for_export():
|
|
"""Lädt Schulinfos aus config.json oder gibt Defaults zurück"""
|
|
# Implementiert automatisches Fallback
|
|
```
|
|
|
|
#### Route: Quick-Check PDF
|
|
```python
|
|
@app.route('/admin/audit/export/pdf/quick', methods=['GET'])
|
|
def admin_audit_export_pdf_quick():
|
|
# Admin-Check
|
|
# Audit-Log laden
|
|
# PDF generieren
|
|
# Download zurückgeben
|
|
```
|
|
|
|
#### Route: Official Report PDF
|
|
```python
|
|
@app.route('/admin/audit/export/pdf/official', methods=['GET'])
|
|
def admin_audit_export_pdf_official():
|
|
# Admin-Check
|
|
# Audit-Log laden
|
|
# PDF generieren
|
|
# Download zurückgeben
|
|
```
|
|
|
|
### Template-Integration in admin_audit.html
|
|
|
|
```html
|
|
<!-- Info Box -->
|
|
<div style="background:#e8f4f8; ...">
|
|
Information über DIN 5008 Compliance
|
|
</div>
|
|
|
|
<!-- Export Buttons -->
|
|
<div style="display:grid; ...">
|
|
<a href="{{ url_for('admin_audit_export_pdf_quick') }}">
|
|
🚀 Schnell-Check
|
|
</a>
|
|
<a href="{{ url_for('admin_audit_export_pdf_official') }}">
|
|
📋 Amtlicher Bericht
|
|
</a>
|
|
</div>
|
|
```
|
|
|
|
## Fehlerbehandlung
|
|
|
|
### Häufige Fehler und Lösungen
|
|
|
|
**Fehler: "403 Forbidden"**
|
|
```
|
|
Ursache: Benutzer ist kein Admin
|
|
Lösung: Mit Admin-Konto anmelden
|
|
```
|
|
|
|
**Fehler: "500 Internal Server Error"**
|
|
```
|
|
Ursache: Datenbank-Verbindung fehlt
|
|
Lösung: MongoDB-Server überprüfen
|
|
Log: tail -f logs/app.log
|
|
```
|
|
|
|
**Fehler: "PDF scheint beschädigt"**
|
|
```
|
|
Ursache: Encoding-Problem
|
|
Lösung: Browser-Cache löschen und erneut versuchen
|
|
```
|
|
|
|
### Debugging
|
|
|
|
**Log-Datei prüfen:**
|
|
```bash
|
|
tail -f logs/app.log | grep -i "pdf\|export"
|
|
```
|
|
|
|
**Test-PDF generieren:**
|
|
```python
|
|
import sys
|
|
sys.path.insert(0, 'Web')
|
|
from pdf_audit_export import generate_audit_pdf
|
|
|
|
test_data = {
|
|
'verify_result': {'ok': True, 'count': 0, 'last_chain_index': 0, 'mismatches': []},
|
|
'event_counts': [],
|
|
'audit_rows': [],
|
|
}
|
|
|
|
pdf = generate_audit_pdf(**test_data, export_type='quick')
|
|
with open('test.pdf', 'wb') as f:
|
|
f.write(pdf)
|
|
```
|
|
|
|
## Performance & Optimierung
|
|
|
|
### Größen
|
|
- Quick-Check PDF: ~3-5 KB
|
|
- Official Report PDF: ~4-8 KB pro 100 Einträge
|
|
- Maximale Größe bei 5000 Einträgen: ~40-50 KB
|
|
|
|
### Generierungszeit
|
|
- Quick-Check: <100ms
|
|
- Official Report (100 Einträge): <200ms
|
|
- Official Report (1000 Einträge): <500ms
|
|
|
|
### Optimierungen
|
|
- Lazy Loading von Audit-Daten
|
|
- Effiziente Table-Strukturen
|
|
- Minimale PDF-Größen
|
|
- Keine unnötigen Bilder/Grafiken
|
|
|
|
## Geplante Erweiterungen
|
|
|
|
### Phase 2: Erweiterte Funktionen
|
|
- [ ] QR-Codes pro Zeile (direkt zu Einträgen)
|
|
- [ ] Schullogo hochladen
|
|
- [ ] Digitale PDF-Signaturen
|
|
- [ ] Mehrsprachige Exporte
|
|
- [ ] Export-Scheduler (täglich)
|
|
- [ ] Email-Versand
|
|
|
|
### Phase 3: Behörden-Integration
|
|
- [ ] Vollständiges PDF/A-3u Format
|
|
- [ ] Embedded XML-Metadaten
|
|
- [ ] Bitonal Font Support
|
|
- [ ] Archive-Server Integration
|
|
- [ ] eSignature Integration
|
|
|
|
## Ressourcen
|
|
|
|
### Dokumentation
|
|
- [DIN 5008 Standard](https://www.beuth.de/de/norm/din-5008-1/330274627)
|
|
- [BFSG - Barrierefreiheitsstärkungsverordnung](https://www.gesetze-im-internet.de/bfsg/)
|
|
- [DSGVO - Datenschutzgrundverordnung](https://www.gesetze-im-internet.de/dsgvo/)
|
|
- [ReportLab Dokumentation](https://www.reportlab.com/docs/reportlab-userguide.pdf)
|
|
|
|
### Support
|
|
- GitHub Issues: [Link zur Issue-Seite]
|
|
- Email Support: support@invario.example
|
|
- Dokumentation: [PDF_AUDIT_EXPORT_DOCUMENTATION.md](PDF_AUDIT_EXPORT_DOCUMENTATION.md)
|
|
|
|
## Version & Changelog
|
|
|
|
**Version**: 1.0.0
|
|
**Release Date**: 10.05.2026
|
|
|
|
### Changelog
|
|
- [1.0.0] Initial Release
|
|
- ✓ Quick-Check PDF Export
|
|
- ✓ Official Report PDF Export
|
|
- ✓ DIN 5008 Compliance
|
|
- ✓ BFSG Accessibility
|
|
- ✓ DSGVO Compliance
|
|
- ✓ Revisionssicherheit
|
|
|
|
### Kompatibilität
|
|
- Python: 3.8+
|
|
- Flask: 2.0+
|
|
- MongoDB: 4.0+
|
|
- Browser: Chrome, Firefox, Safari, Edge (alle aktuellen Versionen)
|
|
|
|
## Lizenz
|
|
|
|
Dieses Modul ist Teil des Invario-Systems und unterliegt der Inventarsystem EULA.
|
|
Siehe: [Legal/LICENSE](Legal/LICENSE)
|