Files
Inventarsystem/Legal/PDF_IMPLEMENTATION_GUIDE.md
Aiirondev_dev 0c27d7ac86 feat: Add Excel, PDF export, and user generation modules
- 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.
2026-05-20 15:30:23 +02:00

11 KiB

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

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:

{
  "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

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:

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:

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:

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

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

def _get_school_info_for_export():
    """Lädt Schulinfos aus config.json oder gibt Defaults zurück"""
    # Implementiert automatisches Fallback

Route: Quick-Check PDF

@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

@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

<!-- 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:

tail -f logs/app.log | grep -i "pdf\|export"

Test-PDF generieren:

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

Support

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