**VVV-Abgleich**: Automatischer Abgleich von Vermögensverwaltungsverträgen (PDFs) mit den zugehörigen JSON-Daten (questionnaire-data.json, broker-data.json, partner-data.json) aus E2E-Onboarding-Tests. - MANDATORY TRIGGERS: VVV, Vermögensverwaltungsvertrag, Abgleich, Onboarding-Test, questionnaire-data, should_onboard - Verwende diesen Skill immer wenn der User Testdaten aus Onboarding-Runs mit generierten PDFs vergleichen will, auch wenn er nur "vergleich die Daten" oder "stimmt das PDF?" sagt.
Dieser Skill gleicht die Daten aus E2E-Onboarding-Test-Outputs mit den generierten Vermögensverwaltungsverträgen (PDFs) ab. Er prüft ob alle Kundendaten, Strategie-Auswahl, Bank-Wahl, Broker- und Partner-Daten korrekt ins PDF übernommen wurden.
Jeder Onboarding-Test erzeugt einen Ordner mit diesem Aufbau:
should_onboard_successfully_with_<Testname>_<Timestamp>/
├── questionnaire-data.json # Alle Kundendaten, Strategie, Risikoprofil etc.
├── broker-data.json # Tippgeber/Vermittler-Daten (optional)
├── partner-data.json # Partner-Daten bei Partnerstrategien (optional)
├── estably/
│ └── Vermögensverwaltungsvertrag Estably.pdf
└── bank/
└── (Bankdokumente - nicht Teil dieses Abgleichs)
should_onboard_* Verzeichnisse im angegebenen Pfadpdftotext -layout (nicht pdfplumber!) um Text aus den PDFs zu extrahieren. pdfplumber übersieht überlagerte Textlayer, pdftotext erfasst sie zuverlässig.Verwende IMMER pdftotext -layout statt Python-Libraries wie pdfplumber oder PyPDF. Der Grund: Die Estably-PDFs haben überlagerte Textlayer für die befüllten Felder, die von Python-Libraries oft nicht erkannt werden. pdftotext ist hier der einzige zuverlässige Weg.
pdftotext -layout "<pdf_path>" "<output_txt_path>"
Persönliche Daten (Frage angabe):
vorname → Im PDF als Vorname des Kundennachname → Im PDF als Name des Kundengeburtsdatum → Format im PDF: DD.MM.YYYY (ISO → umwandeln!)familienstand → Im Kundenprofil (Anhang 2)geburtsort → Steht NICHT im VVV (nur in Bankdokumenten) → ignorierenAdressdaten (Frage personlichen-daten):
strasse + hausnummer → zusammen als Adresseplz + wohnort → zusammen als PLZ und Ortmobile → Telefonnummerland → Länderkürzel (DE, AT etc.) wird im PDF als Klartext dargestellt (Deutschland, Österreich)E-Mail: Top-Level-Feld email im JSON
Berufliche Daten (Frage angabe-person):
employments[0].job → Beruf im KundenprofileducationDescriptionOther → Erlernter Berufemployments[0].employer → Steht NICHT im VVV → ignorierenStrategie (Frage strategie-auswahl):
strategie → Mapping auf PDF-Text:
value20fund → "Value 20"value40fund → "Value 40"value60fund → "Value 60"value80fund → "Value 80"value100fund → "Value 100"value100millercrypto → "Miller Krypto-Strategie" oder "CRYPTOSTRATEGIE"value100secure → "Sicherungsstrategie" oder "SECURE"valueGreen → "Value Green"Bank (Frage bank-wahl):
bank → Mapping:
baader → "Baader Bank"llb → "Liechtensteinische Landesbank"Risikoprofil (Frage wertminerung):
wertminerung: "0%" → "Sehr gering" / "0-3"wertminerung: "10%" → "Gering" / "4-7"wertminerung: "20%" → "Eher gering" / "8-11"wertminerung: "30%" → "Mittel" / "12-15"wertminerung: "40%" → "Hoch" / "16-19"wertminerung: "50%" → "Sehr hoch" / "20-24"Nachhaltigkeit (Frage sustainable):
interested: "no" → "keine Nachhaltigkeitspräferenz"interested: "yes" → Nachhaltigkeitspräferenz vorhandenAnlageziele (Frage geldanlage-ziel):
aufbau: true → "Vermögensaufbau"preserveAssets: true → "Vermögenserhalt"Nur relevant wenn generateBrokerAttachment: true:
companyName → Im Tippgeber-Anhangstreet, postalCode, city, country → In der InformationsvollmachtArray von Partnern. Relevant ist der Partner, dessen strategyGroups die gewählte Strategie enthält (z.B. groupName: "millercrypto"). Felder:
companyName → Im Partner-Anhangstreet, postalCode, city, country → In der InformationsvollmachtFelder die bewusst NICHT im VVV stehen (keine Fehler melden):
Führe das Script scripts/vvv_compare.py aus:
python3 <skill-path>/scripts/vvv_compare.py [verzeichnis] [--format html] [--output <report-pfad>]
Wenn kein Verzeichnis angegeben wird, wird automatisch web/apps/fe-web-e2e/cypress/downloads relativ zum CWD verwendet. Das ist der Standard-Output-Pfad der E2E-Onboarding-Tests.
directory (optional): Verzeichnis mit should_onboard_* Ordnern. Default: <CWD>/web/apps/fe-web-e2e/cypress/downloads--format / -f: Report-Format, html (Standard) oder md--output / -o: Pfad für den Report (Standard: <verzeichnis>/vvv-abgleich-report.<format>)Falls das Script nicht vorhanden ist oder Fehler wirft, folge der Logik manuell nach dem oben beschriebenen Workflow.