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}