Skip to main content

nfe_parser/base/item/imposto/
mod.rs

1//! Impostos da Nota Fiscal Eletrônica
2//!
3//! Este módulo contém as estruturas para representar todos os impostos
4//! incidentes sobre os produtos da NF-e, conforme layout 4.00 da SEFAZ.
5//!
6//! ## Impostos Implementados
7//!
8//! | Imposto | Descrição |
9//! |---------|-----------|
10//! | ICMS | Imposto sobre Circulação de Mercadorias e Serviços |
11//! | IPI | Imposto sobre Produtos Industrializados |
12//! | PIS | Programa de Integração Social |
13//! | COFINS | Contribuição para Financiamento da Seguridade Social |
14//! | PIS ST | PIS Substituição Tributária |
15//! | COFINS ST | COFINS Substituição Tributária |
16//! | II | Imposto de Importação |
17//! | ISSQN | Imposto sobre Serviços de Qualquer Natureza |
18//! | ICMSUFDest | ICMS para UF de Destino (DIFAL - EC 87/2015) |
19
20mod cofins;
21mod cofins_st;
22mod icms;
23mod icms_uf_dest;
24mod ii;
25mod ipi;
26mod issqn;
27mod pis;
28mod pis_st;
29
30pub use cofins::*;
31pub use cofins_st::*;
32pub use icms::*;
33pub use icms_uf_dest::*;
34pub use ii::*;
35pub use ipi::*;
36pub use issqn::*;
37pub use pis::*;
38pub use pis_st::*;
39
40use super::Error;
41use serde::{Deserialize, Serialize};
42use std::str::FromStr;
43
44/// Impostos do item da nota fiscal
45///
46/// Contém todos os tributos que podem incidir sobre um produto/serviço na NF-e.
47/// Apenas os grupos aplicáveis à operação devem ser preenchidos.
48///
49/// ## Exemplo de Uso
50///
51/// ```rust
52/// use nfe_parser::Imposto;
53///
54/// let imposto = Imposto {
55///     icms: Some(IcmsContainer::default()),
56///     pis: Some(PisContainer::default()),
57///     cofins: Some(CofinsContainer::default()),
58///     ..Default::default()
59/// };
60/// ```
61#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
62#[serde(rename = "imposto")]
63pub struct Imposto {
64    /// Valor aproximado total de tributos (Lei da Transparência - Lei 12.741/2012)
65    #[serde(rename = "$unflatten=vTotTrib")]
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub valor_aproximado_tributos: Option<f32>,
68
69    /// ICMS - Imposto sobre Circulação de Mercadorias e Serviços
70    #[serde(rename = "ICMS")]
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub icms: Option<IcmsContainer>,
73
74    /// IPI - Imposto sobre Produtos Industrializados
75    #[serde(rename = "IPI")]
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub ipi: Option<IpiContainer>,
78
79    /// II - Imposto de Importação (obrigatório para operações de importação)
80    #[serde(rename = "II")]
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub ii: Option<ImpostoImportacao>,
83
84    /// PIS - Programa de Integração Social
85    #[serde(rename = "PIS")]
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub pis: Option<PisContainer>,
88
89    /// PIS ST - PIS Substituição Tributária
90    #[serde(rename = "PISST")]
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub pis_st: Option<PisSt>,
93
94    /// COFINS - Contribuição para Financiamento da Seguridade Social
95    #[serde(rename = "COFINS")]
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub cofins: Option<CofinsContainer>,
98
99    /// COFINS ST - COFINS Substituição Tributária
100    #[serde(rename = "COFINSST")]
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub cofins_st: Option<CofinsSt>,
103
104    /// ISSQN - Imposto sobre Serviços (substitui o ICMS para serviços)
105    #[serde(rename = "ISSQN")]
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub issqn: Option<Issqn>,
108
109    /// ICMS para UF de Destino - DIFAL (operações interestaduais para consumidor final)
110    #[serde(rename = "ICMSUFDest")]
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub icms_uf_dest: Option<IcmsUfDest>,
113}
114
115impl FromStr for Imposto {
116    type Err = Error;
117
118    fn from_str(s: &str) -> Result<Self, Self::Err> {
119        quick_xml::de::from_str(s).map_err(|e| e.into())
120    }
121}
122
123impl ToString for Imposto {
124    fn to_string(&self) -> String {
125        quick_xml::se::to_string(self).expect("Falha ao serializar o imposto")
126    }
127}
128
129impl Default for Imposto {
130    fn default() -> Self {
131        Self {
132            valor_aproximado_tributos: None,
133            icms: None,
134            ipi: None,
135            ii: None,
136            pis: None,
137            pis_st: None,
138            cofins: None,
139            cofins_st: None,
140            issqn: None,
141            icms_uf_dest: None,
142        }
143    }
144}