OpenChart
Free Desktop charting with Claude or Codex. Describe alerts, research chart moves, and choose your data providers.
Datenaufbereitung für das Bestandsverwaltungssystem
Translation pending
FinanceTypeScript · CSSGitHub @19Kaan25OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Live-Demo: https://abrechnungskonverter.vercel.app/
Web-App, die Provisions- und Courtageabrechnungen verschiedener Versicherer in ein einheitliches CSV-Format für ein Bestandsverwaltungssystem umwandelt.
Jede Versicherung liefert ihre Abrechnung anders: andere Spaltennamen, andere
Zeichenkodierung, Prozentsätze mal als 30 und mal als 0,30, Stornos als negative
Beträge, Kopf- und Summenzeilen. Der Konverter liest diese Dateien ein, vereinheitlicht
sie und fasst gleiche Verträge zusammen. Heraus kommt immer dieselbe Struktur:
VS-Nummer;VN-Name;Provision;KA
Die App hat einen früheren Ablauf aus lokaler HTML-Datei und n8n-Workflow abgelöst.
| Bereich | Technik |
|---|---|
| Framework | Next.js 14 (App Router), React 18 |
| Sprache | TypeScript (Strict Mode) |
| Parsing | Papa Parse (CSV), SheetJS (Excel) |
| Tests | Vitest |
| CI | GitHub Actions (Node 22) |
| Hosting | Vercel (statische Seite, keine Serverfunktionen) |
CSV / TXT: R+V / Condor, ARAG, Adcuri, Zürich, Nürnberger, VHV, Auxilla, HVS (.txt),
Allianz
Excel: .xls (InterRisk, HVS) und .xlsx (Adcuri)
Einige Versicherer brauchen eine Sonderbehandlung:
1..txt in Latin1 mit gemischten CR-/CRLF-Zeilenumbrüchen,
die vor dem Parsen vereinheitlicht werden. Übernommen werden nur Zeilen mit
4 < Prozentsatz < 51. Als Provision zählt Courtage, nicht Gesamt-Courtage.
Anschriften, die an den VN-Namen angehängt sind (Name, Straße, PLZ Ort), werden
entfernt..xls): Die Kopfzeile steht erst unter einem dreizeiligen Briefkopf und wird
automatisch gesucht, die SUMME-Zeile am Ende wird ignoriert. Vertragsnr. wird ohne
führende Nullen übernommen, als Provision zählt Abr.Betrag. Es gelten dieselben Regeln
wie bei der TXT (4 < Pr% < 51, KA immer 1). Die Originaldatei ist
passwortgeschützt und muss vorher in Excel ohne Passwort gespeichert werden.VERTRAGS_OM, VN-Name als
„Nachname, Vorname“, das Vorzeichen von PROVISIONSBETRAG wird umgedreht. Übernommen
werden nur Zeilen mit 3 < PROVISIONSSATZ < 51.PDF-Abrechnungen werden bewusst nicht unterstützt. Dafür wäre ein Server oder ein externer KI-Dienst nötig, und die Daten müssten den Browser verlassen.
Jedes Mapping prüft vorab, ob alle erwarteten Spalten da sind
(lib/convert/validate.ts). Wurde eine Spalte umbenannt, zeigt die App eine klare
Fehlermeldung an. Ohne diese Prüfung käme still „0 Verträge“ heraus oder, schlimmer,
Verträge mit Provision 0.
Zusätzlich prüft lib/convert/contentValidation.ts bei jeder Konvertierung den Inhalt:
CSV-Struktur, leere Dateien, lesbare Provisionen und Provisionssätze, plausible
Prozentskalen, beschädigte Zeichen und die erzeugte Ausgabe. Dabei wird nichts
gespeichert.
npm install
npm run dev
Die App läuft dann unter http://localhost:3000.
npm test # einmal durchlaufen lassen (wie in der CI)
npm run test:watch # während der Entwicklung
Für jeden Versicherer gibt es einen End-to-End-Test (test/insurers-*.test.ts). Er
schickt eine kleine Beispieldatei aus test/fixtures/ durch convert() und vergleicht
das Ergebnis exakt, inklusive KA-Kennung, Zahlenformat, Umlauten und Zusammenfassung.
Die Beispieldateien haben die echte Spaltenstruktur und Kodierung, enthalten aber nur
erfundene Namen und Nummern.
Dazu kommen Unit-Tests für Aggregation, CSV-Ausgabe, Spaltenprüfung, Dispatcher und geänderte Eingangsformate.
Die App läuft unter https://abrechnungskonverter.vercel.app/. Sie ist eine statische Next.js-Seite und braucht auf Vercel keine Umgebungsvariablen: Repository importieren, Vercel erkennt Next.js automatisch.
app/
page.tsx Oberfläche: Tabs, Upload, Status, Download
lib/convert/
index.ts convert(): wählt das Mapping nach Firma bzw. Format
readFile.ts liest Dateien als UTF-8, Latin1 oder binär
parseCsv.ts Semikolon-CSV-Parser
parseExcel.ts liest das erste Tabellenblatt einer Excel-Datei
validate.ts Prüfung der erwarteten Spalten
contentValidation.ts Inhaltsprüfung bei jeder Konvertierung
aggregate.ts fasst gleiche Verträge zusammen und summiert
buildCsv.ts Ausgabe-CSV (UTF-8 mit BOM) und Dateiname
csv/*.ts Mappings je Versicherer
excel/*.ts Excel-Mappings
test/
fixtures/ anonymisierte Beispieldateien
*.test.ts Vitest-Tests