Skip to main content

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}