//! Request/Response für `POST /deliveries/{id}/credit` — die //! Betrags-Gutschrift (append-only, idempotent über `client_event_id`). use serde::{Deserialize, Serialize}; use uuid::Uuid; use holzleitner_domain::DeliveryCredit; /// Art des Gutschrift-Ereignisses. #[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "snake_case")] pub enum CreditAction { /// Gutschrift setzen/ändern — `amount_cents` und `reason` Pflicht. Set, /// Gutschrift entfernen — `amount_cents`/`reason` werden ignoriert. Remove, } #[derive(Debug, Clone, Deserialize, Serialize)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct DeliveryCreditEventRequest { /// Idempotenz-Schlüssel — pro erzeugtem Ereignis genau einmal vergeben. /// Ein Retry mit derselben Id wendet nichts erneut an. pub client_event_id: Uuid, pub action: CreditAction, /// Bei `Set` Pflicht: Betrag in Cent (> 0, ≤ 15000, Vielfaches von 1000). #[serde(default)] pub amount_cents: Option, /// Bei `Set` Pflicht: Begründung. #[serde(default)] pub reason: Option, /// Fahrzeug des Akteurs (Audit-Spur). Muss zum Account gehören. #[serde(default)] pub author_car_id: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] #[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))] #[serde(rename_all = "camelCase")] pub struct DeliveryCreditResponse { /// Aktueller Stand nach dem Ereignis — `None`, wenn (zuletzt) entfernt. pub credit: Option, }