# 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