use rust_decimal::Decimal;
use serde::{Deserialize, Serialize, Serializer};
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename = "prod")]
pub struct ProdProcess {
#[serde(rename = "cProd")]
pub c_prod: String,
#[serde(rename = "cEAN")]
pub c_ean: String,
#[serde(rename = "xProd")]
pub x_prod: String,
#[serde(rename = "NCM")]
pub ncm: String,
#[serde(rename = "CEST", skip_serializing_if = "Option::is_none")]
pub cest: Option<String>,
#[serde(rename = "CFOP")]
pub cfop: String,
#[serde(rename = "uCom")]
pub u_com: String,
#[serde(rename = "qCom")]
pub q_com: String,
#[serde(rename = "vUnCom")]
pub v_un_com: String,
#[serde(rename = "vProd")]
pub v_prod: String,
#[serde(rename = "cEANTrib")]
pub c_ean_trib: String,
#[serde(rename = "uTrib")]
pub u_trib: String,
#[serde(rename = "qTrib")]
pub q_trib: String,
#[serde(rename = "vUnTrib")]
pub v_un_trib: String,
#[serde(rename = "vDesc", skip_serializing_if = "Option::is_none")]
pub v_desc: Option<Decimal>,
#[serde(rename = "indTot")]
pub ind_tot: String,
#[serde(rename = "xPed", skip_serializing_if = "Option::is_none")]
pub x_ped: Option<String>,
#[serde(rename = "nItemPed", skip_serializing_if = "Option::is_none")]
pub n_item_ped: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename = "imposto")]
pub struct ImpostoProcess {
#[serde(rename = "vTotTrib")]
pub v_tot_trib: String,
#[serde(rename = "ICMS")]
pub icms: ICMSProcess,
#[serde(rename = "PIS")]
pub pis: PISProcess,
#[serde(rename = "COFINS")]
pub cofins: COFINSProcess,
#[serde(rename = "IBSCBS", skip_serializing_if = "Option::is_none")]
pub ibs_cbs: Option<IBSCBSProcess>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct IBSCBSProcess {
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "cClassTrib")]
pub c_class_trib: String,
#[serde(rename = "gIBSCBS")]
pub g_ibscbs: GIBSCBS,
}
impl Default for IBSCBSProcess {
fn default() -> Self {
IBSCBSProcess {
cst: "IBS CBS cst não infomado".to_string(),
c_class_trib: "c_class_trib não infomado".to_string(),
g_ibscbs: GIBSCBS {
v_bc: "-0.01".to_string(),
g_ibs_uf: GIBSUF {
p_ibs_uf: "p_ibs_uf valor incorreto".to_string(),
..Default::default()
},
g_ibs_mun: GIBSMun {
p_ibs_mun: "p_ibs_mun valor incorreto".to_string(),
..Default::default()
},
v_ibs: "v_ibs valor incorreto".to_string(),
g_cbs: GCBS {
p_cbs: "p_cbs valor incorreto".to_string(),
..Default::default()
},
},
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct GIBSCBS {
#[serde(rename = "vBC")]
pub v_bc: String,
#[serde(rename = "gIBSUF")]
pub g_ibs_uf: GIBSUF,
#[serde(rename = "gIBSMun")]
pub g_ibs_mun: GIBSMun,
#[serde(rename = "vIBS")]
pub v_ibs: String,
#[serde(rename = "gCBS")]
pub g_cbs: GCBS,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GIBSUF {
#[serde(rename = "pIBSUF")]
pub p_ibs_uf: String,
#[serde(rename = "vTribOP", skip_serializing_if = "Option::is_none")]
pub v_trib_op: Option<String>,
#[serde(rename = "gDif", skip_serializing_if = "Option::is_none")]
pub g_dif: Option<GDif>,
#[serde(rename = "gDevTrib", skip_serializing_if = "Option::is_none")]
pub g_dev_trib: Option<GDevTrib>,
#[serde(rename = "gRed", skip_serializing_if = "Option::is_none")]
pub g_red: Option<GRed>,
#[serde(rename = "gTribRegular", skip_serializing_if = "Option::is_none")]
pub g_trib_regular: Option<GTribRegular>,
#[serde(rename = "vIBSUF")]
pub v_ibs_uf: String,
}
impl Default for GIBSUF {
fn default() -> Self {
GIBSUF {
p_ibs_uf: "p_ibs_uf valor incorreto".to_string(),
v_trib_op: None,
g_dif: None,
g_dev_trib: None,
g_red: None,
g_trib_regular: None,
v_ibs_uf: "v_ibs_uf valor incorreto".to_string(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GDif {
#[serde(rename = "pDif")]
pub p_dif: Decimal,
#[serde(rename = "vDif")]
pub v_dif: Decimal,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GDevTrib {
#[serde(rename = "vDevTrib")]
pub v_dev_trib: Decimal,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GRed {
#[serde(rename = "pRedAliq")]
pub p_red_aliq: Decimal,
#[serde(rename = "pAliqEfet")]
pub p_aliq_efet: Decimal,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GTribRegular {
#[serde(rename = "CSTReg", skip_serializing_if = "Option::is_none")]
pub cst_reg: Option<String>,
#[serde(rename = "cClassTribReg", skip_serializing_if = "Option::is_none")]
pub c_class_trib_reg: Option<String>,
#[serde(rename = "pAliqEfetReg", skip_serializing_if = "Option::is_none")]
pub p_aliq_efet_reg: Option<Decimal>,
#[serde(rename = "vTribReg", skip_serializing_if = "Option::is_none")]
pub v_trib_reg: Option<Decimal>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GIBSMun {
#[serde(rename = "pIBSMun")]
pub p_ibs_mun: String,
#[serde(rename = "vTribOP", skip_serializing_if = "Option::is_none")]
pub v_trib_op: Option<String>,
#[serde(rename = "gDif", skip_serializing_if = "Option::is_none")]
pub g_dif: Option<GDif>,
#[serde(rename = "gDevTrib", skip_serializing_if = "Option::is_none")]
pub g_dev_trib: Option<GDevTrib>,
#[serde(rename = "gRed", skip_serializing_if = "Option::is_none")]
pub g_red: Option<GRed>,
#[serde(rename = "gTribRegular", skip_serializing_if = "Option::is_none")]
pub g_trib_regular: Option<GTribRegular>,
#[serde(rename = "vIBSMun")]
pub v_ibs_mun: String,
}
impl Default for GIBSMun {
fn default() -> Self {
GIBSMun {
p_ibs_mun: "p_ibs_mun valor incorreto".to_string(),
v_trib_op: None,
g_dif: None,
g_dev_trib: None,
g_red: None,
g_trib_regular: None,
v_ibs_mun: "v_ibs_mun valor incorreto".to_string(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GCBS {
#[serde(rename = "pCBS")]
pub p_cbs: String,
#[serde(rename = "vTribOp", skip_serializing_if = "Option::is_none")]
pub v_trib_op: Option<Decimal>,
#[serde(rename = "gDif", skip_serializing_if = "Option::is_none")]
pub g_dif: Option<GDif>,
#[serde(rename = "gDevTrib", skip_serializing_if = "Option::is_none")]
pub g_dev_trib: Option<GDevTrib>,
#[serde(rename = "gRed", skip_serializing_if = "Option::is_none")]
pub g_red: Option<GRed>,
#[serde(rename = "gTribRegular", skip_serializing_if = "Option::is_none")]
pub g_trib_regular: Option<GTribRegular>,
#[serde(rename = "vCBS")]
pub v_cbs: String,
}
impl Default for GCBS {
fn default() -> Self {
GCBS {
p_cbs: "p_cbs valor incorreto".to_string(),
v_trib_op: None,
g_dif: None,
g_dev_trib: None,
g_red: None,
g_trib_regular: None,
v_cbs: "v_cbs valor incorreto".to_string(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum ICMSProcess {
ICMS00(ICMS00),
ICMS10(ICMS10),
ICMS20(ICMS20),
ICMS30(ICMS30),
ICMS40(ICMS40),
ICMS51(ICMS51),
ICMS60(ICMS60),
ICMS70(ICMS70),
ICMS90(ICMS90),
ICMSPart(ICMSPart),
ICMSSN101(ICMSSN101),
ICMSSN102(ICMSSN102),
ICMSSN201(ICMSSN201),
ICMSSN202(ICMSSN202),
ICMSSN500(ICMSSN500),
ICMSSN900(ICMSSN900),
ICMSError(String),
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS00 {
pub orig: u8,
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "modBC")]
pub mod_bc: u8,
#[serde(rename = "vBC", serialize_with = "serialize_f64_2_decimals")]
pub v_bc: f64,
#[serde(rename = "pICMS", serialize_with = "serialize_f64_4_decimals")]
pub p_icms: f64,
#[serde(rename = "vICMS", serialize_with = "serialize_f64_2_decimals")]
pub v_icms: f64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS10 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS20 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS30 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename = "ICMS40")]
pub struct ICMS40 {
pub orig: u8,
#[serde(rename = "CST")]
pub cst: u16,
#[serde(rename = "vICMSDeson", skip_serializing_if = "Option::is_none")]
pub vicmsdeson: Option<f64>,
#[serde(rename = "motDesICMS", skip_serializing_if = "Option::is_none")]
pub mot_des_icms: Option<u16>,
}
impl Default for ICMS40 {
fn default() -> Self {
ICMS40 {
orig: 0,
cst: 40,
vicmsdeson: None,
mot_des_icms: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS51 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS60 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS70 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMS90 {
pub orig: u8,
#[serde(rename = "CST")]
pub cst: String,
}
impl Default for ICMS90 {
fn default() -> Self {
ICMS90 {
orig: 0,
cst: "90".to_string(),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMSPart {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMSSN101 {
pub orig: u8,
#[serde(rename = "CSOSN")]
pub csosn: String,
#[serde(rename = "pCredSN")]
pub p_cred_sn: String,
#[serde(rename = "vCredICMSSN")]
pub v_cred_icmssn: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMSSN102 {
pub orig: u8,
#[serde(rename = "CSOSN")]
pub csosn: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMSSN201 {
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ICMSSN202 {
}
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ICMSSN500 {
#[serde(rename = "orig")]
pub orig: u8, #[serde(rename = "CSOSN")]
pub csosn: String, #[serde(rename = "vBCSTRet", skip_serializing_if = "Option::is_none")]
pub vbcst_ret: Option<String>, #[serde(rename = "vICMSSTRet", skip_serializing_if = "Option::is_none")]
pub vicmsst_ret: Option<String>, }
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ICMSSN900 {
#[serde(rename = "orig")]
pub orig: u8, #[serde(rename = "CSOSN")]
pub csosn: String, #[serde(rename = "modBC", skip_serializing_if = "Option::is_none")]
pub modbc: Option<String>, #[serde(rename = "vBC", skip_serializing_if = "Option::is_none")]
pub vbc: Option<String>, #[serde(rename = "pRedBC", skip_serializing_if = "Option::is_none")]
pub pred_bc: Option<String>, #[serde(rename = "pICMS", skip_serializing_if = "Option::is_none")]
pub picms: Option<String>, #[serde(rename = "vICMS", skip_serializing_if = "Option::is_none")]
pub vicms: Option<String>, #[serde(rename = "modBCST", skip_serializing_if = "Option::is_none")]
pub modbcst: Option<String>, #[serde(rename = "pMVAST", skip_serializing_if = "Option::is_none")]
pub pmvast: Option<String>, #[serde(rename = "pRedBCST", skip_serializing_if = "Option::is_none")]
pub pred_bcst: Option<String>, #[serde(rename = "vBCST", skip_serializing_if = "Option::is_none")]
pub vbcst: Option<String>, #[serde(rename = "pICMSST", skip_serializing_if = "Option::is_none")]
pub picmsst: Option<String>, #[serde(rename = "vICMSST", skip_serializing_if = "Option::is_none")]
pub vicmsst: Option<String>, #[serde(rename = "pCredSN", skip_serializing_if = "Option::is_none")]
pub pcred_sn: Option<String>, #[serde(rename = "vCredICMSSN", skip_serializing_if = "Option::is_none")]
pub vcred_icmssn: Option<String>, }
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PISProcess {
#[serde(rename = "PISAliq", skip_serializing_if = "Option::is_none")]
pub pis_aliq: Option<PISAliq>,
#[serde(rename = "PISQtde", skip_serializing_if = "Option::is_none")]
pub pis_qtde: Option<PISQtde>,
#[serde(rename = "PISNT", skip_serializing_if = "Option::is_none")]
pub pis_nt: Option<PISNT>,
#[serde(rename = "PISOutr", skip_serializing_if = "Option::is_none")]
pub pis_outr: Option<PISOutr>,
#[serde(rename = "PISST", skip_serializing_if = "Option::is_none")]
pub pis_st: Option<PISST>,
#[serde(rename = "PISInvalid", skip_serializing_if = "Option::is_none")]
pub pis_invalid: Option<String>,
}
impl Default for PISProcess {
fn default() -> Self {
PISProcess {
pis_aliq: None,
pis_qtde: None,
pis_nt: None,
pis_outr: None,
pis_st: None,
pis_invalid: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PISAliq {
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "vBC", serialize_with = "serialize_f64_2_decimals")]
pub v_bc: f64,
#[serde(rename = "pPIS", serialize_with = "serialize_f64_4_decimals")]
pub p_pis: f64,
#[serde(rename = "vPIS", serialize_with = "serialize_f64_2_decimals")]
pub v_pis: f64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PISQtde {
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "qBCProd")]
pub qbc_prod: String,
#[serde(rename = "vAliqProd")]
pub valiq_prod: String,
#[serde(rename = "vPIS")]
pub vpis: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PISNT {
#[serde(rename = "CST")]
pub cst: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PISOutr {
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "qBCProd", skip_serializing_if = "Option::is_none")]
pub qbc_prod: Option<String>,
#[serde(rename = "vAliqProd", skip_serializing_if = "Option::is_none")]
pub valiq_prod: Option<String>,
#[serde(rename = "vPIS", skip_serializing_if = "Option::is_none")]
pub vpis: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct PISST {
#[serde(rename = "vBC", skip_serializing_if = "Option::is_none")]
pub v_bc: Option<String>,
#[serde(rename = "pPIS", skip_serializing_if = "Option::is_none")]
pub p_pis: Option<String>,
#[serde(rename = "qBCProd", skip_serializing_if = "Option::is_none")]
pub qbc_prod: Option<String>,
#[serde(rename = "vAliqProd", skip_serializing_if = "Option::is_none")]
pub valiq_prod: Option<String>,
#[serde(rename = "vPIS", skip_serializing_if = "Option::is_none")]
pub vpis: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct COFINSProcess {
#[serde(rename = "COFINSAliq", skip_serializing_if = "Option::is_none")]
pub cofins_aliq: Option<COFINSAliq>,
#[serde(rename = "COFINSQtde", skip_serializing_if = "Option::is_none")]
pub cofins_qtde: Option<COFINSQtde>,
#[serde(rename = "COFINSNT", skip_serializing_if = "Option::is_none")]
pub cofins_nt: Option<COFINSNT>,
#[serde(rename = "COFINSOutr", skip_serializing_if = "Option::is_none")]
pub cofins_outr: Option<COFINSOutr>,
#[serde(rename = "COFINSST", skip_serializing_if = "Option::is_none")]
pub cofins_st: Option<COFINSST>,
#[serde(rename = "COFINSInvalid", skip_serializing_if = "Option::is_none")]
pub cofins_invalid: Option<String>,
}
impl Default for COFINSProcess {
fn default() -> Self {
COFINSProcess {
cofins_aliq: None,
cofins_qtde: None,
cofins_nt: None,
cofins_outr: None,
cofins_st: None,
cofins_invalid: None,
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct COFINSAliq {
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "vBC", serialize_with = "serialize_f64_2_decimals")]
pub v_bc: f64,
#[serde(rename = "pCOFINS", serialize_with = "serialize_f64_4_decimals")]
pub p_cofins: f64,
#[serde(rename = "vCOFINS", serialize_with = "serialize_f64_2_decimals")]
pub v_cofins: f64,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct COFINSQtde {
#[serde(rename = "CST")]
pub cst: String,
#[serde(rename = "qBCProd")]
pub qbc_prod: String,
#[serde(rename = "vAliqProd")]
pub valiq_prod: String,
#[serde(rename = "vCOFINS")]
pub vcofins: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct COFINSNT {
#[serde(rename = "CST")]
pub cst: String,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct COFINSOutr {
#[serde(rename = "CST")]
pub cst: String,
#[serde(
rename = "vBC",
skip_serializing_if = "Option::is_none",
serialize_with = "serialize_option_f64_2_decimals"
)]
pub v_bc: Option<f64>,
#[serde(
rename = "pCOFINS",
skip_serializing_if = "Option::is_none",
serialize_with = "serialize_option_f64_2_decimals"
)]
pub p_cofins: Option<f64>,
#[serde(
rename = "vCOFINS",
skip_serializing_if = "Option::is_none",
serialize_with = "serialize_option_f64_2_decimals"
)]
pub v_cofins: Option<f64>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct COFINSST {
#[serde(rename = "vBC", skip_serializing_if = "Option::is_none")]
pub v_bc: Option<String>,
#[serde(rename = "pCOFINS", skip_serializing_if = "Option::is_none")]
pub p_cofins: Option<String>,
#[serde(rename = "qBCProd", skip_serializing_if = "Option::is_none")]
pub qbc_prod: Option<String>,
#[serde(rename = "vAliqProd", skip_serializing_if = "Option::is_none")]
pub valiq_prod: Option<String>,
#[serde(rename = "vCOFINS", skip_serializing_if = "Option::is_none")]
pub vcofins: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(rename = "det")]
pub struct DetProcess {
#[serde(rename = "prod")]
pub prod: ProdProcess,
#[serde(rename = "imposto")]
pub imposto: ImpostoProcess,
#[serde(rename = "infAdProd", skip_serializing_if = "Option::is_none")]
pub inf_ad_prod: Option<String>,
}
fn serialize_f64_2_decimals<S>(x: &f64, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
s.serialize_str(&format!("{:.2}", x))
}
fn serialize_f64_4_decimals<S>(x: &f64, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
s.serialize_str(&format!("{:.4}", x))
}
fn serialize_option_f64_2_decimals<S>(x: &Option<f64>, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match x {
Some(val) => s.serialize_str(&format!("{:.2}", val)),
None => s.serialize_none(),
}
}