bo4e_core/bo/
tariff_price_sheet.rs1use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5
6use crate::com::{TariffPricePosition, TimePeriod};
7use crate::enums::{CustomerType, Division};
8use crate::traits::{Bo4eMeta, Bo4eObject};
9
10#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
28#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
29#[cfg_attr(feature = "json-schema", schemars(rename = "Tarifpreisblatt"))]
30#[serde(rename_all = "camelCase")]
31pub struct TariffPriceSheet {
32 #[serde(flatten)]
34 pub meta: Bo4eMeta,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
38 #[cfg_attr(feature = "json-schema", schemars(rename = "bezeichnung"))]
39 pub designation: Option<String>,
40
41 #[serde(skip_serializing_if = "Option::is_none")]
43 #[cfg_attr(feature = "json-schema", schemars(rename = "beschreibung"))]
44 pub description: Option<String>,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
48 #[cfg_attr(feature = "json-schema", schemars(rename = "sparte"))]
49 pub division: Option<Division>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 #[cfg_attr(feature = "json-schema", schemars(rename = "kundentyp"))]
54 pub customer_type: Option<CustomerType>,
55
56 #[serde(skip_serializing_if = "Option::is_none")]
58 #[cfg_attr(feature = "json-schema", schemars(rename = "preisblattnummer"))]
59 pub price_sheet_number: Option<String>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 #[cfg_attr(feature = "json-schema", schemars(rename = "gueltigkeitszeitraum"))]
64 pub validity_period: Option<TimePeriod>,
65
66 #[serde(skip_serializing_if = "Option::is_none")]
68 #[cfg_attr(feature = "json-schema", schemars(rename = "gueltigAb"))]
69 pub valid_from: Option<DateTime<Utc>>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
73 #[cfg_attr(feature = "json-schema", schemars(rename = "gueltigBis"))]
74 pub valid_until: Option<DateTime<Utc>>,
75
76 #[serde(default, skip_serializing_if = "Vec::is_empty")]
78 #[cfg_attr(feature = "json-schema", schemars(rename = "tarifpreispositionen"))]
79 pub positions: Vec<TariffPricePosition>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 #[cfg_attr(feature = "json-schema", schemars(rename = "herausgeber"))]
84 pub publisher: Option<Box<super::BusinessPartner>>,
85}
86
87impl Bo4eObject for TariffPriceSheet {
88 fn type_name_german() -> &'static str {
89 "Tarifpreisblatt"
90 }
91
92 fn type_name_english() -> &'static str {
93 "TariffPriceSheet"
94 }
95
96 fn meta(&self) -> &Bo4eMeta {
97 &self.meta
98 }
99
100 fn meta_mut(&mut self) -> &mut Bo4eMeta {
101 &mut self.meta
102 }
103}
104
105#[cfg(test)]
106mod tests {
107 use super::*;
108
109 #[test]
110 fn test_tariff_price_sheet_creation() {
111 let price_sheet = TariffPriceSheet {
112 designation: Some("Haushaltstarif Preisblatt 2024".to_string()),
113 division: Some(Division::Electricity),
114 customer_type: Some(CustomerType::Household),
115 price_sheet_number: Some("TPB-2024-001".to_string()),
116 ..Default::default()
117 };
118
119 assert_eq!(price_sheet.customer_type, Some(CustomerType::Household));
120 }
121
122 #[test]
123 fn test_serialize() {
124 let price_sheet = TariffPriceSheet {
125 meta: Bo4eMeta::with_type("Tarifpreisblatt"),
126 designation: Some("Test Tariff Sheet".to_string()),
127 ..Default::default()
128 };
129
130 let json = serde_json::to_string(&price_sheet).unwrap();
131 assert!(json.contains(r#""designation":"Test Tariff Sheet""#));
132 assert!(json.contains(r#""_typ":"Tarifpreisblatt""#));
133 }
134
135 #[test]
136 fn test_roundtrip() {
137 let price_sheet = TariffPriceSheet {
138 meta: Bo4eMeta::with_type("Tarifpreisblatt"),
139 designation: Some("Gas Tariff Sheet".to_string()),
140 division: Some(Division::Gas),
141 customer_type: Some(CustomerType::Commercial),
142 price_sheet_number: Some("GAS-2024".to_string()),
143 ..Default::default()
144 };
145
146 let json = serde_json::to_string(&price_sheet).unwrap();
147 let parsed: TariffPriceSheet = serde_json::from_str(&json).unwrap();
148 assert_eq!(price_sheet, parsed);
149 }
150
151 #[test]
152 fn test_bo4e_object_impl() {
153 assert_eq!(TariffPriceSheet::type_name_german(), "Tarifpreisblatt");
154 assert_eq!(TariffPriceSheet::type_name_english(), "TariffPriceSheet");
155 }
156}