feat(sync): Anschrift je Kontaktquelle mitführen

Beleg-, Liefer-, Rechnungsadresse, Ansprechpartner und Kundenstamm tragen
jetzt neben Namensblock und Kanälen auch ihre Anschrift (Straße, Nr., PLZ,
Ort, Land aus dem Länderstamm, Adresszusatz), sofern im ERP gepflegt.
Migration 0035 ergänzt die Spalten an delivery_contact_sources;
ContactSource.address in der API.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-25 16:26:00 +02:00
parent c9d0ccfdef
commit bfdd4d2307
5 changed files with 86 additions and 13 deletions

View File

@ -1,6 +1,8 @@
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::Address;
/// Rolle, mit der ein Kontakt-Datensatz an einer Lieferung hängt. Spiegelt
/// die fünf Adress-FKs von `Belegkopf` (bzw. den Umweg über den Kunden):
/// `header` = Belegadresse, `delivery` = Lieferadresse, `billing` =
@ -30,10 +32,9 @@ pub enum ContactKind {
}
/// Snapshot eines ERP-Adress-Datensatzes, der zum Zeitpunkt des Tour-Syncs
/// an einer Lieferung hing — Namensblock ohne Anschrift, weil die Adresse
/// ihrerseits schon im Lieferungs-Snapshot steckt (`snap_*`-Spalten). Die
/// eigentlichen Telefonnummern, E-Mails etc. liegen in den
/// zugehörigen [`ContactChannel`]s.
/// an einer Lieferung hing — Namensblock plus (falls im ERP gepflegt) die
/// Anschrift dieses Datensatzes. Die eigentlichen Telefonnummern, E-Mails
/// etc. liegen in den zugehörigen [`ContactChannel`]s.
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
#[serde(rename_all = "camelCase")]
@ -48,6 +49,10 @@ pub struct ContactSource {
pub name3: Option<String>,
pub abteilung: Option<String>,
pub funktion: Option<String>,
/// Anschrift dieses Adress-Datensatzes; `None`, wenn im ERP weder
/// Straße noch Ort gepflegt sind (z. B. reiner Ansprechpartner).
#[serde(default)]
pub address: Option<Address>,
}
/// Ein einzelner Kontaktkanal (Telefonnummer / Mobil / E-Mail / Web).