use serde::{Deserialize, Serialize};
use crate::tax_element::{
TaxElement, TaxField, filter_fields, optional_field, serialize_tax_element,
};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "ts", derive(ts_rs::TS))]
#[cfg_attr(feature = "ts", ts(export))]
#[non_exhaustive]
pub struct IsData {
pub cst_is: String,
pub c_class_trib_is: String,
pub v_bc_is: Option<String>,
pub p_is: Option<String>,
pub p_is_espec: Option<String>,
pub u_trib: Option<String>,
pub q_trib: Option<String>,
pub v_is: String,
}
impl IsData {
pub fn new(
cst_is: impl Into<String>,
c_class_trib_is: impl Into<String>,
v_is: impl Into<String>,
) -> Self {
Self {
cst_is: cst_is.into(),
c_class_trib_is: c_class_trib_is.into(),
v_is: v_is.into(),
..Default::default()
}
}
pub fn v_bc_is(mut self, v: impl Into<String>) -> Self {
self.v_bc_is = Some(v.into());
self
}
pub fn p_is(mut self, v: impl Into<String>) -> Self {
self.p_is = Some(v.into());
self
}
pub fn p_is_espec(mut self, v: impl Into<String>) -> Self {
self.p_is_espec = Some(v.into());
self
}
pub fn u_trib(mut self, v: impl Into<String>) -> Self {
self.u_trib = Some(v.into());
self
}
pub fn q_trib(mut self, v: impl Into<String>) -> Self {
self.q_trib = Some(v.into());
self
}
}
fn calculate_is(data: &IsData) -> TaxElement {
let mut fields: Vec<Option<TaxField>> = vec![
Some(TaxField::new("CSTIS", &data.cst_is)),
Some(TaxField::new("cClassTribIS", &data.c_class_trib_is)),
];
if let Some(ref v_bc_is) = data.v_bc_is {
fields.push(Some(TaxField::new("vBCIS", v_bc_is)));
fields.push(optional_field("pIS", data.p_is.as_deref()));
fields.push(optional_field("pISEspec", data.p_is_espec.as_deref()));
}
if let (Some(u_trib), Some(q_trib)) = (&data.u_trib, &data.q_trib) {
fields.push(Some(TaxField::new("uTrib", u_trib)));
fields.push(Some(TaxField::new("qTrib", q_trib)));
}
fields.push(Some(TaxField::new("vIS", &data.v_is)));
TaxElement {
outer_tag: None,
outer_fields: vec![],
variant_tag: "IS".into(),
fields: filter_fields(fields),
}
}
pub fn build_is_xml(data: &IsData) -> String {
serialize_tax_element(&calculate_is(data))
}