Schnittstellen

kVASy Adressimport aus Tourendaten V2

Einführung

Dieses Dokument richtet sich an technische Anwender und Beratungsmitarbeiter und beschreibt die Konfiguration und Verwendung des kVASy Adressimports aus Tourendaten V2. V2 läuft parallel zur bestehenden V1-Variante. Sie können eine V1-Konfiguration belassen und V2 dort einsetzen, wo die Trennung zwischen Gruben- und Korrespondenzadresse benötigt wird.

Was ist neu gegenüber V1

  • Trennung Gruben-/Korrespondenzadresse: Wenn die Kunden-Adresse (Kunde_*) von der Grubenadresse (DZA_*) abweicht (Strasse, Hausnummer, Zusatzhausnummer, PLZ, Ort), legt V2 zusätzlich eine Korrespondenzadresse an und verknüpft sie über address.correspondence_address_id mit der Grube.
  • Update-Schlüssel ist DZA_InvNr (nicht DZAPK wie in V1) und wird auf address.pit_number abgelegt.
  • Kundennummer als hostsystem_reference auf Gruben- und Korrespondenzadresse — so bleiben beide Datensätze über das Quellsystem identifizierbar.
  • Neue optionale Config Tags:
    • pump_out/client/ident — Client für die Service-Rolle pump_out.
    • drainage/job_type/ident — Job-Typ für die recurring_drainage_definition (Default Abfuhr; viele Bestandskunden setzen Fäkalauftrag).
  • Neuer Zähler unchanged in der Job-Zusammenfassung: Zeilen, die verarbeitet wurden, aber zu keiner Datenänderung geführt haben.
  • Neue Adressspalte „Verwendung" zeigt auf einen Blick, ob ein Datensatz Grube, Korrespondenz oder Rechnung ist (auch in der erweiterten Suche filterbar).

Funktionsumfang

V2 verarbeitet eine CSV-Datei und führt pro Zeile in genau dieser Reihenfolge aus:

  1. Gruben-Upsert anhand DZA_InvNr. Vorhandene Grube → Update bei Abweichung, sonst keine Änderung. Nicht vorhanden → Insert.
  2. Korrespondenz-Upsert (nur wenn nötig, siehe Wann entsteht eine Korrespondenzadresse?). Vorhandene Adresse mit gleicher Kundennummer und pit_number IS NULL wird aktualisiert; sonst neu angelegt.
  3. Verknüpfung der Grube mit der Korrespondenzadresse (address.correspondence_address_id); ist keine Korrespondenz mehr nötig, wird die Verknüpfung entkoppelt (die Adresse bleibt erhalten).
  4. Sekundärdaten nur bei neuen Gruben: Service-Provider (Kläranlage, Abwasserzweckverband, optional Abpumpunternehmen) und eine recurring_drainage_definition werden ausschliesslich für neu angelegte Grubenadressen erzeugt — nie für Updates und nie für Korrespondenzadressen.

Zugriff

Die Import Job Definition für V2 wird beim Setup automatisch angelegt und liegt neben der V1.

Import-Job-Definition Liste mit V1- und V2-Eintrag

So gelangen Sie zur V2-Konfiguration:

  1. Navigieren Sie zu Schnittstellen → Import-Job-Definition.
  2. Wählen Sie den Eintrag „kVASy Adressimport aus Tourenplanung V2".
  3. Direktlink: /interface/import_job_definition/<id> (im obigen Screenshot Id 3).

Fachliche Konfiguration

Die fachliche Konfiguration steuert, welche Stammdaten beim Import an die Grubenadresse angehängt werden. Sie erfolgt ausschliesslich über Configuration Tags (Key/Value-Paare) auf der V2 Import Job Definition.

Bevor Sie speichern, stellen Sie sicher, dass alle referenzierten Idents (Client, Artikel, Job-Typ) tatsächlich in der Datenbank existieren. Ein fehlender Ident bricht den Import mit einer eindeutigen Fehlermeldung ab (siehe Fehler nachverfolgen).

Hinweis: Ein Screenshot der Sektion „Configuration Tags" mit den V2-Werten wird hier ergänzt, sobald config_tags.png im Image-Ordner verfügbar ist.

Erforderliche Config Tags

