use serde::{Deserialize, Serialize}; use uuid::Uuid; /// 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` = /// Rechnungsadresse, `contact_person` = Ansprechpartner, `customer_master` /// = Stammadresse des Kunden über `Kunden.AdressId`. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "snake_case")] pub enum ContactRole { Header, Delivery, Billing, ContactPerson, CustomerMaster, } /// Art eines Kommunikationskanals. `fax` bewusst nicht mitgeführt — in der /// App nicht verwendet. #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "snake_case")] pub enum ContactKind { Phone, Mobile, Email, Web, } /// 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. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct ContactSource { pub id: Uuid, pub delivery_id: Uuid, pub role: ContactRole, pub anrede: Option, pub titel: Option, pub name1: Option, pub name2: Option, pub name3: Option, pub abteilung: Option, pub funktion: Option, } /// Ein einzelner Kontaktkanal (Telefonnummer / Mobil / E-Mail / Web). /// Mehrere pro [`ContactSource`] möglich, die `position` hält die /// 1-basierte ERP-Reihenfolge (`Telefon` → 1, `Telefon2` → 2 usw.) fest, /// damit der „primäre" Kanal je Art stabil identifizierbar bleibt. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct ContactChannel { pub id: Uuid, pub source_id: Uuid, pub kind: ContactKind, pub position: i16, pub value: String, }