Skip to main content

nfe_parser/base/item/imposto/
icms_uf_dest.rs

1//! ICMS para UF de Destino (DIFAL)
2//!
3//! Este módulo implementa a estrutura para representar o ICMS devido
4//! para a UF de destino nas operações interestaduais destinadas a
5//! consumidor final não contribuinte do ICMS.
6//!
7//! ## Quando Utilizar
8//!
9//! O grupo ICMSUFDest deve ser informado nas operações:
10//! - Interestaduais (UF origem ≠ UF destino)
11//! - Destinadas a consumidor final não contribuinte
12//!
13//! ## Cálculo do DIFAL (EC 87/2015)
14//!
15//! ```text
16//! Base ICMS UF Destino = (Valor Produto + Frete + Seguro + Outros - Desconto) /
17//!                        (1 - (pICMSUFDest + pFCPUFDest) / 100)
18//!
19//! ICMS Interestadual = Base × pICMSInter / 100
20//! Diferença de Alíquota = Base × (pICMSUFDest - pICMSInter) / 100
21//!
22//! vFCPUFDest = Base × pFCPUFDest / 100
23//! vICMSUFDest = Diferença de Alíquota (100% para UF destino desde 2019)
24//! vICMSUFRemet = 0 (0% para UF remetente desde 2019)
25//! ```
26
27use serde::{Deserialize, Serialize};
28
29/// ICMS para UF de Destino - DIFAL (tag `<ICMSUFDest>`)
30///
31/// Grupo de informações do ICMS Interestadual nas operações
32/// destinadas a consumidor final não contribuinte.
33#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
34pub struct IcmsUfDest {
35    /// Valor da Base de Cálculo do ICMS na UF de destino (tag `<vBCUFDest>`)
36    #[serde(rename = "$unflatten=vBCUFDest")]
37    pub valor_bc_uf_dest: f32,
38
39    /// Valor da Base de Cálculo do FCP na UF de destino (tag `<vBCFCPUFDest>`)
40    #[serde(rename = "$unflatten=vBCFCPUFDest")]
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub valor_bc_fcp_uf_dest: Option<f32>,
43
44    /// Percentual do ICMS relativo ao Fundo de Combate à Pobreza na UF de destino (tag `<pFCPUFDest>`)
45    #[serde(rename = "$unflatten=pFCPUFDest")]
46    #[serde(skip_serializing_if = "Option::is_none")]
47    pub percentual_fcp_uf_dest: Option<f32>,
48
49    /// Alíquota interna da UF de destino (tag `<pICMSUFDest>`)
50    #[serde(rename = "$unflatten=pICMSUFDest")]
51    pub aliquota_uf_dest: f32,
52
53    /// Alíquota interestadual das UFs envolvidas (tag `<pICMSInter>`)
54    /// 4% para produtos importados (Resolução 13/2012)
55    /// 7% ou 12% conforme UFs de origem e destino
56    #[serde(rename = "$unflatten=pICMSInter")]
57    pub aliquota_interestadual: f32,
58
59    /// Percentual provisório de partilha do ICMS Interestadual (tag `<pICMSInterPart>`)
60    /// Desde 2019: 100% para UF destino
61    #[serde(rename = "$unflatten=pICMSInterPart")]
62    pub percentual_partilha: f32,
63
64    /// Valor do ICMS relativo ao FCP para a UF de destino (tag `<vFCPUFDest>`)
65    #[serde(rename = "$unflatten=vFCPUFDest")]
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub valor_fcp_uf_dest: Option<f32>,
68
69    /// Valor do ICMS Interestadual para a UF de destino (tag `<vICMSUFDest>`)
70    #[serde(rename = "$unflatten=vICMSUFDest")]
71    pub valor_icms_uf_dest: f32,
72
73    /// Valor do ICMS Interestadual para a UF do remetente (tag `<vICMSUFRemet>`)
74    /// Desde 2019: sempre 0 (zero)
75    #[serde(rename = "$unflatten=vICMSUFRemet")]
76    pub valor_icms_uf_remet: f32,
77}
78
79impl Default for IcmsUfDest {
80    fn default() -> Self {
81        Self {
82            valor_bc_uf_dest: 0.0,
83            valor_bc_fcp_uf_dest: None,
84            percentual_fcp_uf_dest: None,
85            aliquota_uf_dest: 0.0,
86            aliquota_interestadual: 0.0,
87            percentual_partilha: 100.0, // 100% para UF destino desde 2019
88            valor_fcp_uf_dest: None,
89            valor_icms_uf_dest: 0.0,
90            valor_icms_uf_remet: 0.0,
91        }
92    }
93}