bo4e_core/com/
contract_conditions.rs1use serde::{Deserialize, Serialize};
4
5use crate::traits::{Bo4eMeta, Bo4eObject};
6
7#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct ContractConditions {
25 #[serde(flatten)]
27 pub meta: Bo4eMeta,
28
29 #[serde(skip_serializing_if = "Option::is_none")]
31 pub description: Option<String>,
32
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub installment_count: Option<i32>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
41 pub contract_duration: Option<String>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub notice_period: Option<String>,
46
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub extension_period: Option<String>,
50
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub installment_cycle: Option<String>,
54}
55
56impl Bo4eObject for ContractConditions {
57 fn type_name_german() -> &'static str {
58 "Vertragskonditionen"
59 }
60
61 fn type_name_english() -> &'static str {
62 "ContractConditions"
63 }
64
65 fn meta(&self) -> &Bo4eMeta {
66 &self.meta
67 }
68
69 fn meta_mut(&mut self) -> &mut Bo4eMeta {
70 &mut self.meta
71 }
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 #[test]
79 fn test_contract_conditions_default() {
80 let conditions = ContractConditions::default();
81 assert!(conditions.description.is_none());
82 assert!(conditions.installment_count.is_none());
83 }
84
85 #[test]
86 fn test_contract_conditions_serialize() {
87 let conditions = ContractConditions {
88 description: Some("Standard electricity conditions".to_string()),
89 installment_count: Some(12),
90 contract_duration: Some("P12M".to_string()),
91 notice_period: Some("P6W".to_string()),
92 ..Default::default()
93 };
94
95 let json = serde_json::to_string(&conditions).unwrap();
96 assert!(json.contains(r#""description":"Standard electricity conditions""#));
97 assert!(json.contains(r#""installmentCount":12"#));
98 assert!(json.contains(r#""contractDuration":"P12M""#));
99 }
100
101 #[test]
102 fn test_contract_conditions_roundtrip() {
103 let conditions = ContractConditions {
104 meta: Bo4eMeta::with_type("Vertragskonditionen"),
105 description: Some("Premium gas tariff conditions".to_string()),
106 installment_count: Some(6),
107 contract_duration: Some("P24M".to_string()),
108 notice_period: Some("P3M".to_string()),
109 extension_period: Some("P12M".to_string()),
110 installment_cycle: Some("P2M".to_string()),
111 };
112
113 let json = serde_json::to_string(&conditions).unwrap();
114 let parsed: ContractConditions = serde_json::from_str(&json).unwrap();
115 assert_eq!(conditions, parsed);
116 }
117
118 #[test]
119 fn test_bo4e_object_impl() {
120 assert_eq!(
121 ContractConditions::type_name_german(),
122 "Vertragskonditionen"
123 );
124 assert_eq!(
125 ContractConditions::type_name_english(),
126 "ContractConditions"
127 );
128 }
129}