bo4e_core/enums/
surcharge_target.rs

1//! Surcharge target (AufAbschlagsziel) enumeration.
2
3use serde::{Deserialize, Serialize};
4
5/// Target price for surcharge or discount.
6///
7/// The price to which a surcharge or discount applies.
8///
9/// German: AufAbschlagsziel
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
11#[non_exhaustive]
12pub enum SurchargeTarget {
13    /// Working price single tariff (Arbeitspreis Eintarif)
14    #[serde(rename = "ARBEITSPREIS_EINTARIF")]
15    WorkingPriceSingleTariff,
16
17    /// Working price high tariff (Arbeitspreis HT)
18    #[serde(rename = "ARBEITSPREIS_HT")]
19    WorkingPriceHT,
20
21    /// Working price low tariff (Arbeitspreis NT)
22    #[serde(rename = "ARBEITSPREIS_NT")]
23    WorkingPriceNT,
24
25    /// Working price HT and NT combined (Arbeitspreis HT und NT)
26    #[serde(rename = "ARBEITSPREIS_HT_NT")]
27    WorkingPriceHTNT,
28
29    /// Base price (Grundpreis)
30    #[serde(rename = "GRUNDPREIS")]
31    BasePrice,
32
33    /// Total price (Gesamtpreis)
34    #[serde(rename = "GESAMTPREIS")]
35    TotalPrice,
36}
37
38impl SurchargeTarget {
39    /// Returns the German name.
40    pub fn german_name(&self) -> &'static str {
41        match self {
42            Self::WorkingPriceSingleTariff => "Auf-/Abschlag auf den Arbeitspreis Eintarif",
43            Self::WorkingPriceHT => "Auf-/Abschlag auf den Arbeitspreis HT",
44            Self::WorkingPriceNT => "Auf-/Abschlag auf den Arbeitspreis NT",
45            Self::WorkingPriceHTNT => "Auf-/Abschlag auf den Arbeitspreis HT und NT",
46            Self::BasePrice => "Auf-/Abschlag auf den Grundpreis",
47            Self::TotalPrice => "Auf-/Abschlag auf den Gesamtpreis",
48        }
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn test_serialize() {
58        assert_eq!(
59            serde_json::to_string(&SurchargeTarget::BasePrice).unwrap(),
60            r#""GRUNDPREIS""#
61        );
62        assert_eq!(
63            serde_json::to_string(&SurchargeTarget::TotalPrice).unwrap(),
64            r#""GESAMTPREIS""#
65        );
66    }
67
68    #[test]
69    fn test_roundtrip() {
70        for target in [
71            SurchargeTarget::WorkingPriceSingleTariff,
72            SurchargeTarget::WorkingPriceHT,
73            SurchargeTarget::WorkingPriceNT,
74            SurchargeTarget::WorkingPriceHTNT,
75            SurchargeTarget::BasePrice,
76            SurchargeTarget::TotalPrice,
77        ] {
78            let json = serde_json::to_string(&target).unwrap();
79            let parsed: SurchargeTarget = serde_json::from_str(&json).unwrap();
80            assert_eq!(target, parsed);
81        }
82    }
83}