Config TagWofürBeispiel
sewage_treatment_plant/client/identClient mit der Rolle „Kläranlage" auf neuen GrubenWTAZV
wastewater_association/client/identClient mit der Rolle „Abwasserzweckverband" auf neuen GrubenWTAZV
waste_material_id/identArtikel für recurring_drainage_definition.waste_material_idHaushaltsabwasser

Optionale Config Tags

Config TagWofürDefault / Beispiel
pump_out/client/identNeu in V2 — Client mit der Rolle „Abpumpunternehmen" auf neuen GrubenWTAZV
drainage/job_type/identNeu in V2 — Job-Typ-Ident für die recurring_drainage_definitionDefault: Abfuhr — Bestandskunden setzen häufig Fäkalauftrag
DZA_WHGNR_PREFIXPräfix, der vor den DZA_WHGNR-Wert gestellt wird, wenn der Wert dem Muster aus DZA_WHGNR_REGEX entsprichtDefault: WHG (z. B. 3WHG 3)
DZA_WHGNR_REGEXVollständiger regulärer Ausdruck, der entscheidet, ob der Präfix gesetzt wirdDefault: \d+ (rein numerische Werte). Leer setzen, um den Präfix komplett zu deaktivieren.
verboseErweiterte Debug-Logs im Backend einschaltentrue / false (Default false)

Wohnungsnummer (DZA_WHGNRstreet_ext)

