nfe_parser/base/item/imposto/icms.rs
1//! ICMS - Imposto sobre Circulação de Mercadorias e Serviços
2//!
3//! Este módulo implementa as estruturas para representar o ICMS na NF-e,
4//! conforme definido no layout 4.00 da SEFAZ.
5//!
6//! ## Códigos de Situação Tributária (CST)
7//!
8//! Para empresas do **Regime Normal** (Lucro Real/Presumido):
9//!
10//! | CST | Descrição |
11//! |-----|-----------|
12//! | 00 | Tributada integralmente |
13//! | 10 | Tributada com cobrança do ICMS por ST |
14//! | 20 | Com redução de base de cálculo |
15//! | 30 | Isenta ou não tributada com cobrança de ST |
16//! | 40 | Isenta |
17//! | 41 | Não tributada |
18//! | 50 | Suspensão |
19//! | 51 | Diferimento |
20//! | 60 | ICMS cobrado anteriormente por ST |
21//! | 70 | Com redução de BC e cobrança de ST |
22//! | 90 | Outras |
23//!
24//! ## Códigos de Situação da Operação no Simples Nacional (CSOSN)
25//!
26//! Para empresas do **Simples Nacional**:
27//!
28//! | CSOSN | Descrição |
29//! |-------|-----------|
30//! | 101 | Tributada com permissão de crédito |
31//! | 102 | Tributada sem permissão de crédito |
32//! | 103 | Isenção do ICMS para faixa de receita bruta |
33//! | 201 | Tributada com permissão de crédito e ST |
34//! | 202 | Tributada sem permissão de crédito e ST |
35//! | 203 | Isenção do ICMS e ST |
36//! | 300 | Imune |
37//! | 400 | Não tributada pelo Simples Nacional |
38//! | 500 | ICMS cobrado anteriormente por ST |
39//! | 900 | Outros |
40
41use serde::{Deserialize, Serialize};
42
43/// Container para os grupos de ICMS (tag `<ICMS>`)
44///
45/// O ICMS é informado através de grupos exclusivos, onde apenas UM grupo
46/// deve estar presente por item, dependendo do CST/CSOSN aplicável.
47///
48/// ## Grupos Implementados
49///
50/// - **ICMS00**: Tributação integral (CST 00)
51/// - **ICMS10**: Tributação com ST (CST 10)
52/// - **ICMS20**: Com redução de BC (CST 20)
53/// - **ICMSSN101**: Simples Nacional com crédito (CSOSN 101)
54/// - **ICMSSN102**: Simples Nacional sem crédito (CSOSN 102/103/300/400)
55///
56/// ## Nota sobre Implementação
57///
58/// Esta biblioteca implementa os grupos mais comuns. Para suporte completo
59/// a todos os CSTs (30, 40, 41, 50, 51, 60, 70, 90), será necessário
60/// adicionar as estruturas correspondentes.
61#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
62pub struct IcmsContainer {
63 /// ICMS CST 00 - Tributação integral sem redução de BC
64 #[serde(rename = "ICMS00")]
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub icms00: Option<Icms00>,
67
68 /// ICMS CST 10 - Tributação com ICMS por Substituição Tributária
69 #[serde(rename = "ICMS10")]
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub icms10: Option<Icms10>,
72
73 /// ICMS CST 20 - Tributação com redução de base de cálculo
74 #[serde(rename = "ICMS20")]
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub icms20: Option<Icms20>,
77
78 /// ICMS Simples Nacional CSOSN 101 - Tributada com permissão de crédito
79 #[serde(rename = "ICMSSN101")]
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub icms_sn101: Option<IcmsSn101>,
82
83 /// ICMS Simples Nacional CSOSN 102/103/300/400
84 /// Tributada sem permissão de crédito / Isenção / Imune / Não tributada
85 #[serde(rename = "ICMSSN102")]
86 #[serde(skip_serializing_if = "Option::is_none")]
87 pub icms_sn102: Option<IcmsSn102>,
88}
89
90/// ICMS CST 00 - Tributação Integral (tag `<ICMS00>`)
91///
92/// Usado quando o produto é tributado integralmente pelo ICMS,
93/// sem redução de base de cálculo ou substituição tributária.
94///
95/// ## Cálculo
96///
97/// ```text
98/// vICMS = vBC × pICMS / 100
99/// ```
100#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
101pub struct Icms00 {
102 /// Origem da mercadoria (tag `<orig>`)
103 /// 0=Nacional, 1=Estrangeira importação direta, 2=Estrangeira adq. mercado interno
104 /// 3 a 8: Nacionais com conteúdo de importação específico
105 #[serde(rename = "$unflatten=orig")]
106 pub origem: u8,
107
108 /// Código de Situação Tributária (tag `<CST>`)
109 /// Para ICMS00, sempre será "00"
110 #[serde(rename = "$unflatten=CST")]
111 pub cst: String,
112
113 /// Modalidade de determinação da BC do ICMS (tag `<modBC>`)
114 /// 0=Margem Valor Agregado (%), 1=Pauta (Valor), 2=Preço Tabelado Max.,
115 /// 3=Valor da operação
116 #[serde(rename = "$unflatten=modBC")]
117 pub modalidade_bc: u8,
118
119 /// Valor da Base de Cálculo do ICMS (tag `<vBC>`)
120 #[serde(rename = "$unflatten=vBC")]
121 pub valor_bc: f32,
122
123 /// Alíquota do ICMS em percentual (tag `<pICMS>`)
124 /// Ex: 18.00 para 18%
125 #[serde(rename = "$unflatten=pICMS")]
126 pub aliquota: f32,
127
128 /// Valor do ICMS (tag `<vICMS>`)
129 /// Calculado: vBC × pICMS / 100
130 #[serde(rename = "$unflatten=vICMS")]
131 pub valor: f32,
132}
133
134/// ICMS CST 10 - Tributação com ICMS por Substituição Tributária (tag `<ICMS10>`)
135///
136/// Usado quando há tributação normal do ICMS E cobrança antecipada do ICMS
137/// por substituição tributária (ST) para as operações subsequentes.
138///
139/// ## Nota
140///
141/// Esta estrutura representa apenas a parte da operação própria.
142/// Os campos de ST (vBCST, pICMSST, vICMSST) devem ser adicionados
143/// conforme necessidade.
144#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
145pub struct Icms10 {
146 /// Origem da mercadoria
147 #[serde(rename = "$unflatten=orig")]
148 pub origem: u8,
149
150 /// Código de Situação Tributária - sempre "10"
151 #[serde(rename = "$unflatten=CST")]
152 pub cst: String,
153
154 /// Modalidade de determinação da BC do ICMS
155 #[serde(rename = "$unflatten=modBC")]
156 pub modalidade_bc: u8,
157
158 /// Valor da Base de Cálculo do ICMS próprio
159 #[serde(rename = "$unflatten=vBC")]
160 pub valor_bc: f32,
161
162 /// Alíquota do ICMS próprio em percentual
163 #[serde(rename = "$unflatten=pICMS")]
164 pub aliquota: f32,
165
166 /// Valor do ICMS próprio
167 #[serde(rename = "$unflatten=vICMS")]
168 pub valor: f32,
169}
170
171/// ICMS CST 20 - Tributação com Redução de Base de Cálculo (tag `<ICMS20>`)
172///
173/// Usado quando há benefício fiscal que reduz a base de cálculo do ICMS.
174/// A redução é aplicada ANTES do cálculo do imposto.
175///
176/// ## Cálculo
177///
178/// ```text
179/// vBC_reduzida = vBC_original × (1 - pRedBC/100)
180/// vICMS = vBC_reduzida × pICMS / 100
181/// ```
182#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
183pub struct Icms20 {
184 /// Origem da mercadoria
185 #[serde(rename = "$unflatten=orig")]
186 pub origem: u8,
187
188 /// Código de Situação Tributária - sempre "20"
189 #[serde(rename = "$unflatten=CST")]
190 pub cst: String,
191
192 /// Modalidade de determinação da BC do ICMS
193 #[serde(rename = "$unflatten=modBC")]
194 pub modalidade_bc: u8,
195
196 /// Percentual de redução da BC (tag `<pRedBC>`)
197 /// Ex: 33.33 para redução de 33,33%
198 #[serde(rename = "$unflatten=pRedBC")]
199 pub percentual_reducao_bc: f32,
200
201 /// Valor da BC do ICMS JÁ REDUZIDA
202 #[serde(rename = "$unflatten=vBC")]
203 pub valor_bc: f32,
204
205 /// Alíquota do ICMS em percentual
206 #[serde(rename = "$unflatten=pICMS")]
207 pub aliquota: f32,
208
209 /// Valor do ICMS calculado sobre a BC reduzida
210 #[serde(rename = "$unflatten=vICMS")]
211 pub valor: f32,
212}
213
214/// ICMS Simples Nacional CSOSN 101 (tag `<ICMSSN101>`)
215///
216/// Usado por empresas do Simples Nacional quando a operação
217/// permite aproveitamento de crédito de ICMS pelo destinatário.
218///
219/// ## Quando Usar
220///
221/// - Venda para contribuinte do ICMS (não consumidor final)
222/// - Operação tributada pelo Simples Nacional
223/// - Empresa dentro do sublimite estadual para crédito
224///
225/// ## Cálculo do Crédito
226///
227/// O crédito é calculado sobre o valor do produto usando a alíquota
228/// efetiva do ICMS no Simples Nacional (varia conforme faturamento).
229#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
230pub struct IcmsSn101 {
231 /// Origem da mercadoria
232 #[serde(rename = "$unflatten=orig")]
233 pub origem: u8,
234
235 /// Código de Situação da Operação no Simples Nacional
236 /// Para esta estrutura, sempre "101"
237 #[serde(rename = "$unflatten=CSOSN")]
238 pub csosn: String,
239
240 /// Alíquota aplicável de cálculo do crédito (tag `<pCredSN>`)
241 /// Corresponde à alíquota efetiva do ICMS no Simples Nacional
242 #[serde(rename = "$unflatten=pCredSN")]
243 pub aliquota_credito_sn: f32,
244
245 /// Valor do crédito do ICMS permitido (tag `<vCredICMSSN>`)
246 /// Calculado: valor_produtos × pCredSN / 100
247 #[serde(rename = "$unflatten=vCredICMSSN")]
248 pub valor_credito_icms_sn: f32,
249}
250
251/// ICMS Simples Nacional CSOSN 102, 103, 300, 400 (tag `<ICMSSN102>`)
252///
253/// Usado por empresas do Simples Nacional em operações que NÃO
254/// permitem aproveitamento de crédito pelo destinatário.
255///
256/// ## CSOSNs Cobertos
257///
258/// | CSOSN | Descrição |
259/// |-------|-----------|
260/// | 102 | Tributada sem permissão de crédito |
261/// | 103 | Isenção do ICMS para faixa de receita bruta |
262/// | 300 | Imune |
263/// | 400 | Não tributada pelo Simples Nacional |
264#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
265pub struct IcmsSn102 {
266 /// Origem da mercadoria
267 #[serde(rename = "$unflatten=orig")]
268 pub origem: u8,
269
270 /// Código de Situação da Operação no Simples Nacional
271 /// Pode ser: "102", "103", "300" ou "400"
272 #[serde(rename = "$unflatten=CSOSN")]
273 pub csosn: String,
274}