bo4e_core/bo/
business_partner.rs1use serde::{Deserialize, Serialize};
4
5use crate::com::{Address, ContactMethod};
6use crate::enums::BusinessPartnerRole;
7use crate::traits::{Bo4eMeta, Bo4eObject};
8
9#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
26#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
27#[cfg_attr(feature = "json-schema", schemars(rename = "Geschaeftspartner"))]
28#[serde(rename_all = "camelCase")]
29pub struct BusinessPartner {
30 #[serde(flatten)]
32 pub meta: Bo4eMeta,
33
34 #[serde(skip_serializing_if = "Option::is_none", alias = "geschaeftspartnerId")]
36 #[cfg_attr(feature = "json-schema", schemars(rename = "geschaeftspartnerId"))]
37 pub partner_id: Option<String>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 #[cfg_attr(feature = "json-schema", schemars(rename = "name1"))]
42 pub name1: Option<String>,
43
44 #[serde(skip_serializing_if = "Option::is_none")]
46 #[cfg_attr(feature = "json-schema", schemars(rename = "name2"))]
47 pub name2: Option<String>,
48
49 #[serde(skip_serializing_if = "Option::is_none")]
51 #[cfg_attr(feature = "json-schema", schemars(rename = "name3"))]
52 pub name3: Option<String>,
53
54 #[serde(
56 default,
57 skip_serializing_if = "Vec::is_empty",
58 alias = "geschaeftspartnerrollen"
59 )]
60 #[cfg_attr(feature = "json-schema", schemars(rename = "geschaeftspartnerrollen"))]
61 pub roles: Vec<BusinessPartnerRole>,
62
63 #[serde(skip_serializing_if = "Option::is_none", alias = "adresse")]
65 #[cfg_attr(feature = "json-schema", schemars(rename = "adresse"))]
66 pub address: Option<Address>,
67
68 #[serde(default, skip_serializing_if = "Vec::is_empty", alias = "kontaktwege")]
70 #[cfg_attr(feature = "json-schema", schemars(rename = "kontaktwege"))]
71 pub contact_methods: Vec<ContactMethod>,
72
73 #[serde(
75 skip_serializing_if = "Option::is_none",
76 alias = "handelsregisternummer"
77 )]
78 #[cfg_attr(feature = "json-schema", schemars(rename = "handelsregisternummer"))]
79 pub commercial_register_number: Option<String>,
80
81 #[serde(skip_serializing_if = "Option::is_none", alias = "steuernummer")]
83 #[cfg_attr(feature = "json-schema", schemars(rename = "steuernummer"))]
84 pub tax_id: Option<String>,
85
86 #[serde(skip_serializing_if = "Option::is_none", alias = "umsatzsteuerId")]
88 #[cfg_attr(feature = "json-schema", schemars(rename = "umsatzsteuerId"))]
89 pub vat_id: Option<String>,
90}
91
92impl Bo4eObject for BusinessPartner {
93 fn type_name_german() -> &'static str {
94 "Geschaeftspartner"
95 }
96
97 fn type_name_english() -> &'static str {
98 "BusinessPartner"
99 }
100
101 fn meta(&self) -> &Bo4eMeta {
102 &self.meta
103 }
104
105 fn meta_mut(&mut self) -> &mut Bo4eMeta {
106 &mut self.meta
107 }
108}
109
110#[cfg(test)]
111mod tests {
112 use super::*;
113
114 #[test]
115 fn test_supplier_partner() {
116 let partner = BusinessPartner {
117 name1: Some("Stadtwerke Musterstadt GmbH".to_string()),
118 roles: vec![BusinessPartnerRole::Supplier],
119 ..Default::default()
120 };
121
122 assert!(partner.roles.contains(&BusinessPartnerRole::Supplier));
123 }
124
125 #[test]
126 fn test_multiple_roles() {
127 let partner = BusinessPartner {
128 name1: Some("Multi-Utility AG".to_string()),
129 roles: vec![
130 BusinessPartnerRole::Supplier,
131 BusinessPartnerRole::NetworkOperator,
132 ],
133 ..Default::default()
134 };
135
136 assert_eq!(partner.roles.len(), 2);
137 }
138
139 #[test]
140 fn test_serialize() {
141 let partner = BusinessPartner {
142 meta: Bo4eMeta::with_type("Geschaeftspartner"),
143 name1: Some("Test GmbH".to_string()),
144 vat_id: Some("DE123456789".to_string()),
145 ..Default::default()
146 };
147
148 let json = serde_json::to_string(&partner).unwrap();
149 assert!(json.contains(r#""name1":"Test GmbH""#));
150 assert!(json.contains(r#""vatId":"DE123456789""#));
151 }
152
153 #[test]
154 fn test_roundtrip() {
155 let partner = BusinessPartner {
156 meta: Bo4eMeta::with_type("Geschaeftspartner"),
157 partner_id: Some("GP-001".to_string()),
158 name1: Some("Test GmbH".to_string()),
159 name2: Some("Abteilung Energie".to_string()),
160 roles: vec![BusinessPartnerRole::Supplier],
161 vat_id: Some("DE123456789".to_string()),
162 tax_id: Some("12345/67890".to_string()),
163 ..Default::default()
164 };
165
166 let json = serde_json::to_string(&partner).unwrap();
167 let parsed: BusinessPartner = serde_json::from_str(&json).unwrap();
168 assert_eq!(partner, parsed);
169 }
170
171 #[test]
172 fn test_bo4e_object_impl() {
173 assert_eq!(BusinessPartner::type_name_german(), "Geschaeftspartner");
174 assert_eq!(BusinessPartner::type_name_english(), "BusinessPartner");
175 }
176}