diff --git a/src/fa_3/mod.rs b/src/fa_3/mod.rs index ea2a090..84cf545 100644 --- a/src/fa_3/mod.rs +++ b/src/fa_3/mod.rs @@ -3,3 +3,5 @@ pub mod models; #[cfg(test)] mod tests; + +pub mod rounding_tests; diff --git a/src/fa_3/models.rs b/src/fa_3/models.rs index 947170f..aef6147 100644 --- a/src/fa_3/models.rs +++ b/src/fa_3/models.rs @@ -3,6 +3,7 @@ use crate::shared::models::{ TRolaPodmiotuUpowaznionego, TStatusInfoPodatnika, TaxRate, }; use rust_decimal::Decimal; +use rust_decimal::RoundingStrategy; use rust_decimal::prelude::ToPrimitive; use serde::{Deserialize, Serialize}; @@ -87,6 +88,7 @@ impl Invoice { let mut net_13_6_1 = Decimal::ZERO; // 0 domestic let mut net_13_6_2 = Decimal::ZERO; // 0 intra let mut net_13_6_3 = Decimal::ZERO; // 0 export + let mut net_13_9 = Decimal::ZERO; // oo // Ensure invoice lines have sequential positive line numbers required by TNaturalny (MinExclusive > 0) for (idx, line) in inv.invoice_body.lines.iter_mut().enumerate() { @@ -100,7 +102,10 @@ impl Invoice { let vat = if let Some(rate) = &line.tax_rate { let net_cents = (net * Decimal::new(100, 0)) - .round_dp(0) + .round_dp_with_strategy( + 0, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + ) .to_i128() .unwrap_or(0); let vat_cents = (net_cents * rate.basis_points() as i128) / 10000; @@ -143,7 +148,10 @@ impl Invoice { TaxRate::ZeroEX => { net_13_6_3 += net; } - TaxRate::Zw | TaxRate::Oo | TaxRate::NpI | TaxRate::NpII => { + TaxRate::Oo => { + net_13_9 += net; + } + TaxRate::Zw | TaxRate::NpI | TaxRate::NpII => { net_13_1 += net; tax_14_1 += vat; } @@ -161,78 +169,140 @@ impl Invoice { } } - inv.invoice_body.net_total_basic_rate = if net_13_1 != Decimal::ZERO { - Some(net_13_1.round_dp(2)) - } else { - None - }; - inv.invoice_body.tax_total_basic_rate = if tax_14_1 != Decimal::ZERO { - Some(tax_14_1.round_dp(2)) - } else { - None - }; - - inv.invoice_body.net_total_reduced_rate_1 = if net_13_2 != Decimal::ZERO { - Some(net_13_2.round_dp(2)) - } else { - None - }; - inv.invoice_body.tax_total_reduced_rate_1 = if tax_14_2 != Decimal::ZERO { - Some(tax_14_2.round_dp(2)) - } else { - None - }; - - inv.invoice_body.net_total_reduced_rate_2 = if net_13_3 != Decimal::ZERO { - Some(net_13_3.round_dp(2)) - } else { - None - }; - inv.invoice_body.tax_total_reduced_rate_2 = if tax_14_3 != Decimal::ZERO { - Some(tax_14_3.round_dp(2)) - } else { - None - }; - - inv.invoice_body.net_total_taxi = if net_13_4 != Decimal::ZERO { - Some(net_13_4.round_dp(2)) - } else { - None - }; - inv.invoice_body.tax_total_taxi = if tax_14_4 != Decimal::ZERO { - Some(tax_14_4.round_dp(2)) - } else { - None - }; - - inv.invoice_body.net_total_special = if net_13_5 != Decimal::ZERO { - Some(net_13_5.round_dp(2)) - } else { - None - }; - inv.invoice_body.tax_total_special = if tax_14_5 != Decimal::ZERO { - Some(tax_14_5.round_dp(2)) - } else { - None - }; - - inv.invoice_body.net_total_0_domestic = if net_13_6_1 != Decimal::ZERO { - Some(net_13_6_1.round_dp(2)) - } else { - None - }; - inv.invoice_body.net_total_0_intra = if net_13_6_2 != Decimal::ZERO { - Some(net_13_6_2.round_dp(2)) - } else { - None - }; - inv.invoice_body.net_total_0_export = if net_13_6_3 != Decimal::ZERO { - Some(net_13_6_3.round_dp(2)) - } else { - None - }; - - inv.invoice_body.total_amount = total.round_dp(2); + inv.invoice_body.net_total_basic_rate = + if net_13_1 != Decimal::ZERO { + Some(net_13_1.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.tax_total_basic_rate = + if tax_14_1 != Decimal::ZERO { + Some(tax_14_1.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + + inv.invoice_body.net_total_reduced_rate_1 = + if net_13_2 != Decimal::ZERO { + Some(net_13_2.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.tax_total_reduced_rate_1 = + if tax_14_2 != Decimal::ZERO { + Some(tax_14_2.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + + inv.invoice_body.net_total_reduced_rate_2 = + if net_13_3 != Decimal::ZERO { + Some(net_13_3.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.tax_total_reduced_rate_2 = + if tax_14_3 != Decimal::ZERO { + Some(tax_14_3.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + + inv.invoice_body.net_total_taxi = + if net_13_4 != Decimal::ZERO { + Some(net_13_4.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.tax_total_taxi = + if tax_14_4 != Decimal::ZERO { + Some(tax_14_4.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + + inv.invoice_body.net_total_special = + if net_13_5 != Decimal::ZERO { + Some(net_13_5.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.tax_total_special = + if tax_14_5 != Decimal::ZERO { + Some(tax_14_5.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + + inv.invoice_body.net_total_0_domestic = + if net_13_6_1 != Decimal::ZERO { + Some(net_13_6_1.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.net_total_0_intra = + if net_13_6_2 != Decimal::ZERO { + Some(net_13_6_2.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.net_total_0_export = + if net_13_6_3 != Decimal::ZERO { + Some(net_13_6_3.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + + inv.invoice_body.net_total_oo = + if net_13_9 != Decimal::ZERO { + Some(net_13_9.round_dp_with_strategy( + 2, + rust_decimal::RoundingStrategy::MidpointAwayFromZero, + )) + } else { + None + }; + inv.invoice_body.total_amount = + total.round_dp_with_strategy(2, rust_decimal::RoundingStrategy::MidpointAwayFromZero); if inv.invoice_body.invoice_type.is_none() { inv.invoice_body.invoice_type = Some("VAT".to_string()); @@ -293,7 +363,8 @@ impl Invoice { let mut buffer = String::new(); let serializer = quick_xml::se::Serializer::new(&mut buffer); - inv.serialize(serializer).map_err(|e| Box::new(e) as Box)?; + inv.serialize(serializer) + .map_err(|e| Box::new(e) as Box)?; let xml_decl = "\n"; let result = format!("{}{}", xml_decl, buffer); Ok(result) @@ -557,6 +628,9 @@ pub struct InvoiceBody { #[serde(rename = "P_13_6_3")] #[serde(skip_serializing_if = "Option::is_none")] pub net_total_0_export: Option, + #[serde(rename = "P_13_9")] + #[serde(skip_serializing_if = "Option::is_none")] + pub net_total_oo: Option, #[serde(rename = "P_15")] pub total_amount: Decimal, #[serde(rename = "Adnotacje")] @@ -608,6 +682,7 @@ impl Default for InvoiceBody { net_total_0_domestic: None, net_total_0_intra: None, net_total_0_export: None, + net_total_oo: None, total_amount: Decimal::ZERO, invoice_type: None, annotations: Annotations::default(), diff --git a/src/fa_3/rounding_tests.rs b/src/fa_3/rounding_tests.rs new file mode 100644 index 0000000..9d23536 --- /dev/null +++ b/src/fa_3/rounding_tests.rs @@ -0,0 +1,26 @@ +#[cfg(test)] +mod rounding_tests { + use rust_decimal::Decimal; + use rust_decimal::RoundingStrategy; + use std::str::FromStr; + + #[test] + fn test_midpoint_away_from_zero_2dp() { + let a = Decimal::from_str("1.005").unwrap(); + assert_eq!( + a.round_dp_with_strategy(2, RoundingStrategy::MidpointAwayFromZero) + .to_string(), + "1.01" + ); + } + + #[test] + fn test_midpoint_away_from_zero_zero_dp() { + let a = Decimal::from_str("2.5").unwrap(); + assert_eq!( + a.round_dp_with_strategy(0, RoundingStrategy::MidpointAwayFromZero) + .to_string(), + "3" + ); + } +} diff --git a/src/fa_rr/builder.rs b/src/fa_rr/builder.rs index 8de2161..e0e87ef 100644 --- a/src/fa_rr/builder.rs +++ b/src/fa_rr/builder.rs @@ -1,7 +1,7 @@ -use super::models::{InvoiceRR, Header, Subject1, Subject2, Footer}; -use rust_decimal::Decimal; -use chrono::NaiveDate; +use super::models::{Footer, Header, InvoiceRR, Subject1, Subject2}; use crate::shared::models::{Address, ContactData, CurrencyCode, IdentificationData}; +use chrono::NaiveDate; +use rust_decimal::Decimal; pub struct InvoiceRRBuilder { invoice: InvoiceRR, @@ -123,7 +123,9 @@ impl Subject1Builder { pub fn build(self) -> Subject1 { Subject1 { - identification_data: self.identification_data.expect("IdentificationData is required for Subject1"), + identification_data: self + .identification_data + .expect("IdentificationData is required for Subject1"), address: self.address.expect("Address is required for Subject1"), correspondence_address: self.correspondence_address, contact_data: self.contact_data, @@ -165,7 +167,9 @@ impl Subject2Builder { pub fn build(self) -> Subject2 { Subject2 { - identification_data: self.identification_data.expect("IdentificationData is required for Subject2"), + identification_data: self + .identification_data + .expect("IdentificationData is required for Subject2"), address: self.address.expect("Address is required for Subject2"), correspondence_address: self.correspondence_address, contact_data: self.contact_data, @@ -212,10 +216,13 @@ impl AddressBuilder { pub fn build(self) -> Address { Address { - country_code: self.country_code + country_code: self + .country_code .map(crate::shared::models::CountryCode::new) .expect("Country code is required for Address"), - address_line_1: self.address_line_1.expect("Address line 1 is required for Address"), + address_line_1: self + .address_line_1 + .expect("Address line 1 is required for Address"), address_line_2: self.address_line_2, gln: self.gln, } @@ -239,7 +246,11 @@ impl FooterBuilder { pub fn build(self) -> Footer { use super::models::{Footer, FooterInfo}; Footer { - informacje: self.footer_text.map(|txt| vec![FooterInfo { footer_text: Some(txt) }]), + informacje: self.footer_text.map(|txt| { + vec![FooterInfo { + footer_text: Some(txt), + }] + }), } } } diff --git a/src/fa_rr/mod.rs b/src/fa_rr/mod.rs index 6a9d23e..44247e7 100644 --- a/src/fa_rr/mod.rs +++ b/src/fa_rr/mod.rs @@ -1,3 +1,3 @@ -pub mod models; pub mod builder; +pub mod models; pub mod tests; diff --git a/src/fa_rr/models.rs b/src/fa_rr/models.rs index ab4b986..c1858df 100644 --- a/src/fa_rr/models.rs +++ b/src/fa_rr/models.rs @@ -1,7 +1,7 @@ +use crate::shared::models::{Address, ContactData, CurrencyCode, IdentificationData}; +use chrono::Local; use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; -use chrono::Local; -use crate::shared::models::{Address, ContactData, CurrencyCode, IdentificationData}; #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename = "Faktura")] diff --git a/src/fa_rr/tests.rs b/src/fa_rr/tests.rs index b0811ca..58bb143 100644 --- a/src/fa_rr/tests.rs +++ b/src/fa_rr/tests.rs @@ -36,33 +36,33 @@ fn pretty_print_xml(xml: &str) -> Result> { #[test] fn test_generate_invoice_rr_basic() { - use super::builder::{Subject1Builder, Subject2Builder, AddressBuilder, FooterBuilder}; + use super::builder::{AddressBuilder, FooterBuilder, Subject1Builder, Subject2Builder}; use crate::shared::models::IdentificationData; let subject1 = Subject1Builder::new(IdentificationData { - nip: "5261234567".to_string(), - name: "Rolnik Jan Kowalski".to_string(), - }) - .set_address( - AddressBuilder::new() - .set_country_code("PL") - .set_address_line_1("Wiejska 1") - .set_line2("Gospodarstwo 2") - .build(), - ) - .build(); + nip: "5261234567".to_string(), + name: "Rolnik Jan Kowalski".to_string(), + }) + .set_address( + AddressBuilder::new() + .set_country_code("PL") + .set_address_line_1("Wiejska 1") + .set_line2("Gospodarstwo 2") + .build(), + ) + .build(); let subject2 = Subject2Builder::new(IdentificationData { - nip: "9876543210".to_string(), - name: "Firma Skupująca Sp. z o.o.".to_string(), - }) - .set_address( - AddressBuilder::new() - .set_country_code("PL") - .set_address_line_1("Przemysłowa 5") - .build(), - ) - .build(); + nip: "9876543210".to_string(), + name: "Firma Skupująca Sp. z o.o.".to_string(), + }) + .set_address( + AddressBuilder::new() + .set_country_code("PL") + .set_address_line_1("Przemysłowa 5") + .build(), + ) + .build(); let footer = FooterBuilder::new() .set_footer_text("Dziękujemy za współpracę.") @@ -88,9 +88,18 @@ fn test_generate_invoice_rr_basic() { assert_eq!(invoice.invoice_body.currency_code, CurrencyCode::new("PLN")); assert_eq!(invoice.invoice_body.issue_date, "2023-10-25"); assert_eq!(invoice.invoice_body.invoice_number, "RR/2023/10/001"); - assert_eq!(invoice.invoice_body.net_value, Decimal::from_str("1000.00").unwrap()); - assert_eq!(invoice.invoice_body.tax_value, Decimal::from_str("65.00").unwrap()); - assert_eq!(invoice.invoice_body.total_value, Decimal::from_str("1065.00").unwrap()); + assert_eq!( + invoice.invoice_body.net_value, + Decimal::from_str("1000.00").unwrap() + ); + assert_eq!( + invoice.invoice_body.tax_value, + Decimal::from_str("65.00").unwrap() + ); + assert_eq!( + invoice.invoice_body.total_value, + Decimal::from_str("1065.00").unwrap() + ); let xml_result = invoice.to_xml(); assert!(xml_result.is_ok(), "XML generation failed"); @@ -114,39 +123,39 @@ fn test_generate_invoice_rr_basic() { #[test] fn test_generate_invoice_rr_with_correspondence_address() { - use super::builder::{Subject1Builder, Subject2Builder, AddressBuilder}; + use super::builder::{AddressBuilder, Subject1Builder, Subject2Builder}; use crate::shared::models::IdentificationData; let subject1 = Subject1Builder::new(IdentificationData { - nip: "5261234567".to_string(), - name: "Rolnik Jan Kowalski".to_string(), - }) - .set_address( - AddressBuilder::new() - .set_country_code("PL") - .set_address_line_1("Wiejska 1") - .set_line2("Gospodarstwo 2") - .build(), - ) - .set_correspondence_address( - AddressBuilder::new() - .set_country_code("PL") - .set_address_line_1("Pocztowa 3") - .build(), - ) - .build(); + nip: "5261234567".to_string(), + name: "Rolnik Jan Kowalski".to_string(), + }) + .set_address( + AddressBuilder::new() + .set_country_code("PL") + .set_address_line_1("Wiejska 1") + .set_line2("Gospodarstwo 2") + .build(), + ) + .set_correspondence_address( + AddressBuilder::new() + .set_country_code("PL") + .set_address_line_1("Pocztowa 3") + .build(), + ) + .build(); let subject2 = Subject2Builder::new(IdentificationData { - nip: "9876543210".to_string(), - name: "Firma Skupująca Sp. z o.o.".to_string(), - }) - .set_address( - AddressBuilder::new() - .set_country_code("PL") - .set_address_line_1("Przemysłowa 5") - .build(), - ) - .build(); + nip: "9876543210".to_string(), + name: "Firma Skupująca Sp. z o.o.".to_string(), + }) + .set_address( + AddressBuilder::new() + .set_country_code("PL") + .set_address_line_1("Przemysłowa 5") + .build(), + ) + .build(); let builder = InvoiceRRBuilder::new() .set_subject1(subject1) @@ -166,9 +175,18 @@ fn test_generate_invoice_rr_with_correspondence_address() { assert_eq!(invoice.invoice_body.currency_code, CurrencyCode::new("EUR")); assert_eq!(invoice.invoice_body.issue_date, "2023-11-01"); assert_eq!(invoice.invoice_body.invoice_number, "RR/2023/11/002"); - assert_eq!(invoice.invoice_body.net_value, Decimal::from_str("2000.00").unwrap()); - assert_eq!(invoice.invoice_body.tax_value, Decimal::from_str("130.00").unwrap()); - assert_eq!(invoice.invoice_body.total_value, Decimal::from_str("2130.00").unwrap()); + assert_eq!( + invoice.invoice_body.net_value, + Decimal::from_str("2000.00").unwrap() + ); + assert_eq!( + invoice.invoice_body.tax_value, + Decimal::from_str("130.00").unwrap() + ); + assert_eq!( + invoice.invoice_body.total_value, + Decimal::from_str("2130.00").unwrap() + ); let xml_result = invoice.to_xml(); assert!(xml_result.is_ok(), "XML generation failed"); @@ -187,4 +205,4 @@ fn test_generate_invoice_rr_with_correspondence_address() { assert!(xml.contains("130.00")); assert!(xml.contains("2130.00")); assert!(xml.contains("kodSystemowy=\"FA_RR (1)\"")); - } +} diff --git a/src/lib.rs b/src/lib.rs index 99432d9..d489709 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ pub mod fa_2; pub mod fa_3; -pub mod pef_3; pub mod fa_rr; +pub mod pef_3; pub mod shared; diff --git a/src/pef_3/builder.rs b/src/pef_3/builder.rs index 0421a6a..3006478 100644 --- a/src/pef_3/builder.rs +++ b/src/pef_3/builder.rs @@ -99,8 +99,12 @@ impl InvoiceBuilder { additional_document_reference: None, project_reference: None, signature: None, - accounting_supplier_party: Some(PartyWrapper { party: accounting_supplier_party }), - accounting_customer_party: Some(PartyWrapper { party: accounting_customer_party }), + accounting_supplier_party: Some(PartyWrapper { + party: accounting_supplier_party, + }), + accounting_customer_party: Some(PartyWrapper { + party: accounting_customer_party, + }), payee_party: None, buyer_customer_party: None, seller_supplier_party: None, @@ -138,11 +142,27 @@ impl InvoiceBuilder { builder_setter!(due_date, due_date, impl Into); builder_setter!(invoice_type_code, invoice_type_code, impl Into); builder_setter!(tax_point_date, tax_point_date, impl Into); - builder_setter!(document_currency_code, document_currency_code, impl Into); + builder_setter!( + document_currency_code, + document_currency_code, + impl Into + ); builder_setter!(tax_currency_code, tax_currency_code, impl Into); - builder_setter!(pricing_currency_code, pricing_currency_code, impl Into); - builder_setter!(payment_currency_code, payment_currency_code, impl Into); - builder_setter!(payment_alternative_currency_code, payment_alternative_currency_code, impl Into); + builder_setter!( + pricing_currency_code, + pricing_currency_code, + impl Into + ); + builder_setter!( + payment_currency_code, + payment_currency_code, + impl Into + ); + builder_setter!( + payment_alternative_currency_code, + payment_alternative_currency_code, + impl Into + ); builder_setter!( accounting_cost_code, accounting_cost_code, diff --git a/src/pef_3/mod.rs b/src/pef_3/mod.rs index 74e5f04..5d4f815 100644 --- a/src/pef_3/mod.rs +++ b/src/pef_3/mod.rs @@ -1,9 +1,9 @@ pub mod builder; +pub mod models; #[cfg(test)] mod tests_rules; -pub mod models; pub mod commontypes; +pub mod isotypes; #[cfg(test)] mod tests; -pub mod isotypes; diff --git a/src/pef_3/models.rs b/src/pef_3/models.rs index 63dc89d..92fd2f9 100644 --- a/src/pef_3/models.rs +++ b/src/pef_3/models.rs @@ -12,23 +12,37 @@ pub struct Invoice { #[serde(rename = "@xmlns:ext")] pub xmlns_ext: Option, - #[serde(rename = "ext:UBLExtensions", alias = "UBLExtensions", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "ext:UBLExtensions", + alias = "UBLExtensions", + skip_serializing_if = "Option::is_none" + )] pub ubl_extensions: Option, - #[serde(rename = "cbc:UBLVersionID", alias = "UBLVersionID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:UBLVersionID", + alias = "UBLVersionID", + skip_serializing_if = "Option::is_none" + )] pub ubl_version_id: Option, #[serde( - rename = "cbc:CustomizationID", alias = "CustomizationID", + rename = "cbc:CustomizationID", + alias = "CustomizationID", skip_serializing_if = "Option::is_none" )] pub customization_id: Option, - #[serde(rename = "cbc:ProfileID", alias = "ProfileID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ProfileID", + alias = "ProfileID", + skip_serializing_if = "Option::is_none" + )] pub profile_id: Option, #[serde( - rename = "cbc:ProfileExecutionID", alias = "ProfileExecutionID", + rename = "cbc:ProfileExecutionID", + alias = "ProfileExecutionID", skip_serializing_if = "Option::is_none" )] pub profile_execution_id: Option, @@ -36,215 +50,318 @@ pub struct Invoice { #[serde(rename = "cbc:ID", alias = "ID")] pub id: Option, - #[serde(rename = "cbc:CopyIndicator", alias = "CopyIndicator", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:CopyIndicator", + alias = "CopyIndicator", + skip_serializing_if = "Option::is_none" + )] pub copy_indicator: Option, - #[serde(rename = "cbc:UUID", alias = "UUID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:UUID", + alias = "UUID", + skip_serializing_if = "Option::is_none" + )] pub uuid: Option, #[serde(rename = "cbc:IssueDate", alias = "IssueDate")] pub issue_date: Option, - #[serde(rename = "cbc:IssueTime", alias = "IssueTime", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:IssueTime", + alias = "IssueTime", + skip_serializing_if = "Option::is_none" + )] pub issue_time: Option, - #[serde(rename = "cbc:DueDate", alias = "DueDate", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:DueDate", + alias = "DueDate", + skip_serializing_if = "Option::is_none" + )] pub due_date: Option, #[serde( - rename = "cbc:InvoiceTypeCode", alias = "InvoiceTypeCode", + rename = "cbc:InvoiceTypeCode", + alias = "InvoiceTypeCode", skip_serializing_if = "Option::is_none" )] pub invoice_type_code: Option, - #[serde(rename = "cbc:Note", alias = "Note", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Note", + alias = "Note", + skip_serializing_if = "Option::is_none" + )] pub note: Option>, - #[serde(rename = "cbc:TaxPointDate", alias = "TaxPointDate", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:TaxPointDate", + alias = "TaxPointDate", + skip_serializing_if = "Option::is_none" + )] pub tax_point_date: Option, #[serde( - rename = "cbc:DocumentCurrencyCode", alias = "DocumentCurrencyCode", + rename = "cbc:DocumentCurrencyCode", + alias = "DocumentCurrencyCode", skip_serializing_if = "Option::is_none" )] pub document_currency_code: Option, #[serde( - rename = "cbc:TaxCurrencyCode", alias = "TaxCurrencyCode", + rename = "cbc:TaxCurrencyCode", + alias = "TaxCurrencyCode", skip_serializing_if = "Option::is_none" )] pub tax_currency_code: Option, #[serde( - rename = "cbc:PricingCurrencyCode", alias = "PricingCurrencyCode", + rename = "cbc:PricingCurrencyCode", + alias = "PricingCurrencyCode", skip_serializing_if = "Option::is_none" )] pub pricing_currency_code: Option, #[serde( - rename = "cbc:PaymentCurrencyCode", alias = "PaymentCurrencyCode", + rename = "cbc:PaymentCurrencyCode", + alias = "PaymentCurrencyCode", skip_serializing_if = "Option::is_none" )] pub payment_currency_code: Option, #[serde( - rename = "cbc:PaymentAlternativeCurrencyCode", alias = "PaymentAlternativeCurrencyCode", + rename = "cbc:PaymentAlternativeCurrencyCode", + alias = "PaymentAlternativeCurrencyCode", skip_serializing_if = "Option::is_none" )] pub payment_alternative_currency_code: Option, #[serde( - rename = "cbc:AccountingCostCode", alias = "AccountingCostCode", + rename = "cbc:AccountingCostCode", + alias = "AccountingCostCode", skip_serializing_if = "Option::is_none" )] pub accounting_cost_code: Option, - #[serde(rename = "cbc:AccountingCost", alias = "AccountingCost", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:AccountingCost", + alias = "AccountingCost", + skip_serializing_if = "Option::is_none" + )] pub accounting_cost: Option, #[serde( - rename = "cbc:LineCountNumeric", alias = "LineCountNumeric", + rename = "cbc:LineCountNumeric", + alias = "LineCountNumeric", skip_serializing_if = "Option::is_none" )] pub line_count_numeric: Option, - #[serde(rename = "cbc:BuyerReference", alias = "BuyerReference", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:BuyerReference", + alias = "BuyerReference", + skip_serializing_if = "Option::is_none" + )] pub buyer_reference: Option, - #[serde(rename = "cac:InvoicePeriod", alias = "InvoicePeriod", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:InvoicePeriod", + alias = "InvoicePeriod", + skip_serializing_if = "Option::is_none" + )] pub invoice_period: Option>, - #[serde(rename = "cac:OrderReference", alias = "OrderReference", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:OrderReference", + alias = "OrderReference", + skip_serializing_if = "Option::is_none" + )] pub order_reference: Option, #[serde( - rename = "cac:BillingReference", alias = "BillingReference", + rename = "cac:BillingReference", + alias = "BillingReference", skip_serializing_if = "Option::is_none" )] pub billing_reference: Option>, #[serde( - rename = "cac:DespatchDocumentReference", alias = "DespatchDocumentReference", + rename = "cac:DespatchDocumentReference", + alias = "DespatchDocumentReference", skip_serializing_if = "Option::is_none" )] pub despatch_document_reference: Option>, #[serde( - rename = "cac:ReceiptDocumentReference", alias = "ReceiptDocumentReference", + rename = "cac:ReceiptDocumentReference", + alias = "ReceiptDocumentReference", skip_serializing_if = "Option::is_none" )] pub receipt_document_reference: Option>, #[serde( - rename = "cac:StatementDocumentReference", alias = "StatementDocumentReference", + rename = "cac:StatementDocumentReference", + alias = "StatementDocumentReference", skip_serializing_if = "Option::is_none" )] pub statement_document_reference: Option>, #[serde( - rename = "cac:OriginatorDocumentReference", alias = "OriginatorDocumentReference", + rename = "cac:OriginatorDocumentReference", + alias = "OriginatorDocumentReference", skip_serializing_if = "Option::is_none" )] pub originator_document_reference: Option>, #[serde( - rename = "cac:ContractDocumentReference", alias = "ContractDocumentReference", + rename = "cac:ContractDocumentReference", + alias = "ContractDocumentReference", skip_serializing_if = "Option::is_none" )] pub contract_document_reference: Option>, #[serde( - rename = "cac:AdditionalDocumentReference", alias = "AdditionalDocumentReference", + rename = "cac:AdditionalDocumentReference", + alias = "AdditionalDocumentReference", skip_serializing_if = "Option::is_none" )] pub additional_document_reference: Option>, #[serde( - rename = "cac:ProjectReference", alias = "ProjectReference", + rename = "cac:ProjectReference", + alias = "ProjectReference", skip_serializing_if = "Option::is_none" )] pub project_reference: Option>, - #[serde(rename = "cac:Signature", alias = "Signature", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:Signature", + alias = "Signature", + skip_serializing_if = "Option::is_none" + )] pub signature: Option>, - #[serde(rename = "cac:AccountingSupplierParty", alias = "AccountingSupplierParty")] + #[serde( + rename = "cac:AccountingSupplierParty", + alias = "AccountingSupplierParty" + )] pub accounting_supplier_party: Option, - #[serde(rename = "cac:AccountingCustomerParty", alias = "AccountingCustomerParty")] + #[serde( + rename = "cac:AccountingCustomerParty", + alias = "AccountingCustomerParty" + )] pub accounting_customer_party: Option, - #[serde(rename = "cac:PayeeParty", alias = "PayeeParty", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PayeeParty", + alias = "PayeeParty", + skip_serializing_if = "Option::is_none" + )] pub payee_party: Option, #[serde( - rename = "cac:BuyerCustomerParty", alias = "BuyerCustomerParty", + rename = "cac:BuyerCustomerParty", + alias = "BuyerCustomerParty", skip_serializing_if = "Option::is_none" )] pub buyer_customer_party: Option, #[serde( - rename = "cac:SellerSupplierParty", alias = "SellerSupplierParty", + rename = "cac:SellerSupplierParty", + alias = "SellerSupplierParty", skip_serializing_if = "Option::is_none" )] pub seller_supplier_party: Option, #[serde( - rename = "cac:TaxRepresentativeParty", alias = "TaxRepresentativeParty", + rename = "cac:TaxRepresentativeParty", + alias = "TaxRepresentativeParty", skip_serializing_if = "Option::is_none" )] pub tax_representative_party: Option, - #[serde(rename = "cac:Delivery", alias = "Delivery", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:Delivery", + alias = "Delivery", + skip_serializing_if = "Option::is_none" + )] pub delivery: Option>, - #[serde(rename = "cac:DeliveryTerms", alias = "DeliveryTerms", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:DeliveryTerms", + alias = "DeliveryTerms", + skip_serializing_if = "Option::is_none" + )] pub delivery_terms: Option, - #[serde(rename = "cac:PaymentMeans", alias = "PaymentMeans", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PaymentMeans", + alias = "PaymentMeans", + skip_serializing_if = "Option::is_none" + )] pub payment_means: Option>, - #[serde(rename = "cac:PaymentTerms", alias = "PaymentTerms", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PaymentTerms", + alias = "PaymentTerms", + skip_serializing_if = "Option::is_none" + )] pub payment_terms: Option>, - #[serde(rename = "cac:PrepaidPayment", alias = "PrepaidPayment", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PrepaidPayment", + alias = "PrepaidPayment", + skip_serializing_if = "Option::is_none" + )] pub prepaid_payment: Option>, #[serde( - rename = "cac:AllowanceCharge", alias = "AllowanceCharge", + rename = "cac:AllowanceCharge", + alias = "AllowanceCharge", skip_serializing_if = "Option::is_none" )] pub allowance_charge: Option>, #[serde( - rename = "cac:TaxExchangeRate", alias = "TaxExchangeRate", + rename = "cac:TaxExchangeRate", + alias = "TaxExchangeRate", skip_serializing_if = "Option::is_none" )] pub tax_exchange_rate: Option, #[serde( - rename = "cac:PricingExchangeRate", alias = "PricingExchangeRate", + rename = "cac:PricingExchangeRate", + alias = "PricingExchangeRate", skip_serializing_if = "Option::is_none" )] pub pricing_exchange_rate: Option, #[serde( - rename = "cac:PaymentExchangeRate", alias = "PaymentExchangeRate", + rename = "cac:PaymentExchangeRate", + alias = "PaymentExchangeRate", skip_serializing_if = "Option::is_none" )] pub payment_exchange_rate: Option, #[serde( - rename = "cac:PaymentAlternativeExchangeRate", alias = "PaymentAlternativeExchangeRate", + rename = "cac:PaymentAlternativeExchangeRate", + alias = "PaymentAlternativeExchangeRate", skip_serializing_if = "Option::is_none" )] pub payment_alternative_exchange_rate: Option, - #[serde(rename = "cac:TaxTotal", alias = "TaxTotal", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:TaxTotal", + alias = "TaxTotal", + skip_serializing_if = "Option::is_none" + )] pub tax_total: Option>, #[serde( - rename = "cac:WithholdingTaxTotal", alias = "WithholdingTaxTotal", + rename = "cac:WithholdingTaxTotal", + alias = "WithholdingTaxTotal", skip_serializing_if = "Option::is_none" )] pub withholding_tax_total: Option>, @@ -267,31 +384,57 @@ pub struct UblExtensions {} #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct Period { - #[serde(rename = "cbc:StartDate", alias = "StartDate", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:StartDate", + alias = "StartDate", + skip_serializing_if = "Option::is_none" + )] pub start_date: Option, - #[serde(rename = "cbc:StartTime", alias = "StartTime", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:StartTime", + alias = "StartTime", + skip_serializing_if = "Option::is_none" + )] pub start_time: Option, - #[serde(rename = "cbc:EndDate", alias = "EndDate", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:EndDate", + alias = "EndDate", + skip_serializing_if = "Option::is_none" + )] pub end_date: Option, - #[serde(rename = "cbc:EndTime", alias = "EndTime", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:EndTime", + alias = "EndTime", + skip_serializing_if = "Option::is_none" + )] pub end_time: Option, #[serde( - rename = "cbc:DurationMeasure", alias = "DurationMeasure", + rename = "cbc:DurationMeasure", + alias = "DurationMeasure", skip_serializing_if = "Option::is_none" )] pub duration_measure: Option, #[serde( - rename = "cbc:DescriptionCode", alias = "DescriptionCode", + rename = "cbc:DescriptionCode", + alias = "DescriptionCode", skip_serializing_if = "Option::is_none" )] pub description_code: Option>, - #[serde(rename = "cbc:Description", alias = "Description", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Description", + alias = "Description", + skip_serializing_if = "Option::is_none" + )] pub description: Option>, } #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct OrderReference { - #[serde(rename = "cbc:ID", alias = "ID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ID", + alias = "ID", + skip_serializing_if = "Option::is_none" + )] pub id: Option, } @@ -315,13 +458,21 @@ impl From for BillingReference { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct DocumentReference { - #[serde(rename = "cbc:ID", alias = "ID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ID", + alias = "ID", + skip_serializing_if = "Option::is_none" + )] pub id: Option, } #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct ProjectReference { - #[serde(rename = "cbc:ID", alias = "ID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ID", + alias = "ID", + skip_serializing_if = "Option::is_none" + )] pub id: Option, } @@ -336,22 +487,47 @@ pub struct PartyIdentification { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct PartyType { - #[serde(rename = "cbc:EndpointID", alias = "EndpointID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:EndpointID", + alias = "EndpointID", + skip_serializing_if = "Option::is_none" + )] pub endpoint_id: Option, - #[serde(rename = "cac:PartyIdentification", alias = "PartyIdentification", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PartyIdentification", + alias = "PartyIdentification", + skip_serializing_if = "Option::is_none" + )] pub party_identification: Option>, - #[serde(rename = "cac:PartyName", alias = "PartyName", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PartyName", + alias = "PartyName", + skip_serializing_if = "Option::is_none" + )] pub party_name: Option>, - #[serde(rename = "cac:PostalAddress", alias = "PostalAddress", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PostalAddress", + alias = "PostalAddress", + skip_serializing_if = "Option::is_none" + )] pub postal_address: Option, - #[serde(rename = "cac:PartyTaxScheme", alias = "PartyTaxScheme", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:PartyTaxScheme", + alias = "PartyTaxScheme", + skip_serializing_if = "Option::is_none" + )] pub party_tax_scheme: Option>, #[serde( - rename = "cac:PartyLegalEntity", alias = "PartyLegalEntity", + rename = "cac:PartyLegalEntity", + alias = "PartyLegalEntity", skip_serializing_if = "Option::is_none" )] pub party_legal_entity: Option, - #[serde(rename = "cac:Contact", alias = "Contact", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:Contact", + alias = "Contact", + skip_serializing_if = "Option::is_none" + )] pub contact: Option, } @@ -363,31 +539,57 @@ pub struct PartyName { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct PostalAddress { - #[serde(rename = "cbc:ID", alias = "ID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ID", + alias = "ID", + skip_serializing_if = "Option::is_none" + )] pub id: Option, - #[serde(rename = "cbc:StreetName", alias = "StreetName", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:StreetName", + alias = "StreetName", + skip_serializing_if = "Option::is_none" + )] pub street_name: Option, #[serde( - rename = "cbc:AdditionalStreetName", alias = "AdditionalStreetName", + rename = "cbc:AdditionalStreetName", + alias = "AdditionalStreetName", skip_serializing_if = "Option::is_none" )] pub additional_street_name: Option, - #[serde(rename = "cbc:CityName", alias = "CityName", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:CityName", + alias = "CityName", + skip_serializing_if = "Option::is_none" + )] pub city_name: Option, - #[serde(rename = "cbc:PostalZone", alias = "PostalZone", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:PostalZone", + alias = "PostalZone", + skip_serializing_if = "Option::is_none" + )] pub postal_zone: Option, - #[serde(rename = "cac:Country", alias = "Country", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:Country", + alias = "Country", + skip_serializing_if = "Option::is_none" + )] pub country: Option, } #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct Country { #[serde( - rename = "cbc:IdentificationCode", alias = "IdentificationCode", + rename = "cbc:IdentificationCode", + alias = "IdentificationCode", skip_serializing_if = "Option::is_none" )] pub identification_code: Option, - #[serde(rename = "cbc:Name", alias = "Name", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Name", + alias = "Name", + skip_serializing_if = "Option::is_none" + )] pub name: Option, } @@ -402,7 +604,11 @@ impl Country { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct PartyTaxScheme { - #[serde(rename = "cbc:CompanyID", alias = "CompanyID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:CompanyID", + alias = "CompanyID", + skip_serializing_if = "Option::is_none" + )] pub company_id: Option, #[serde(rename = "cac:TaxScheme", alias = "TaxScheme")] pub tax_scheme: TaxScheme, @@ -417,14 +623,20 @@ pub struct TaxScheme { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct PartyLegalEntity { #[serde( - rename = "cbc:RegistrationName", alias = "RegistrationName", + rename = "cbc:RegistrationName", + alias = "RegistrationName", skip_serializing_if = "Option::is_none" )] pub registration_name: Option, - #[serde(rename = "cbc:CompanyID", alias = "CompanyID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:CompanyID", + alias = "CompanyID", + skip_serializing_if = "Option::is_none" + )] pub company_id: Option, #[serde( - rename = "cbc:CompanyLegalForm", alias = "CompanyLegalForm", + rename = "cbc:CompanyLegalForm", + alias = "CompanyLegalForm", skip_serializing_if = "Option::is_none" )] pub company_legal_form: Option, @@ -432,11 +644,23 @@ pub struct PartyLegalEntity { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct Contact { - #[serde(rename = "cbc:Name", alias = "Name", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Name", + alias = "Name", + skip_serializing_if = "Option::is_none" + )] pub name: Option, - #[serde(rename = "cbc:Telephone", alias = "Telephone", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Telephone", + alias = "Telephone", + skip_serializing_if = "Option::is_none" + )] pub telephone: Option, - #[serde(rename = "cbc:ElectronicMail", alias = "ElectronicMail", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ElectronicMail", + alias = "ElectronicMail", + skip_serializing_if = "Option::is_none" + )] pub electronic_mail: Option, } @@ -458,32 +682,52 @@ pub struct Payment {} #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct AllowanceCharge { #[serde( - rename = "cbc:ChargeIndicator", alias = "ChargeIndicator", + rename = "cbc:ChargeIndicator", + alias = "ChargeIndicator", skip_serializing_if = "Option::is_none" )] pub charge_indicator: Option, #[serde( - rename = "cbc:AllowanceChargeReasonCode", alias = "AllowanceChargeReasonCode", + rename = "cbc:AllowanceChargeReasonCode", + alias = "AllowanceChargeReasonCode", skip_serializing_if = "Option::is_none" )] pub allowance_charge_reason_code: Option, #[serde( - rename = "cbc:AllowanceChargeReason", alias = "AllowanceChargeReason", + rename = "cbc:AllowanceChargeReason", + alias = "AllowanceChargeReason", skip_serializing_if = "Option::is_none" )] pub allowance_charge_reason: Option, #[serde( - rename = "cbc:MultiplierFactorNumeric", alias = "MultiplierFactorNumeric", + rename = "cbc:MultiplierFactorNumeric", + alias = "MultiplierFactorNumeric", skip_serializing_if = "Option::is_none" )] pub multiplier_factor_numeric: Option, - #[serde(rename = "cbc:Amount", alias = "Amount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Amount", + alias = "Amount", + skip_serializing_if = "Option::is_none" + )] pub amount: Option, - #[serde(rename = "cbc:BaseAmount", alias = "BaseAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:BaseAmount", + alias = "BaseAmount", + skip_serializing_if = "Option::is_none" + )] pub base_amount: Option, - #[serde(rename = "cac:TaxCategory", alias = "TaxCategory", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:TaxCategory", + alias = "TaxCategory", + skip_serializing_if = "Option::is_none" + )] pub tax_category: Option, - #[serde(rename = "cac:TaxTotal", alias = "TaxTotal", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:TaxTotal", + alias = "TaxTotal", + skip_serializing_if = "Option::is_none" + )] pub tax_total: Option, } @@ -492,27 +736,45 @@ pub struct ExchangeRate {} #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct TaxTotal { - #[serde(rename = "cbc:TaxAmount", alias = "TaxAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:TaxAmount", + alias = "TaxAmount", + skip_serializing_if = "Option::is_none" + )] pub tax_amount: Option, #[serde( - rename = "cbc:TaxInclusiveAmount", alias = "TaxInclusiveAmount", + rename = "cbc:TaxInclusiveAmount", + alias = "TaxInclusiveAmount", skip_serializing_if = "Option::is_none" )] pub tax_inclusive_amount: Option, - #[serde(rename = "cac:TaxSubtotal", alias = "TaxSubtotal", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:TaxSubtotal", + alias = "TaxSubtotal", + skip_serializing_if = "Option::is_none" + )] pub tax_subtotal: Option>, } #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct TaxSubtotal { #[serde( - rename = "cbc:TaxInclusiveAmount", alias = "TaxInclusiveAmount", + rename = "cbc:TaxInclusiveAmount", + alias = "TaxInclusiveAmount", skip_serializing_if = "Option::is_none" )] pub tax_inclusive_amount: Option, - #[serde(rename = "cbc:TaxableAmount", alias = "TaxableAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:TaxableAmount", + alias = "TaxableAmount", + skip_serializing_if = "Option::is_none" + )] pub taxable_amount: Option, - #[serde(rename = "cbc:TaxAmount", alias = "TaxAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:TaxAmount", + alias = "TaxAmount", + skip_serializing_if = "Option::is_none" + )] pub tax_amount: Option, #[serde(rename = "cac:TaxCategory", alias = "TaxCategory")] pub tax_category: TaxCategory, @@ -520,17 +782,27 @@ pub struct TaxSubtotal { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct TaxCategory { - #[serde(rename = "cbc:ID", alias = "ID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ID", + alias = "ID", + skip_serializing_if = "Option::is_none" + )] pub id: Option, - #[serde(rename = "cbc:Percent", alias = "Percent", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Percent", + alias = "Percent", + skip_serializing_if = "Option::is_none" + )] pub percent: Option, #[serde( - rename = "cbc:TaxExemptionReasonCode", alias = "TaxExemptionReasonCode", + rename = "cbc:TaxExemptionReasonCode", + alias = "TaxExemptionReasonCode", skip_serializing_if = "Option::is_none" )] pub tax_exemption_reason_code: Option, #[serde( - rename = "cbc:TaxExemptionReason", alias = "TaxExemptionReason", + rename = "cbc:TaxExemptionReason", + alias = "TaxExemptionReason", skip_serializing_if = "Option::is_none" )] pub tax_exemption_reason: Option, @@ -541,38 +813,52 @@ pub struct TaxCategory { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct MonetaryTotal { #[serde( - rename = "cbc:LineExtensionAmount", alias = "LineExtensionAmount", + rename = "cbc:LineExtensionAmount", + alias = "LineExtensionAmount", skip_serializing_if = "Option::is_none" )] pub line_extension_amount: Option, #[serde( - rename = "cbc:TaxExclusiveAmount", alias = "TaxExclusiveAmount", + rename = "cbc:TaxExclusiveAmount", + alias = "TaxExclusiveAmount", skip_serializing_if = "Option::is_none" )] pub tax_exclusive_amount: Option, #[serde( - rename = "cbc:TaxInclusiveAmount", alias = "TaxInclusiveAmount", + rename = "cbc:TaxInclusiveAmount", + alias = "TaxInclusiveAmount", skip_serializing_if = "Option::is_none" )] pub tax_inclusive_amount: Option, #[serde( - rename = "cbc:AllowanceTotalAmount", alias = "AllowanceTotalAmount", + rename = "cbc:AllowanceTotalAmount", + alias = "AllowanceTotalAmount", skip_serializing_if = "Option::is_none" )] pub allowance_total_amount: Option, #[serde( - rename = "cbc:ChargeTotalAmount", alias = "ChargeTotalAmount", + rename = "cbc:ChargeTotalAmount", + alias = "ChargeTotalAmount", skip_serializing_if = "Option::is_none" )] pub charge_total_amount: Option, - #[serde(rename = "cbc:PrepaidAmount", alias = "PrepaidAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:PrepaidAmount", + alias = "PrepaidAmount", + skip_serializing_if = "Option::is_none" + )] pub prepaid_amount: Option, #[serde( - rename = "cbc:PayableRoundingAmount", alias = "PayableRoundingAmount", + rename = "cbc:PayableRoundingAmount", + alias = "PayableRoundingAmount", skip_serializing_if = "Option::is_none" )] pub payable_rounding_amount: Option, - #[serde(rename = "cbc:PayableAmount", alias = "PayableAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:PayableAmount", + alias = "PayableAmount", + skip_serializing_if = "Option::is_none" + )] pub payable_amount: Option, } @@ -603,39 +889,71 @@ impl Amount { pub struct InvoiceLine { #[serde(rename = "cbc:ID", alias = "ID")] pub id: Option, - #[serde(rename = "cbc:Note", alias = "Note", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Note", + alias = "Note", + skip_serializing_if = "Option::is_none" + )] pub note: Option>, #[serde( - rename = "cbc:InvoicedQuantity", alias = "InvoicedQuantity", + rename = "cbc:InvoicedQuantity", + alias = "InvoicedQuantity", skip_serializing_if = "Option::is_none" )] pub invoiced_quantity: Option, #[serde( - rename = "cbc:LineExtensionAmount", alias = "LineExtensionAmount", + rename = "cbc:LineExtensionAmount", + alias = "LineExtensionAmount", skip_serializing_if = "Option::is_none" )] pub line_extension_amount: Option, #[serde( - rename = "cbc:LineExtensionGrossAmount", alias = "LineExtensionGrossAmount", + rename = "cbc:LineExtensionGrossAmount", + alias = "LineExtensionGrossAmount", skip_serializing_if = "Option::is_none" )] pub line_extension_gross_amount: Option, - #[serde(rename = "cbc:AccountingCost", alias = "AccountingCost", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:AccountingCost", + alias = "AccountingCost", + skip_serializing_if = "Option::is_none" + )] pub accounting_cost: Option, - #[serde(rename = "cac:InvoicePeriod", alias = "InvoicePeriod", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:InvoicePeriod", + alias = "InvoicePeriod", + skip_serializing_if = "Option::is_none" + )] pub invoice_period: Option, #[serde( - rename = "cac:AllowanceCharge", alias = "AllowanceCharge", + rename = "cac:AllowanceCharge", + alias = "AllowanceCharge", skip_serializing_if = "Option::is_none" )] pub allowance_charge: Option>, - #[serde(rename = "cac:TaxTotal", alias = "TaxTotal", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:TaxTotal", + alias = "TaxTotal", + skip_serializing_if = "Option::is_none" + )] pub tax_total: Option, - #[serde(rename = "cac:Item", alias = "Item", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:Item", + alias = "Item", + skip_serializing_if = "Option::is_none" + )] pub item: Option, - #[serde(rename = "cac:Price", alias = "Price", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:Price", + alias = "Price", + skip_serializing_if = "Option::is_none" + )] pub price: Option, - #[serde(rename = "cac:SubInvoiceLine", alias = "SubInvoiceLine", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:SubInvoiceLine", + alias = "SubInvoiceLine", + skip_serializing_if = "Option::is_none" + )] pub sub_invoice_line: Option>, } @@ -673,39 +991,57 @@ impl Quantity { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct Item { - #[serde(rename = "cbc:Description", alias = "Description", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Description", + alias = "Description", + skip_serializing_if = "Option::is_none" + )] pub description: Option>, - #[serde(rename = "cbc:Name", alias = "Name", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Name", + alias = "Name", + skip_serializing_if = "Option::is_none" + )] pub name: Option, #[serde( - rename = "cac:BuyersItemIdentification", alias = "BuyersItemIdentification", + rename = "cac:BuyersItemIdentification", + alias = "BuyersItemIdentification", skip_serializing_if = "Option::is_none" )] pub buyers_item_identification: Option, #[serde( - rename = "cac:SellersItemIdentification", alias = "SellersItemIdentification", + rename = "cac:SellersItemIdentification", + alias = "SellersItemIdentification", skip_serializing_if = "Option::is_none" )] pub sellers_item_identification: Option, #[serde( - rename = "cac:StandardItemIdentification", alias = "StandardItemIdentification", + rename = "cac:StandardItemIdentification", + alias = "StandardItemIdentification", skip_serializing_if = "Option::is_none" )] pub standard_item_identification: Option, - #[serde(rename = "cac:OriginCountry", alias = "OriginCountry", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cac:OriginCountry", + alias = "OriginCountry", + skip_serializing_if = "Option::is_none" + )] pub origin_country: Option, #[serde( - rename = "cac:CommodityClassification", alias = "CommodityClassification", + rename = "cac:CommodityClassification", + alias = "CommodityClassification", skip_serializing_if = "Option::is_none" )] pub commodity_classification: Option>, #[serde( - rename = "cac:ClassifiedTaxCategory", alias = "ClassifiedTaxCategory", + rename = "cac:ClassifiedTaxCategory", + alias = "ClassifiedTaxCategory", skip_serializing_if = "Option::is_none" )] pub classified_tax_category: Option>, #[serde( - rename = "cac:AdditionalItemProperty", alias = "AdditionalItemProperty", + rename = "cac:AdditionalItemProperty", + alias = "AdditionalItemProperty", skip_serializing_if = "Option::is_none" )] pub additional_item_property: Option>, @@ -713,17 +1049,27 @@ pub struct Item { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct Price { - #[serde(rename = "cbc:PriceAmount", alias = "PriceAmount", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:PriceAmount", + alias = "PriceAmount", + skip_serializing_if = "Option::is_none" + )] pub price_amount: Option, #[serde( - rename = "cbc:GrossPriceAmount", alias = "GrossPriceAmount", + rename = "cbc:GrossPriceAmount", + alias = "GrossPriceAmount", skip_serializing_if = "Option::is_none" )] pub gross_price_amount: Option, - #[serde(rename = "cbc:BaseQuantity", alias = "BaseQuantity", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:BaseQuantity", + alias = "BaseQuantity", + skip_serializing_if = "Option::is_none" + )] pub base_quantity: Option, #[serde( - rename = "cac:AllowanceCharge", alias = "AllowanceCharge", + rename = "cac:AllowanceCharge", + alias = "AllowanceCharge", skip_serializing_if = "Option::is_none" )] pub allowance_charge: Option>, @@ -744,7 +1090,8 @@ pub struct ItemIdentification { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct CommodityClassification { #[serde( - rename = "cbc:ItemClassificationCode", alias = "ItemClassificationCode", + rename = "cbc:ItemClassificationCode", + alias = "ItemClassificationCode", skip_serializing_if = "Option::is_none" )] pub item_classification_code: Option, @@ -752,9 +1099,17 @@ pub struct CommodityClassification { #[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Default)] pub struct ClassifiedTaxCategory { - #[serde(rename = "cbc:ID", alias = "ID", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:ID", + alias = "ID", + skip_serializing_if = "Option::is_none" + )] pub id: Option, - #[serde(rename = "cbc:Percent", alias = "Percent", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Percent", + alias = "Percent", + skip_serializing_if = "Option::is_none" + )] pub percent: Option, #[serde(rename = "cac:TaxScheme", alias = "TaxScheme")] pub tax_scheme: TaxScheme, @@ -764,7 +1119,11 @@ pub struct ClassifiedTaxCategory { pub struct AdditionalItemProperty { #[serde(rename = "cbc:Name", alias = "Name")] pub name: String, - #[serde(rename = "cbc:Value", alias = "Value", skip_serializing_if = "Option::is_none")] + #[serde( + rename = "cbc:Value", + alias = "Value", + skip_serializing_if = "Option::is_none" + )] pub value: Option, } diff --git a/src/pef_3/tests.rs b/src/pef_3/tests.rs index a87eaa0..4d2f539 100644 --- a/src/pef_3/tests.rs +++ b/src/pef_3/tests.rs @@ -50,7 +50,11 @@ fn test_party_parsing() { let wrapper: Result = quick_xml::de::from_str(xml); match wrapper { Ok(_p) => (), - Err(e) => panic!("Failed to parse party: {:?}, source: {:?}", e, std::error::Error::source(&e)), + Err(e) => panic!( + "Failed to parse party: {:?}, source: {:?}", + e, + std::error::Error::source(&e) + ), } } @@ -174,9 +178,7 @@ fn test_generate_complex_invoice() { .add_subtotal("1000.00", "230.00", "PLN", "S", "23", "VAT") .build(); - let tax_total_eur = TaxTotalBuilder::new() - .tax_amount("EUR", "53.49") - .build(); + let tax_total_eur = TaxTotalBuilder::new().tax_amount("EUR", "53.49").build(); let invoice = InvoiceBuilder::new( "COMPLEX-002", diff --git a/src/pef_3/tests_rules.rs b/src/pef_3/tests_rules.rs index a5628e4..3d4a7e7 100644 --- a/src/pef_3/tests_rules.rs +++ b/src/pef_3/tests_rules.rs @@ -240,13 +240,9 @@ fn test_br_07_buyer_legal_name_exists() { fn test_br_53_vat_accounting_currency_total() { let builder = create_common_invoice_builder(); - let tax_total_pln = TaxTotalBuilder::new() - .tax_amount("PLN", "23.00") - .build(); + let tax_total_pln = TaxTotalBuilder::new().tax_amount("PLN", "23.00").build(); - let tax_total_eur = TaxTotalBuilder::new() - .tax_amount("EUR", "5.35") - .build(); + let tax_total_eur = TaxTotalBuilder::new().tax_amount("EUR", "5.35").build(); let invoice = builder .document_currency_code("PLN")