AVV-Onboarding — Umgesetzt (2026-04-22)
Ziel
Der Auftragsverarbeitungsvertrag (AVV nach Art. 28 DSGVO) wird waehrend des Onboarding-Prozesses automatisch mit den Kundendaten befuellt, als PDF gerendert und dem Kunden bereitgestellt. Kein manuelles Ausfuellen, kein Papier, kein Postversand.
Ist-Zustand
Onboarding-Schritte (6 Steps)
| Step | Daten | Relevant fuer AVV |
|---|---|---|
| 1. Subdomain | hostingType, facilityType, subdomain | Ja (Leistungsmodell) |
| 2. Rechnungsadresse | billingCompany, Strasse, PLZ, Ort, Land, USt-ID | Ja (Vertragspartner) |
| 3. Ansprechpartner | Vorname, Nachname, E-Mail, Telefon | Ja (Vertretungsberechtigt) |
| 4. Admin-Zugang | Username, Passwort | Nein |
| 5. Tarif & Zahlung | staffCount, studentsCount, parentsCount, Tier, Zahlungsart | Ja (Leistungsumfang) |
| 6. Rechtliches | AGB, Datenschutz, AV-Vertrag Checkboxen | Ja (Zustimmung) |
AVV-Vorlage
AVV_priolog_Art28_DSGVO_Schulen_cleaned.md — 691 Zeilen, enthält:
- Vertragsparteien (Platzhalter fuer Kundendaten)
- §1-§13 Vertragsbedingungen
- Anlage 1: Verarbeitungsbeschreibung (mit Leistungsmodell-Auswahl)
- Anlage 2: TOMs
- Anlage 3: Unterauftragsverarbeiter
- Anlage 4: Elektronischer Abschluss
Platzhalter im AVV die befuellt werden muessen
| Platzhalter | Quelle aus Onboarding |
|---|---|
| Name der Schule / Einrichtung | billingCompany |
| Anschrift | billingStreet, billingZip, billingCity |
| Vertretungsberechtigte Person | contactTechFirstname + contactTechLastname |
| E-Mail / Datenschutzkontakt | contactTechEmail |
| Leistungsmodell (Light/Pro/On-Premises) | hostingType → Light oder Pro |
| Datum | Zeitpunkt der Zustimmung |
Architektur
Onboarding-Frontend (Step 6: Rechtliches)
│
│ [1] Kunde sieht AVV-Vorschau mit eingesetzten Daten
│ [2] Kunde klickt "AVV digital abschliessen"
│
▼
Backend API: POST /api/public/orders
│
│ [3] AVV-Template + Kundendaten → Markdown rendern
│ [4] Markdown → PDF (via Puppeteer/html-pdf)
│ [5] PDF in S3 speichern
│ [6] Protokollierung (Version, Zeitstempel, IP, E-Mail)
│ [7] PDF per Mail an Kunden senden
│
▼
Ergebnisse:
├── S3: avv/{orderId}/AVV_{subdomain}_{date}.pdf
├── DB: avv_consent_log (Nachweis)
├── Admin: GET /admin/orders/{id}/avv (PDF Download)
└── Kunde: Success-Page + E-Mail mit PDF-LinkUmsetzung in 5 Phasen
Phase 1: AVV-Template als Funktion (Backend)
Eine Funktion die das Markdown-Template nimmt und Platzhalter ersetzt:
function renderAvvMarkdown(data: {
companyName: string;
address: string;
representative: string;
email: string;
plan: 'light' | 'pro' | 'on-premises';
subdomain: string;
signedAt: Date;
}): string {
// Ersetzt Platzhalter im AVV-Template
// Setzt Checkbox bei gewaehltem Leistungsmodell
// Fuegt Datum und Unterschrifts-Block ein
}Aufwand: 0.5 Tage
Phase 2: PDF-Rendering (Backend)
Markdown → HTML → PDF. Drei Optionen:
| Option | Vorteil | Nachteil |
|---|---|---|
| Puppeteer | Perfektes Rendering, CSS-Kontrolle | Schwer (~300MB Chrome), langsam |
| md-to-pdf | Leichtgewichtig, npm-Paket | Weniger Kontrolle ueber Layout |
| Eigener HTML→PDF via wkhtmltopdf | Schnell, kein Chrome noetig | Muss installiert sein |
Empfehlung: md-to-pdf — einfach, kein Chrome noetig, reicht fuer ein Vertragsdokument.
import { mdToPdf } from 'md-to-pdf';
async function generateAvvPdf(markdown: string): Promise<Buffer> {
const result = await mdToPdf({ content: markdown }, {
pdf_options: {
format: 'A4',
margin: { top: '25mm', bottom: '25mm', left: '20mm', right: '20mm' },
},
stylesheet: 'assets/avv-style.css', // Corporate Design
});
return result.content;
}Aufwand: 0.5 Tage
Phase 3: Speicherung + Protokollierung (Backend)
S3-Speicherung:
s3://prilog-files/avv/{orderId}/AVV_{subdomain}_{YYYY-MM-DD}.pdfDB-Protokollierung (neue Tabelle avv_consent_log):
| Feld | Typ | Inhalt |
|---|---|---|
| id | cuid | Primary Key |
| orderId | string | Zuordnung zur Bestellung |
| tenantId | string | Tenant-Referenz |
| version | string | AVV-Versionsnummer (z.B. "1.0") |
| contentHash | string | SHA-256 des gerenderten Markdown |
| signedAt | datetime | Zeitpunkt der Zustimmung |
| signedBy | string | Name der zustimmenden Person |
| signedByEmail | string | |
| ipAddress | string | IP zum Zeitpunkt der Zustimmung |
| userAgent | string | Browser-Info |
| pdfStorageKey | string | S3-Pfad zur PDF |
| plan | string | Gewaehltes Leistungsmodell |
Entspricht exakt den Anforderungen aus Anlage 4, Abschnitt D des AVV.
Aufwand: 0.5 Tage
Phase 4: Onboarding-Integration (Frontend + Backend)
Frontend (step-legal.tsx) erweitern:
- AVV-Vorschau — unter der Checkbox ein aufklappbarer Bereich der den AVV mit eingesetzten Kundendaten zeigt
- PDF-Download-Button — "AVV als PDF herunterladen" (generiert on-demand)
- Checkbox-Text anpassen:
"Ich habe den Auftragsverarbeitungsvertrag (AVV) einschliesslich Anlagen gelesen, konnte ihn herunterladen und schliesse ihn in elektronischer Form fuer die genannte Einrichtung ab."
Backend (POST /api/public/orders) erweitern:
Nach erfolgreicher Bestellung:
- AVV-Markdown rendern mit Kundendaten
- PDF generieren
- In S3 speichern
- Consent in
avv_consent_logprotokollieren - PDF-URL in Order speichern
Aufwand: 1 Tag
Phase 5: Auslieferung (Success-Page + E-Mail + Admin)
Success-Page (nach Bestellung):
- "Ihre Instanz wird eingerichtet..."
- Download-Button: "Auftragsverarbeitungsvertrag (PDF)"
- Link bleibt dauerhaft gueltig (S3 Presigned URL, 7 Tage, danach ueber Portal)
E-Mail (automatisch nach Bestellung):
- Bestellbestaetigung + AVV als PDF-Anhang
- Text: "Anbei erhalten Sie den Auftragsverarbeitungsvertrag fuer Ihre Unterlagen."
Admin-Panel (admin.prilog.chat):
- Pro Order: "AVV herunterladen" Button
- Consent-Log einsehbar (wer hat wann mit welcher IP zugestimmt)
Kunden-Portal (portal.prilog.chat):
- Unter "Abrechnung" oder "Rechtliches": AVV jederzeit erneut downloadbar
Aufwand: 1 Tag
Gesamtaufwand
| Phase | Aufwand |
|---|---|
| 1. Template-Rendering | 0.5 Tage |
| 2. PDF-Generierung | 0.5 Tage |
| 3. Speicherung + Protokollierung | 0.5 Tage |
| 4. Onboarding-Integration | 1 Tag |
| 5. Auslieferung (Success, Mail, Admin, Portal) | 1 Tag |
| Gesamt | ~3.5 Tage |
Sicherheit + Compliance
Nachweis-Kette (Audit Trail)
Fuer jeden AVV-Abschluss wird dokumentiert:
- Vertragsversion + Content-Hash (beweist welche Version akzeptiert wurde)
- Zeitstempel (sekundengenau)
- Identitaet (Name + E-Mail des Zustimmenden)
- Technische Daten (IP, User-Agent, Session-ID)
- PDF-Kopie in S3 (unveraenderbar nach Erstellung)
DSGVO Art. 28 Abs. 9
"Der Vertrag [...] wird schriftlich abgefasst, was auch in einem elektronischen Format erfolgen kann."
Unser Prozess erfuellt diese Anforderung:
- Vollstaendiger Vertragstext vor Abschluss einsehbar und downloadbar
- Aktive Bestaetigungshandlung (Checkbox + Klick)
- Vertretungsberechtigung wird bestaetigt
- Nachweis wird dauerhaft gespeichert
Versionierung
Wenn sich der AVV aendert:
- Neue Version in der Template-Datei
- Bestehende Kunden behalten ihre unterzeichnete Version (in S3)
- Neue Kunden bekommen die aktuelle Version
- Bei wesentlichen Aenderungen: bestehende Kunden per Mail informieren + neue Zustimmung einholen