use serde::{Deserialize, Serialize}; use uuid::Uuid; /// Eingabetyp eines Service (früher „Lieferoption"). `Boolean` rendert als /// Checkbox, `Numeric` als Zahlenfeld mit optionalen Grenzen. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "snake_case")] pub enum ServiceKind { Boolean, Numeric, } /// Service-Stammdatensatz — admin-konfigurierbar (Muster wie `PaymentMethod`). /// /// `key` ist der stabile Programm-Identifier (eindeutig), `name` der /// Anzeige-Name. `min_value`/`max_value` sind nur für `Numeric` relevant. /// `active = false` ist Soft-Delete (bleibt für historische Lieferungen /// referenzierbar, fällt aus dem Default-Listing). #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct Service { pub id: Uuid, pub key: String, pub name: String, pub kind: ServiceKind, pub min_value: Option, pub max_value: Option, pub active: bool, pub sort_order: i32, } /// Pro-Lieferung gewählter Wert eines Service. Genau einer der beiden /// Wert-Slots ist je nach `ServiceKind` gesetzt; per `service_id`/`delivery_id` /// clientseitig join-bar (wie Notizen/Gutschriften). #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct DeliveryServiceValue { pub delivery_id: Uuid, pub service_id: Uuid, pub bool_value: Option, pub numeric_value: Option, }