Die optionale Tourenplan-Spalte DZA_WHGNR (Spaltenindex BD) wird auf die Grubenadresse als address.street_ext (Beschriftung „Strasse Zusatz") übernommen. Der Wert wird vor dem Speichern getrimmt; ein leerer Wert lässt einen bereits vorhandenen Datenbankwert unverändert (kein Überschreiben mit Leer).

Verhalten der Präfix-Logik:

  • Trifft der Wert auf DZA_WHGNR_REGEX zu (Standard: rein numerisch), wird DZA_WHGNR_PREFIX mit einem Leerzeichen vorangestellt — z. B. 3WHG 3.
  • Trifft er nicht zu (z. B. EG-links), wird der getrimmte Wert ohne Präfix gespeichert.
  • Ist DZA_WHGNR_REGEX leer, wird der Präfix nie angewandt.

V2 schreibt street_ext ausschliesslich auf die Grubenadresse, nicht auf die Korrespondenzadresse.

Wann entsteht eine Korrespondenzadresse?

Eine Korrespondenzadresse wird genau dann angelegt (oder aktualisiert), wenn mindestens eines der folgenden Felder zwischen Kunden- und Grubenadresse abweicht (Vergleich ist trim/lowercase-tolerant):

  • Kunde_StrasseDZA_Strasse
  • Kunde_HausnummerDZA_Hausnummer
  • Kunde_ZusatzhausnummerDZA_Zusatzhausnummer
  • Kunde_PLZDZA_PLZ
  • Kunde_OrtDZA_Ort

Die Korrespondenzadresse wird über die Kundennummer (in hostsystem_reference) gefunden bzw. aktualisiert. Pro Kundennummer existiert höchstens eine Korrespondenzadresse (deterministische Auswahl der niedrigsten Id, falls historisch mehrere vorliegen).

Stimmen sämtliche Felder bei einem späteren Re-Import wieder überein, bleibt die Korrespondenzadresse als Datensatz erhalten, lediglich die Verknüpfung address.correspondence_address_id der Grube wird auf NULL gesetzt (Zähler correspondence cleared).

Sekundärdaten — Invariante

Service-Provider und recurring_drainage_definition werden ausschliesslich für neu angelegte Grubenadressen erzeugt.

  • Updates an existierenden Gruben legen keine zusätzlichen Service-Provider an und ändern keine bestehende Regelentsorgung.
  • Korrespondenzadressen erhalten niemals Service-Provider oder eine Regelentsorgung.

Dies entspricht dem Verhalten der V1-Variante.

Welche Felder werden immer auf die Grube übertragen?

Unabhängig davon, ob eine Korrespondenzadresse entsteht, werden bei jedem Import folgende Kunden-Felder auf die Grube synchronisiert:

CSV-Feld(er)Adress-Feld der Grube
Kunde_Name1name
Kunde_Name2name2
Kunde_Vorwahl + Kunde_Telefonphone (zusammengesetzt als Vorwahl/Telefon)
Kunde_Telefaxfax
Kunde_eMailemail

Pit-spezifische Felder (DZA_Strasse, DZA_PLZ, DZA_Ort, DZA_Anlagenart, DZA_Nutzinhalt, DZA_Personen, DZA_Wartung_Letzte, DZAPK, DZA_Bauart) werden ebenfalls auf die Grube übernommen.


Technische Konfiguration

Die technische Konfiguration legt fest, wie die CSV-Datei eingelesen wird. Sie ist identisch zu V1 und kann auf der Detailseite der Import Job Definition angepasst werden.

V2 Import-Job-Definition Detailseite — Hauptattribute, File- und Format-Settings

Hauptattribute

AttributWert
NamekVASy Adressimport aus Tourenplanung V2
BeschreibungImport von Adressen aus dem kVASy Tourenplanungssystem mit Aufteilung in Gruben- und Korrespondenzadresse
import_job_typeaddress
import_job_definition_target_typecsv
Dateinamenmuster.*TP.*\.csv
path_to_watchNULL (nur manueller Upload)

Format-Settings

AttributWert
EncodingWindows-1252
Separator;
QuoteNULL (deaktiviert — kVASy-Exporte enthalten unescapte Anführungszeichen)
Localede-DE

CSV-Spalten

Mindestens benötigt:

SpalteVerwendung in V2
DZA_InvNrUpdate-Schlüssel für die Grubenadresse (address.pit_number) — Pflicht; leere Zeilen werden gezählt als ignored
Kundennummerhostsystem_reference für Gruben- und Korrespondenzadresse
Kunde_Name1, Kunde_Name2name, name2 (immer auf Grube übertragen)
Kunde_Vorwahl, Kunde_Telefonphone (als Vorwahl/Telefon zusammengesetzt, immer auf Grube übertragen)
Kunde_Telefax, Kunde_eMailfax, email (immer auf Grube übertragen)
Kunde_Strasse, Kunde_Hausnummer, Kunde_Zusatzhausnummer, Kunde_PLZ, Kunde_Ort, Kunde_LKZKorrespondenzadresse (siehe Wann entsteht eine Korrespondenzadresse?)
DZA_Strasse, DZA_Hausnummer, DZA_Zusatzhausnummerwerden zu street der Grube zusammengesetzt
DZA_WHGNRoptional → street_ext der Grube; Präfix-Verhalten siehe Wohnungsnummer (DZA_WHGNRstreet_ext)
DZA_PLZ, DZA_Ortzip, city der Grube
DZA_Anlagenartwird über type_of_pit/ident aufgelöst → address.type_of_pit_id
DZA_Nutzinhalt, DZA_Personen, DZA_Wartung_Letzte, DZA_Entsorgungsmenge, DZAPK, DZA_Bauartweitere Pit-Attribute
DZA_Wartung_ZyklusEingabe für recurring_drainage_definition.cycle_months (nur bei neuen Gruben verwendet)

Datenkonvertierung

  • Datum: Erwartet dd.MM.yyyy (auch d.M.yyyy; zweistellige Jahre werden als 20yy interpretiert).
  • Dezimal: Komma als Dezimaltrenner (5,55.5).
  • Strasse: DZA_Strasse + " " + DZA_Hausnummer + DZA_Zusatzhausnummer.
  • Telefon: Kunde_Vorwahl + "/" + Kunde_Telefon.
  • Drainage-Zyklus:
    • 1 / J → 12 Monate (einmal pro Jahr)
    • 2 / J → 6 Monate
    • / J → 12 Monate
    • / K → unbekannt (wird ignoriert)
    • reine Zahl → Anzahl Monate

Datei hochladen / Import starten

Der Import kann von zwei Stellen gestartet werden — am komfortabelsten direkt von der Adressliste.

Schritt 1 — Adressliste öffnen

Adressliste mit Import-Dropdown und neuer „Verwendung"-Spalte

Das Dropdown „Importieren" zeigt alle für die Domäne address aktiven Import Job Definitionen — V1 und V2 erscheinen hier nebeneinander. In der Tabelle ist die neue Spalte „Verwendung" sichtbar mit Tags Grube, Korrespondenz und Rechnung.

Schritt 2 — V2 wählen und Datei hochladen

Datei-Importdialog mit V2-Auswahl und Daten-Vorschau-Toggle

Im Dialog „Datei importieren":

  1. Datei auswählen — die Datei muss dem Muster .*TP.*\.csv entsprechen (also „TP" im Dateinamen tragen) und Windows-1252-codiert sein.
  2. Daten-Vorschau (Testlauf) aktivieren, wenn die Datei vor dem produktiven Import nur validiert werden soll. Im Dry-Run werden keine Datensätze geschrieben, es wird lediglich geprüft, ob:
    • die Pflichtspalten vorhanden sind,
    • die referenzierten Stammdaten (Client/Artikel/Job-Typ) auflösbar sind,
    • die Datei syntaktisch lesbar ist.
  3. Importieren klicken.

Schritt 3 — Status verfolgen

Nach dem Klick wird ein Import Job angelegt. Sie finden ihn unter Import-Job-Definition → V2-Detailseite → Tab „Import Jobs". Mögliche Statuswerte:

  • progress — wird gerade verarbeitet,
  • done — abgeschlossen (auch wenn einzelne Zeilen Fehler hatten),
  • failed — Abbruch vor der Zeilenverarbeitung (z. B. wegen fehlender Pflichtspalte oder unauflösbarem Config Tag).

Fehler nachverfolgen

Hinweis: Ein Screenshot des „Import Jobs"-Tabs mit der V2-Zusammenfassung wird hier ergänzt, sobald import_jobs_tab.png im Image-Ordner verfügbar ist.

Wo finde ich was?

Im Tab „Import Jobs" auf der V2-Detailseite stehen pro Lauf:

FeldInhalt
stateprogress / done / failed
msgV2-Zusammenfassung — siehe nächste Tabelle
error_msgTop-Level-Fehler (bei failed)
error_detailsListe pro fehlerhafter Zeile mit row, pit_number, kundennummer, error

Die V2-Zusammenfassung (msg)

Beispiel:

Import V2 completed: 5 pit created, 2 pit updated, 4 correspondence created,
1 correspondence updated, 1 correspondence cleared, 3 unchanged, 1 ignored,
0 failed (total: 12 rows)
ZählerBedeutung
pit createdNeue Grubenadresse angelegt (inkl. Service-Provider und Regelentsorgung)
pit updatedExistierende Grube wegen Attributänderung aktualisiert
correspondence createdNeue Korrespondenzadresse angelegt und mit der Grube verknüpft
correspondence updatedExistierende Korrespondenzadresse aktualisiert
correspondence clearedVerknüpfung der Grube zur Korrespondenz auf NULL gesetzt (Adresse bleibt erhalten)
unchangedZeile verarbeitet, aber keine Änderung an Grube oder Korrespondenz
ignoredZeile übersprungen, weil DZA_InvNr leer war
failedZeile warf eine Exception — Details unter error_details

Invariante: pit created + pit updated + correspondence created + correspondence updated + correspondence cleared + unchanged + ignored + failed = total (jede Zeile fällt in genau einen Bucket; Korrespondenz-Zähler addieren sich zusätzlich, weil eine Zeile sowohl Grube als auch Korrespondenz berühren kann).

Häufige Fehlerbilder

SymptomUrsacheLösung
Required column 'DZA_InvNr' not found in CSVHeader heisst anders / V1-Datei (DZAPK) verwendetHeader korrigieren oder V1-Definition verwenden
Client with ident 'WTAZV' not foundClient fehlt in den StammdatenClient anlegen oder Config Tag korrigieren
Article with ident 'Haushaltsabwasser' not foundArtikel fehltArtikel anlegen oder waste_material_id/ident korrigieren
Job type 'Abfuhr' not found (drainage/job_type/ident)Default-Job-Typ existiert nicht in der InstallationConfig Tag drainage/job_type/ident auf einen vorhandenen Job-Typ setzen (häufig Fäkalauftrag)
0 pit created … X ignored obwohl alle Zeilen DZA_InvNr habenBackend-Runtime nicht neu kompiliert nach Code-ÄnderungRuntime Namespace neu kompilieren (POST /v1/runtime_namespace/<id>/compile) und Import erneut starten
0 pit created, 0 pit updated, … X unchangedIdentischer Re-Import — kein Bug, sondern erwartetBei Änderungserwartung Quelldaten gegen Datenbank-Stand prüfen
Korrespondenzadresse fehlt, obwohl Kunden- und Grubenadresse augenscheinlich abweichenVergleich erfolgt trim/lowercase-tolerant — reine Whitespace- oder Gross-/Klein­schreibungs-Differenzen werden als gleich gewertetQuelldaten prüfen; ggf. tatsächliche Differenz herstellen
Service-Provider werden nicht erstellt, obwohl Config Tag gesetzt istAdresse existierte bereits, V2 erzeugt Service-Provider nur für neue GrubenFalls nachträglich erforderlich: Service-Provider manuell pflegen oder die Adresse vorher löschen lassen

Tiefergehende Diagnose

  • verbose=true als Config Tag setzen und den Import erneut starten — die Backend-Logs enthalten dann pro Zeile detaillierte Informationen zur Auflösung und zum Vergleich.
  • Beim Verdacht auf Datentyp-Probleme (Datum, Dezimal): die betroffenen Spalten in einem Texteditor prüfen — kVASy verwendet dd.MM.yyyy und , als Dezimaltrenner.
  • Cross-Check über die neue Adressliste: Filter „Verwendung = Grube" / „… = Korrespondenz" in der erweiterten Suche, um zu kontrollieren, welche Datensätze tatsächlich angelegt wurden.

Beispiel-Konfiguration & -Resultat

Vollständige Config Tags

sewage_treatment_plant/client/ident=WTAZV
wastewater_association/client/ident=WTAZV
pump_out/client/ident=WTAZV
waste_material_id/ident=Haushaltsabwasser
drainage/job_type/ident=Fäkalauftrag
verbose=false

Beispiel A — Kunde und Grube unterschiedlich

CSV-Zeile (Auszug):

Kundennummer=K001
Kunde_Name1=Mustermann GmbH
Kunde_Strasse=Büroweg
Kunde_Hausnummer=10
Kunde_PLZ=14000
Kunde_Ort=Hauptstadt
Kunde_Vorwahl=030
Kunde_Telefon=1234567
DZA_InvNr=ASG-12345
DZA_Anlagenart=abflusslose Sammelgrube
DZA_Strasse=Hauptstraße
DZA_Hausnummer=42
DZA_PLZ=12345
DZA_Ort=Musterstadt
DZA_Wartung_Zyklus=1 / J

Resultat:

  • Grubenadressepit_number=ASG-12345, hostsystem_reference=K001, name=Mustermann GmbH, street=Hauptstraße 42, phone=030/1234567, correspondence_address_id → Id der unten erzeugten Korrespondenz.
  • Korrespondenzadresse (neu, weil Kunden- ≠ Grubenadresse) — hostsystem_reference=K001, name=Mustermann GmbH, street=Büroweg 10, pit_number IS NULL.
  • Service-Provider auf der Grube: sewage_treatment_plant, wastewater_association, pump_out — alle mit Client WTAZV.
  • Regelentsorgung auf der Grube: cycle_months=12, job_type=Fäkalauftrag, waste_material=Haushaltsabwasser.
  • Zusammenfassung (für 1 Zeile): 1 pit created, 1 correspondence created, 0 unchanged, 0 ignored, 0 failed (total: 1 rows).

Beispiel B — Kunde und Grube identisch

Bei gleicher Kunden- und Grubenadresse (z. B. Eigenheim) entfällt die Korrespondenzadresse:

  • Grubenadresse wird wie oben angelegt.
  • address.correspondence_address_id bleibt NULL.
  • Service-Provider und Regelentsorgung werden ebenfalls erzeugt.
  • Zusammenfassung: 1 pit created, 0 correspondence created, 0 unchanged, 0 ignored, 0 failed (total: 1 rows).

Beispiel C — Re-Import ohne Änderung

Wird die identische Datei nochmals importiert:

  • Zusammenfassung: 0 pit created, 0 pit updated, 0 correspondence created, 0 correspondence updated, 0 correspondence cleared, N unchanged, 0 ignored, 0 failed (total: N rows).
  • Es entstehen keine zusätzlichen Datensätze; vorhandene Service-Provider bleiben unverändert.
Previous
Import Adressen aus kVASy Tourenplanung