Optimus CLI
Euer ERP kann keine API anbinden? Kein Problem. Mit der Optimus CLI integriert ihr die USt-ID-Prüfung automatisiert in jedes System - ganz ohne Entwicklung.
Exportiert eure Daten als CSV, und die CLI übernimmt den Rest: USt-IDs prüfen, Firmendaten validieren, Firmendaten anreichern, Abweichungen erkennen und Korrekturen zurückgeben.
Einmal eingerichtet, läuft alles automatisch im Hintergrund. Bei Fragen sprechen Sie uns gerne an: Kontakt
Die CLI kennt zwei Hauptbefehle: check prüft USt-IDs gegen die Optimus API und schreibt eine Ergebnis-CSV. import legt Stammdaten in der WebApp an oder aktualisiert bestehende Einträge.
Voraussetzungen
optimus.exe ist als self-contained Single-File publiziert - die .NET 8 Runtime ist direkt in die EXE eingebettet. Auf dem Zielrechner muss nichts installiert werden. Einfach die EXE in einen beliebigen Ordner legen und ausführen.
optimus.exe läuft auf jedem Windows-Rechner direkt aus dem Ordner heraus.
Betriebssystem
Die CLI ist für Windows x64 gebaut. Windows 10 / Windows Server 2019 oder neuer wird empfohlen.
Netzwerk
Die CLI benötigt ausgehenden HTTPS-Zugriff (Port 443) auf:
| Umgebung | Host |
|---|---|
| Produktion | webapp.optimussoftware.de |
| Test | demo-webapp.optimussoftware.de |
Authentifizierung
Alle API-Aufrufe benötigen einen Bearer-Token. Den Token erstellt ihr in der WebApp unter Einstellungen → API-Token generieren.
Den Token könnt ihr auf drei Wegen übergeben - am sichersten ist die Umgebungsvariable:
| Methode | Beispiel |
|---|---|
| CLI-Flag | --token eyJ... |
| Umgebungsvariable | set OPTIMUS_TOKEN=eyJ... |
| YAML-Datei | nicht direkt unterstützt - lieber Env-Variable |
Konfigurationspriorität
Wenn dieselbe Option an mehreren Stellen definiert ist, gilt diese Reihenfolge - links gewinnt immer:
--env test oder -v.
check - USt-IDs prüfen
Liest eine CSV-Datei (oder alle CSVs in einem Ordner), prüft jede USt-ID über die Optimus API und schreibt eine Ergebnis-CSV mit Status und optionalen Korrekturen.
optimus check <pfad> [optionen]
# Einfache Prüfung optimus check kunden.csv --map mapping.yml --token eyJ... # Mit PDF-Prüfbericht (digital signiert) optimus check kunden.csv --map mapping.yml --token eyJ... --pdf --sign --pdf-dir ./evidence
import - Stammdaten importieren
Liest eine CSV und legt für jede Zeile einen Stammdateneintrag in der WebApp an (POST) oder aktualisiert bestehende Einträge (PUT) - abhängig vom gewählten Duplikat-Modus.
optimus import <pfad> [optionen]
# Import mit Overwrite, matchKey aus ustId + PLZ optimus import C:\optimus\import --map mapping.yml --token eyJ...
Allgemeine Optionen
Diese Optionen gelten für beide Befehle: check und import.
Basis
| Flag | Beschreibung | Default |
|---|---|---|
<pfad> | Pflicht. Pfad zur CSV-Datei oder zu einem Ordner (Ordner-Modus). | - |
--map <datei> | Pfad zur YAML-Mapping-Datei. Empfohlen für alles außer Schnelltests. | - |
--token <jwt> | Bearer-Token für die API. Alternativ via Umgebungsvariable OPTIMUS_TOKEN. | $OPTIMUS_TOKEN |
--env <test|prod> | Wechselt zwischen Test- und Produktivumgebung. test spricht demo-webapp.optimussoftware.de an. | prod |
--out <datei> | Pfad für die Ergebnis-CSV. Wird automatisch angelegt wenn nicht angegeben. | {input}_result.csv |
--dry-run | Liest und validiert die CSV, führt aber keinen API-Aufruf durch. Nützlich zum Testen des Mappings. | false |
Ausgabe & Debugging
| Flag | Beschreibung | Default |
|---|---|---|
-v / --verbose | Zeigt für jede Zeile detaillierte Informationen - was geprüft wurde, welches Ergebnis kam, ob Fehler aufgetreten sind. | false |
-q / --quiet | Unterdrückt alle Ausgaben außer Fehlermeldungen. Sinnvoll für automatisierte Abläufe. | false |
Spalten-Mapping (alternativ zur YAML)
| Flag | CSV-Spalte für … |
|---|---|
--col-ustid <name> | USt-ID (Pflichtfeld) |
--col-name <name> | Firmenname |
--col-street <name> | Straße |
--col-zip <name> | Postleitzahl |
--col-city <name> | Ort |
--col-ref <name> | Externe Referenz (z.B. Kunden-Nr.) |
CSV-Format (Eingabe)
| Flag | Beschreibung | Default |
|---|---|---|
--in-delimiter <z> | Trennzeichen der Eingabe-CSV. Erlaubt: ; , \t |. Wird automatisch erkannt wenn nicht gesetzt. | Auto |
--in-encoding <enc> | Zeichenkodierung der Eingabe-CSV. Relevant bei Windows-Exports (oft windows-1252). | utf-8 |
--no-header | Setzen wenn die CSV keine Kopfzeile hat. Spalten werden dann per Position gemappt. | false |
--skip-rows <n> | Überspringt n Zeilen vor dem Header. Nützlich bei CSVs mit Metadaten am Anfang. | 0 |
CSV-Format (Ausgabe)
| Flag | Beschreibung | Default |
|---|---|---|
--out-delimiter <z> | Trennzeichen für die Ergebnis-CSV. | wie Eingabe |
--out-encoding <enc> | Encoding der Ergebnis-CSV. | utf-8 |
--no-bom | Deaktiviert das BOM-Zeichen in der Ausgabe. BOM wird von Excel für die korrekte Darstellung von Umlauten benötigt. | false |
Optionen - nur check
PDF-Prüfbericht
| Flag | Beschreibung | Default |
|---|---|---|
--pdf | Erstellt für jede geprüfte USt-ID einen PDF-Prüfbericht. | false |
--no-pdf | Deaktiviert PDFs explizit - überschreibt die YAML-Einstellung. | false |
--sign | Signiert den PDF-Bericht digital. Erfordert --pdf. | false |
--pdf-dir <ordner> | Ordner in dem die PDFs gespeichert werden. | neben Ergebnis-CSV |
--pdf-timestamp | Hängt einen Zeitstempel an den PDF-Dateinamen - verhindert Überschreiben bei Wiederholungsläufen. | false |
Prüfverhalten
| Flag | Beschreibung | Default |
|---|---|---|
--transliteration | Aktiviert Zeichensatz-Transliteration. Hilfreich wenn Sonderzeichen in der CSV anders kodiert sind als erwartet. | false |
--company-vat-id <id> | Eigene USt-ID für die qualifizierte Prüfung (Bestätigungsverfahren). Muss vorab durch Optimus freigeschaltet werden. | Account-USt-ID |
--batch-size <n> | Anzahl paralleler API-Calls. Bei stabiler Verbindung kann erhöht werden, bei Timeouts reduzieren. | 500 |
--out-columns <liste> | Komma-getrennte Liste der Spalten in der Ergebnis-CSV. Shortcut all gibt alle Spalten aus. | alle |
Benachrichtigung
| Flag | Beschreibung | Default |
|---|---|---|
--notify | Sendet nach Abschluss eine Monitoring-E-Mail. | false |
--email-pdf | Versendet die PDFs per E-Mail (erfordert --pdf). | false |
Optionen - nur import
| Flag | Beschreibung | Default |
|---|---|---|
--on-duplicate <modus> | Verhalten bei bereits vorhandenen Einträgen. Mögliche Werte: append (immer neu anlegen), overwrite (aktualisieren), skip (überspringen). Siehe Duplikat-Logik. | append |
--match-key <felder> | Komma-getrennte Felder die als Schlüssel für den Duplikat-Abgleich verwendet werden. Pflichtfeld ist immer ustId. Weitere erlaubte Felder: externalReference, street, city, zip. | ustId |
--batch-size <n> | Anzahl paralleler API-Calls. Standard ist 5 (niedriger als bei check, da Schreiboperationen stabiler laufen bei geringerer Parallelität). | 5 |
YAML - columns
Mappt die Spaltennamen eurer CSV auf die internen Felder der Optimus API. Gilt für check und import. Nur ustId ist Pflicht.
# mapping.yml columns: ustId: "UStIdNr" # Pflicht name: "Bezeichnung" street: "Strasse" zip: "PLZ" city: "Ort" externalReference: "Kontonummer" # z.B. Kunden-Nr. aus ERP
YAML - input
Steuert wie die Eingabe-CSV eingelesen wird. Alle Felder optional - Auto-Detection greift wenn nichts definiert ist.
input: delimiter: ";" # ";" | "," | "\t" | "|" encoding: "utf-8" # oder "windows-1252" für Windows-Exporte hasHeader: true skipRows: 0 trimWhitespace: true # Leerzeichen an Feldrändern entfernen
YAML - output (nur check)
Steuert Format und Inhalt der Ergebnis-CSV.
output: delimiter: ";" encoding: "utf-8" bom: true # Empfohlen für Excel-Kompatibilität columns: # Welche Spalten sollen ausgegeben werden? - row - ust_id - ust_id_status - name - name_status - name_corrected - overall - checked_at - external_ref
Verfügbare Spalten-Shortcuts: all (alle Spalten), all_originals, all_statuses, all_corrections.
YAML - import (nur import)
Duplikat-Verhalten und Standardwerte für neu angelegte Einträge.
import: onDuplicate: "overwrite" # "append" | "overwrite" | "skip" matchKey: # Schlüssel für Duplikat-Erkennung - ustId # Pflicht - zip # optional: + PLZ, Straße, Stadt, ext. Ref. defaults: checkEnabled: true # Monitoring in der WebApp aktivieren emailNotification: false note: "CLI Import"
YAML - folder
Konfiguration für den Ordner-Modus. Wird automatisch aktiv wenn <pfad> ein Ordner ist.
folder: pattern: "*.csv" minAge: 0 # Min. Dateialter in Sekunden vor Verarbeitung onDuplicate: "skip" # Wenn Ergebnis-CSV schon existiert retryFromProcessing: true # Abgebrochene Läufe automatisch fortsetzen cleanupDoneAfterDays: null # null = done-Ordner nie leeren
YAML - filter
Zeilen aus der CSV herausfiltern bevor sie verarbeitet werden.
filter: skipEmptyUstId: true # Zeilen ohne USt-ID werden übersprungen (SKIPPED) skipPattern: "^#" # Regex auf das USt-ID-Feld - hier: Kommentarzeilen
Duplikat-Logik (import)
Der matchKey bestimmt wie ein „Duplikat" erkannt wird - ein vorhandener Eintrag in der WebApp gilt als Treffer wenn alle matchKey-Felder übereinstimmen (case-insensitive).
| Modus | Verhalten |
|---|---|
append | Kein Abgleich - jede Zeile wird immer neu angelegt (POST). Sinnvoll wenn Duplikate gewollt sind. |
skip | Wenn ein Treffer gefunden wird → Zeile überspringen (SKIPPED). Bestandsdaten bleiben unberührt. |
overwrite | Wenn genau 1 Treffer → aktualisieren (PUT). Bei 2+ Treffern → AMBIGUOUS-Warnung, kein Update. |
Ordner-Modus
Wenn <pfad> ein Ordner ist, verarbeitet die CLI alle CSVs darin automatisch nacheinander. Die Dateien werden dabei in Unterordner verschoben:
C:\optimus\import\processing\← Wird gerade verarbeitet
C:\optimus\import\done\← Erfolgreich abgeschlossen
C:\optimus\import\error\← Fehler (+ .err Datei mit Details)
C:\optimus\import\results\← Ergebnis-CSVs
retryFromProcessing: true in der YAML werden Dateien die beim letzten Lauf im processing-Ordner hängen geblieben sind, beim nächsten Start automatisch erneut verarbeitet.
Exit-Codes
Nützlich für Scripting und automatisierte Pipelines.
Beispiele
USt-ID Prüfung - minimal
optimus check kunden.csv --map mapping.yml --token eyJ...
USt-ID Prüfung - mit PDF und Signierung
optimus check kunden.csv --map mapping.yml --token eyJ... \ --pdf --sign --pdf-dir ./evidence
Testumgebung mit detailliertem Output
optimus import C:\optimus\import --map mapping.yml --token eyJ... --env test -v
Import im Ordner-Modus (Token via Umgebungsvariable)
set OPTIMUS_TOKEN=eyJ... optimus import C:\optimus\import --map mapping.yml
Dry-Run - nur Mapping testen, kein API-Call
optimus import kunden.csv --map mapping.yml --dry-run -v
Minimale YAML für Import (Overwrite, matchKey: ustId + PLZ)
columns: ustId: "UStIdNr" name: "Bezeichnung" street: "Strasse" zip: "PLZ" city: "Ort" externalReference: "Kontonummer" input: delimiter: ";" import: onDuplicate: overwrite matchKey: [ustId, zip] defaults: checkEnabled: true