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#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, Default)]
48pub struct IcmsContainer {
49    /// ICMS CST 00 - Tributação integral sem redução de BC
50    #[serde(rename = "ICMS00")]
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub icms00: Option<Icms00>,
53
54    /// ICMS CST 10 - Tributação com ICMS por Substituição Tributária
55    #[serde(rename = "ICMS10")]
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub icms10: Option<Icms10>,
58
59    /// ICMS CST 20 - Tributação com redução de base de cálculo
60    #[serde(rename = "ICMS20")]
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub icms20: Option<Icms20>,
63
64    /// ICMS CST 30 - Isenta ou não tributada com cobrança do ICMS por ST
65    #[serde(rename = "ICMS30")]
66    #[serde(skip_serializing_if = "Option::is_none")]
67    pub icms30: Option<Icms30>,
68
69    /// ICMS CST 40 - Isenta
70    #[serde(rename = "ICMS40")]
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub icms40: Option<Icms40>,
73
74    /// ICMS CST 41 - Não tributada
75    #[serde(rename = "ICMS41")]
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub icms41: Option<Icms41>,
78
79    /// ICMS CST 50 - Suspensão
80    #[serde(rename = "ICMS50")]
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub icms50: Option<Icms50>,
83
84    /// ICMS CST 51 - Diferimento
85    #[serde(rename = "ICMS51")]
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub icms51: Option<Icms51>,
88
89    /// ICMS CST 60 - ICMS cobrado anteriormente por Substituição Tributária
90    #[serde(rename = "ICMS60")]
91    #[serde(skip_serializing_if = "Option::is_none")]
92    pub icms60: Option<Icms60>,
93
94    /// ICMS CST 70 - Com redução de BC e cobrança do ICMS por ST
95    #[serde(rename = "ICMS70")]
96    #[serde(skip_serializing_if = "Option::is_none")]
97    pub icms70: Option<Icms70>,
98
99    /// ICMS CST 90 - Outras
100    #[serde(rename = "ICMS90")]
101    #[serde(skip_serializing_if = "Option::is_none")]
102    pub icms90: Option<Icms90>,
103
104    /// ICMS Simples Nacional CSOSN 101 - Tributada com permissão de crédito
105    #[serde(rename = "ICMSSN101")]
106    #[serde(skip_serializing_if = "Option::is_none")]
107    pub icms_sn101: Option<IcmsSn101>,
108
109    /// ICMS Simples Nacional CSOSN 102/103/300/400
110    #[serde(rename = "ICMSSN102")]
111    #[serde(skip_serializing_if = "Option::is_none")]
112    pub icms_sn102: Option<IcmsSn102>,
113
114    /// ICMS Simples Nacional CSOSN 201 - Tributada com permissão de crédito e ST
115    #[serde(rename = "ICMSSN201")]
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub icms_sn201: Option<IcmsSn201>,
118
119    /// ICMS Simples Nacional CSOSN 202/203 - Tributada sem permissão de crédito e ST
120    #[serde(rename = "ICMSSN202")]
121    #[serde(skip_serializing_if = "Option::is_none")]
122    pub icms_sn202: Option<IcmsSn202>,
123
124    /// ICMS Simples Nacional CSOSN 500 - ICMS cobrado anteriormente por ST
125    #[serde(rename = "ICMSSN500")]
126    #[serde(skip_serializing_if = "Option::is_none")]
127    pub icms_sn500: Option<IcmsSn500>,
128
129    /// ICMS Simples Nacional CSOSN 900 - Outros
130    #[serde(rename = "ICMSSN900")]
131    #[serde(skip_serializing_if = "Option::is_none")]
132    pub icms_sn900: Option<IcmsSn900>,
133}
134
135/// ICMS CST 00 - Tributação Integral (tag `<ICMS00>`)
136///
137/// Usado quando o produto é tributado integralmente pelo ICMS,
138/// sem redução de base de cálculo ou substituição tributária.
139#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
140pub struct Icms00 {
141    /// Origem da mercadoria (0-8)
142    #[serde(rename = "$unflatten=orig")]
143    pub origem: u8,
144
145    /// Código de Situação Tributária - sempre "00"
146    #[serde(rename = "$unflatten=CST")]
147    pub cst: String,
148
149    /// Modalidade de determinação da BC do ICMS (0-3)
150    #[serde(rename = "$unflatten=modBC")]
151    pub modalidade_bc: u8,
152
153    /// Valor da Base de Cálculo do ICMS
154    #[serde(rename = "$unflatten=vBC")]
155    pub valor_bc: f32,
156
157    /// Alíquota do ICMS em percentual
158    #[serde(rename = "$unflatten=pICMS")]
159    pub aliquota: f32,
160
161    /// Valor do ICMS
162    #[serde(rename = "$unflatten=vICMS")]
163    pub valor: f32,
164
165    /// Percentual do FCP (Fundo de Combate à Pobreza)
166    #[serde(rename = "$unflatten=pFCP")]
167    #[serde(skip_serializing_if = "Option::is_none")]
168    pub percentual_fcp: Option<f32>,
169
170    /// Valor do FCP
171    #[serde(rename = "$unflatten=vFCP")]
172    #[serde(skip_serializing_if = "Option::is_none")]
173    pub valor_fcp: Option<f32>,
174}
175
176/// ICMS CST 10 - Tributação com ICMS por Substituição Tributária (tag `<ICMS10>`)
177///
178/// Usado quando há tributação normal do ICMS E cobrança antecipada do ICMS
179/// por substituição tributária (ST) para as operações subsequentes.
180#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
181pub struct Icms10 {
182    /// Origem da mercadoria
183    #[serde(rename = "$unflatten=orig")]
184    pub origem: u8,
185
186    /// Código de Situação Tributária - sempre "10"
187    #[serde(rename = "$unflatten=CST")]
188    pub cst: String,
189
190    /// Modalidade de determinação da BC do ICMS
191    #[serde(rename = "$unflatten=modBC")]
192    pub modalidade_bc: u8,
193
194    /// Valor da Base de Cálculo do ICMS próprio
195    #[serde(rename = "$unflatten=vBC")]
196    pub valor_bc: f32,
197
198    /// Alíquota do ICMS próprio em percentual
199    #[serde(rename = "$unflatten=pICMS")]
200    pub aliquota: f32,
201
202    /// Valor do ICMS próprio
203    #[serde(rename = "$unflatten=vICMS")]
204    pub valor: f32,
205
206    /// Percentual do FCP
207    #[serde(rename = "$unflatten=pFCP")]
208    #[serde(skip_serializing_if = "Option::is_none")]
209    pub percentual_fcp: Option<f32>,
210
211    /// Valor do FCP
212    #[serde(rename = "$unflatten=vFCP")]
213    #[serde(skip_serializing_if = "Option::is_none")]
214    pub valor_fcp: Option<f32>,
215
216    /// Modalidade de determinação da BC do ICMS ST (0-5)
217    #[serde(rename = "$unflatten=modBCST")]
218    pub modalidade_bc_st: u8,
219
220    /// Percentual da margem de valor Adicionado do ICMS ST
221    #[serde(rename = "$unflatten=pMVAST")]
222    #[serde(skip_serializing_if = "Option::is_none")]
223    pub percentual_mva_st: Option<f32>,
224
225    /// Percentual de redução da BC do ICMS ST
226    #[serde(rename = "$unflatten=pRedBCST")]
227    #[serde(skip_serializing_if = "Option::is_none")]
228    pub percentual_reducao_bc_st: Option<f32>,
229
230    /// Valor da Base de Cálculo do ICMS ST
231    #[serde(rename = "$unflatten=vBCST")]
232    pub valor_bc_st: f32,
233
234    /// Alíquota do ICMS ST em percentual
235    #[serde(rename = "$unflatten=pICMSST")]
236    pub aliquota_st: f32,
237
238    /// Valor do ICMS ST
239    #[serde(rename = "$unflatten=vICMSST")]
240    pub valor_st: f32,
241
242    /// Percentual do FCP retido por ST
243    #[serde(rename = "$unflatten=pFCPST")]
244    #[serde(skip_serializing_if = "Option::is_none")]
245    pub percentual_fcp_st: Option<f32>,
246
247    /// Valor do FCP retido por ST
248    #[serde(rename = "$unflatten=vFCPST")]
249    #[serde(skip_serializing_if = "Option::is_none")]
250    pub valor_fcp_st: Option<f32>,
251}
252
253/// ICMS CST 20 - Tributação com Redução de Base de Cálculo (tag `<ICMS20>`)
254#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
255pub struct Icms20 {
256    /// Origem da mercadoria
257    #[serde(rename = "$unflatten=orig")]
258    pub origem: u8,
259
260    /// Código de Situação Tributária - sempre "20"
261    #[serde(rename = "$unflatten=CST")]
262    pub cst: String,
263
264    /// Modalidade de determinação da BC do ICMS
265    #[serde(rename = "$unflatten=modBC")]
266    pub modalidade_bc: u8,
267
268    /// Percentual de redução da BC
269    #[serde(rename = "$unflatten=pRedBC")]
270    pub percentual_reducao_bc: f32,
271
272    /// Valor da BC do ICMS JÁ REDUZIDA
273    #[serde(rename = "$unflatten=vBC")]
274    pub valor_bc: f32,
275
276    /// Alíquota do ICMS em percentual
277    #[serde(rename = "$unflatten=pICMS")]
278    pub aliquota: f32,
279
280    /// Valor do ICMS
281    #[serde(rename = "$unflatten=vICMS")]
282    pub valor: f32,
283
284    /// Percentual do FCP
285    #[serde(rename = "$unflatten=pFCP")]
286    #[serde(skip_serializing_if = "Option::is_none")]
287    pub percentual_fcp: Option<f32>,
288
289    /// Valor do FCP
290    #[serde(rename = "$unflatten=vFCP")]
291    #[serde(skip_serializing_if = "Option::is_none")]
292    pub valor_fcp: Option<f32>,
293
294    /// Valor do ICMS desonerado
295    #[serde(rename = "$unflatten=vICMSDeson")]
296    #[serde(skip_serializing_if = "Option::is_none")]
297    pub valor_icms_desonerado: Option<f32>,
298
299    /// Motivo da desoneração (3-12)
300    #[serde(rename = "$unflatten=motDesICMS")]
301    #[serde(skip_serializing_if = "Option::is_none")]
302    pub motivo_desoneracao: Option<u8>,
303}
304
305/// ICMS CST 30 - Isenta ou não tributada com cobrança do ICMS por ST (tag `<ICMS30>`)
306#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
307pub struct Icms30 {
308    /// Origem da mercadoria
309    #[serde(rename = "$unflatten=orig")]
310    pub origem: u8,
311
312    /// Código de Situação Tributária - sempre "30"
313    #[serde(rename = "$unflatten=CST")]
314    pub cst: String,
315
316    /// Modalidade de determinação da BC do ICMS ST
317    #[serde(rename = "$unflatten=modBCST")]
318    pub modalidade_bc_st: u8,
319
320    /// Percentual da margem de valor Adicionado do ICMS ST
321    #[serde(rename = "$unflatten=pMVAST")]
322    #[serde(skip_serializing_if = "Option::is_none")]
323    pub percentual_mva_st: Option<f32>,
324
325    /// Percentual de redução da BC do ICMS ST
326    #[serde(rename = "$unflatten=pRedBCST")]
327    #[serde(skip_serializing_if = "Option::is_none")]
328    pub percentual_reducao_bc_st: Option<f32>,
329
330    /// Valor da Base de Cálculo do ICMS ST
331    #[serde(rename = "$unflatten=vBCST")]
332    pub valor_bc_st: f32,
333
334    /// Alíquota do ICMS ST
335    #[serde(rename = "$unflatten=pICMSST")]
336    pub aliquota_st: f32,
337
338    /// Valor do ICMS ST
339    #[serde(rename = "$unflatten=vICMSST")]
340    pub valor_st: f32,
341
342    /// Percentual do FCP retido por ST
343    #[serde(rename = "$unflatten=pFCPST")]
344    #[serde(skip_serializing_if = "Option::is_none")]
345    pub percentual_fcp_st: Option<f32>,
346
347    /// Valor do FCP retido por ST
348    #[serde(rename = "$unflatten=vFCPST")]
349    #[serde(skip_serializing_if = "Option::is_none")]
350    pub valor_fcp_st: Option<f32>,
351
352    /// Valor do ICMS desonerado
353    #[serde(rename = "$unflatten=vICMSDeson")]
354    #[serde(skip_serializing_if = "Option::is_none")]
355    pub valor_icms_desonerado: Option<f32>,
356
357    /// Motivo da desoneração
358    #[serde(rename = "$unflatten=motDesICMS")]
359    #[serde(skip_serializing_if = "Option::is_none")]
360    pub motivo_desoneracao: Option<u8>,
361}
362
363/// ICMS CST 40 - Isenta (tag `<ICMS40>`)
364#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
365pub struct Icms40 {
366    /// Origem da mercadoria
367    #[serde(rename = "$unflatten=orig")]
368    pub origem: u8,
369
370    /// Código de Situação Tributária - sempre "40"
371    #[serde(rename = "$unflatten=CST")]
372    pub cst: String,
373
374    /// Valor do ICMS desonerado
375    #[serde(rename = "$unflatten=vICMSDeson")]
376    #[serde(skip_serializing_if = "Option::is_none")]
377    pub valor_icms_desonerado: Option<f32>,
378
379    /// Motivo da desoneração (1=Táxi, 3=Produtor Agropecuário, etc.)
380    #[serde(rename = "$unflatten=motDesICMS")]
381    #[serde(skip_serializing_if = "Option::is_none")]
382    pub motivo_desoneracao: Option<u8>,
383}
384
385/// ICMS CST 41 - Não tributada (tag `<ICMS41>`)
386#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
387pub struct Icms41 {
388    /// Origem da mercadoria
389    #[serde(rename = "$unflatten=orig")]
390    pub origem: u8,
391
392    /// Código de Situação Tributária - sempre "41"
393    #[serde(rename = "$unflatten=CST")]
394    pub cst: String,
395
396    /// Valor do ICMS desonerado
397    #[serde(rename = "$unflatten=vICMSDeson")]
398    #[serde(skip_serializing_if = "Option::is_none")]
399    pub valor_icms_desonerado: Option<f32>,
400
401    /// Motivo da desoneração
402    #[serde(rename = "$unflatten=motDesICMS")]
403    #[serde(skip_serializing_if = "Option::is_none")]
404    pub motivo_desoneracao: Option<u8>,
405}
406
407/// ICMS CST 50 - Suspensão (tag `<ICMS50>`)
408#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
409pub struct Icms50 {
410    /// Origem da mercadoria
411    #[serde(rename = "$unflatten=orig")]
412    pub origem: u8,
413
414    /// Código de Situação Tributária - sempre "50"
415    #[serde(rename = "$unflatten=CST")]
416    pub cst: String,
417
418    /// Valor do ICMS desonerado
419    #[serde(rename = "$unflatten=vICMSDeson")]
420    #[serde(skip_serializing_if = "Option::is_none")]
421    pub valor_icms_desonerado: Option<f32>,
422
423    /// Motivo da desoneração
424    #[serde(rename = "$unflatten=motDesICMS")]
425    #[serde(skip_serializing_if = "Option::is_none")]
426    pub motivo_desoneracao: Option<u8>,
427}
428
429/// ICMS CST 51 - Diferimento (tag `<ICMS51>`)
430///
431/// Pode ter tributação parcial com diferimento do restante.
432#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
433pub struct Icms51 {
434    /// Origem da mercadoria
435    #[serde(rename = "$unflatten=orig")]
436    pub origem: u8,
437
438    /// Código de Situação Tributária - sempre "51"
439    #[serde(rename = "$unflatten=CST")]
440    pub cst: String,
441
442    /// Modalidade de determinação da BC do ICMS
443    #[serde(rename = "$unflatten=modBC")]
444    #[serde(skip_serializing_if = "Option::is_none")]
445    pub modalidade_bc: Option<u8>,
446
447    /// Percentual de redução da BC
448    #[serde(rename = "$unflatten=pRedBC")]
449    #[serde(skip_serializing_if = "Option::is_none")]
450    pub percentual_reducao_bc: Option<f32>,
451
452    /// Valor da BC do ICMS
453    #[serde(rename = "$unflatten=vBC")]
454    #[serde(skip_serializing_if = "Option::is_none")]
455    pub valor_bc: Option<f32>,
456
457    /// Alíquota do ICMS
458    #[serde(rename = "$unflatten=pICMS")]
459    #[serde(skip_serializing_if = "Option::is_none")]
460    pub aliquota: Option<f32>,
461
462    /// Valor do ICMS da operação
463    #[serde(rename = "$unflatten=vICMSOp")]
464    #[serde(skip_serializing_if = "Option::is_none")]
465    pub valor_icms_operacao: Option<f32>,
466
467    /// Percentual do diferimento
468    #[serde(rename = "$unflatten=pDif")]
469    #[serde(skip_serializing_if = "Option::is_none")]
470    pub percentual_diferimento: Option<f32>,
471
472    /// Valor do ICMS diferido
473    #[serde(rename = "$unflatten=vICMSDif")]
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub valor_icms_diferido: Option<f32>,
476
477    /// Valor do ICMS realmente devido
478    #[serde(rename = "$unflatten=vICMS")]
479    #[serde(skip_serializing_if = "Option::is_none")]
480    pub valor: Option<f32>,
481
482    /// Percentual do FCP
483    #[serde(rename = "$unflatten=pFCP")]
484    #[serde(skip_serializing_if = "Option::is_none")]
485    pub percentual_fcp: Option<f32>,
486
487    /// Valor do FCP
488    #[serde(rename = "$unflatten=vFCP")]
489    #[serde(skip_serializing_if = "Option::is_none")]
490    pub valor_fcp: Option<f32>,
491}
492
493/// ICMS CST 60 - ICMS cobrado anteriormente por ST (tag `<ICMS60>`)
494///
495/// Usado quando o ICMS já foi retido anteriormente por substituição tributária.
496#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
497pub struct Icms60 {
498    /// Origem da mercadoria
499    #[serde(rename = "$unflatten=orig")]
500    pub origem: u8,
501
502    /// Código de Situação Tributária - sempre "60"
503    #[serde(rename = "$unflatten=CST")]
504    pub cst: String,
505
506    /// Valor da BC do ICMS ST retido anteriormente
507    #[serde(rename = "$unflatten=vBCSTRet")]
508    #[serde(skip_serializing_if = "Option::is_none")]
509    pub valor_bc_st_retido: Option<f32>,
510
511    /// Alíquota suportada pelo consumidor final
512    #[serde(rename = "$unflatten=pST")]
513    #[serde(skip_serializing_if = "Option::is_none")]
514    pub aliquota_st_consumidor: Option<f32>,
515
516    /// Valor do ICMS próprio do substituto
517    #[serde(rename = "$unflatten=vICMSSubstituto")]
518    #[serde(skip_serializing_if = "Option::is_none")]
519    pub valor_icms_substituto: Option<f32>,
520
521    /// Valor do ICMS ST retido anteriormente
522    #[serde(rename = "$unflatten=vICMSSTRet")]
523    #[serde(skip_serializing_if = "Option::is_none")]
524    pub valor_st_retido: Option<f32>,
525
526    /// Valor da BC do FCP retido anteriormente por ST
527    #[serde(rename = "$unflatten=vBCFCPSTRet")]
528    #[serde(skip_serializing_if = "Option::is_none")]
529    pub valor_bc_fcp_st_retido: Option<f32>,
530
531    /// Percentual do FCP retido anteriormente por ST
532    #[serde(rename = "$unflatten=pFCPSTRet")]
533    #[serde(skip_serializing_if = "Option::is_none")]
534    pub percentual_fcp_st_retido: Option<f32>,
535
536    /// Valor do FCP retido por ST
537    #[serde(rename = "$unflatten=vFCPSTRet")]
538    #[serde(skip_serializing_if = "Option::is_none")]
539    pub valor_fcp_st_retido: Option<f32>,
540
541    /// Percentual de redução da BC efetiva
542    #[serde(rename = "$unflatten=pRedBCEfet")]
543    #[serde(skip_serializing_if = "Option::is_none")]
544    pub percentual_reducao_bc_efetiva: Option<f32>,
545
546    /// Valor da BC efetiva
547    #[serde(rename = "$unflatten=vBCEfet")]
548    #[serde(skip_serializing_if = "Option::is_none")]
549    pub valor_bc_efetiva: Option<f32>,
550
551    /// Alíquota do ICMS efetiva
552    #[serde(rename = "$unflatten=pICMSEfet")]
553    #[serde(skip_serializing_if = "Option::is_none")]
554    pub aliquota_efetiva: Option<f32>,
555
556    /// Valor do ICMS efetivo
557    #[serde(rename = "$unflatten=vICMSEfet")]
558    #[serde(skip_serializing_if = "Option::is_none")]
559    pub valor_efetivo: Option<f32>,
560}
561
562/// ICMS CST 70 - Com redução de BC e cobrança do ICMS por ST (tag `<ICMS70>`)
563#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
564pub struct Icms70 {
565    /// Origem da mercadoria
566    #[serde(rename = "$unflatten=orig")]
567    pub origem: u8,
568
569    /// Código de Situação Tributária - sempre "70"
570    #[serde(rename = "$unflatten=CST")]
571    pub cst: String,
572
573    /// Modalidade de determinação da BC do ICMS
574    #[serde(rename = "$unflatten=modBC")]
575    pub modalidade_bc: u8,
576
577    /// Percentual de redução da BC
578    #[serde(rename = "$unflatten=pRedBC")]
579    pub percentual_reducao_bc: f32,
580
581    /// Valor da BC do ICMS
582    #[serde(rename = "$unflatten=vBC")]
583    pub valor_bc: f32,
584
585    /// Alíquota do ICMS
586    #[serde(rename = "$unflatten=pICMS")]
587    pub aliquota: f32,
588
589    /// Valor do ICMS
590    #[serde(rename = "$unflatten=vICMS")]
591    pub valor: f32,
592
593    /// Percentual do FCP
594    #[serde(rename = "$unflatten=pFCP")]
595    #[serde(skip_serializing_if = "Option::is_none")]
596    pub percentual_fcp: Option<f32>,
597
598    /// Valor do FCP
599    #[serde(rename = "$unflatten=vFCP")]
600    #[serde(skip_serializing_if = "Option::is_none")]
601    pub valor_fcp: Option<f32>,
602
603    /// Modalidade de determinação da BC do ICMS ST
604    #[serde(rename = "$unflatten=modBCST")]
605    pub modalidade_bc_st: u8,
606
607    /// Percentual da MVA do ICMS ST
608    #[serde(rename = "$unflatten=pMVAST")]
609    #[serde(skip_serializing_if = "Option::is_none")]
610    pub percentual_mva_st: Option<f32>,
611
612    /// Percentual de redução da BC do ICMS ST
613    #[serde(rename = "$unflatten=pRedBCST")]
614    #[serde(skip_serializing_if = "Option::is_none")]
615    pub percentual_reducao_bc_st: Option<f32>,
616
617    /// Valor da BC do ICMS ST
618    #[serde(rename = "$unflatten=vBCST")]
619    pub valor_bc_st: f32,
620
621    /// Alíquota do ICMS ST
622    #[serde(rename = "$unflatten=pICMSST")]
623    pub aliquota_st: f32,
624
625    /// Valor do ICMS ST
626    #[serde(rename = "$unflatten=vICMSST")]
627    pub valor_st: f32,
628
629    /// Percentual do FCP retido por ST
630    #[serde(rename = "$unflatten=pFCPST")]
631    #[serde(skip_serializing_if = "Option::is_none")]
632    pub percentual_fcp_st: Option<f32>,
633
634    /// Valor do FCP retido por ST
635    #[serde(rename = "$unflatten=vFCPST")]
636    #[serde(skip_serializing_if = "Option::is_none")]
637    pub valor_fcp_st: Option<f32>,
638
639    /// Valor do ICMS desonerado
640    #[serde(rename = "$unflatten=vICMSDeson")]
641    #[serde(skip_serializing_if = "Option::is_none")]
642    pub valor_icms_desonerado: Option<f32>,
643
644    /// Motivo da desoneração
645    #[serde(rename = "$unflatten=motDesICMS")]
646    #[serde(skip_serializing_if = "Option::is_none")]
647    pub motivo_desoneracao: Option<u8>,
648}
649
650/// ICMS CST 90 - Outras (tag `<ICMS90>`)
651///
652/// Usado para situações que não se enquadram nos CSTs anteriores.
653#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
654pub struct Icms90 {
655    /// Origem da mercadoria
656    #[serde(rename = "$unflatten=orig")]
657    pub origem: u8,
658
659    /// Código de Situação Tributária - sempre "90"
660    #[serde(rename = "$unflatten=CST")]
661    pub cst: String,
662
663    /// Modalidade de determinação da BC do ICMS
664    #[serde(rename = "$unflatten=modBC")]
665    #[serde(skip_serializing_if = "Option::is_none")]
666    pub modalidade_bc: Option<u8>,
667
668    /// Percentual de redução da BC
669    #[serde(rename = "$unflatten=pRedBC")]
670    #[serde(skip_serializing_if = "Option::is_none")]
671    pub percentual_reducao_bc: Option<f32>,
672
673    /// Valor da BC do ICMS
674    #[serde(rename = "$unflatten=vBC")]
675    #[serde(skip_serializing_if = "Option::is_none")]
676    pub valor_bc: Option<f32>,
677
678    /// Alíquota do ICMS
679    #[serde(rename = "$unflatten=pICMS")]
680    #[serde(skip_serializing_if = "Option::is_none")]
681    pub aliquota: Option<f32>,
682
683    /// Valor do ICMS
684    #[serde(rename = "$unflatten=vICMS")]
685    #[serde(skip_serializing_if = "Option::is_none")]
686    pub valor: Option<f32>,
687
688    /// Percentual do FCP
689    #[serde(rename = "$unflatten=pFCP")]
690    #[serde(skip_serializing_if = "Option::is_none")]
691    pub percentual_fcp: Option<f32>,
692
693    /// Valor do FCP
694    #[serde(rename = "$unflatten=vFCP")]
695    #[serde(skip_serializing_if = "Option::is_none")]
696    pub valor_fcp: Option<f32>,
697
698    /// Modalidade de determinação da BC do ICMS ST
699    #[serde(rename = "$unflatten=modBCST")]
700    #[serde(skip_serializing_if = "Option::is_none")]
701    pub modalidade_bc_st: Option<u8>,
702
703    /// Percentual da MVA do ICMS ST
704    #[serde(rename = "$unflatten=pMVAST")]
705    #[serde(skip_serializing_if = "Option::is_none")]
706    pub percentual_mva_st: Option<f32>,
707
708    /// Percentual de redução da BC do ICMS ST
709    #[serde(rename = "$unflatten=pRedBCST")]
710    #[serde(skip_serializing_if = "Option::is_none")]
711    pub percentual_reducao_bc_st: Option<f32>,
712
713    /// Valor da BC do ICMS ST
714    #[serde(rename = "$unflatten=vBCST")]
715    #[serde(skip_serializing_if = "Option::is_none")]
716    pub valor_bc_st: Option<f32>,
717
718    /// Alíquota do ICMS ST
719    #[serde(rename = "$unflatten=pICMSST")]
720    #[serde(skip_serializing_if = "Option::is_none")]
721    pub aliquota_st: Option<f32>,
722
723    /// Valor do ICMS ST
724    #[serde(rename = "$unflatten=vICMSST")]
725    #[serde(skip_serializing_if = "Option::is_none")]
726    pub valor_st: Option<f32>,
727
728    /// Percentual do FCP retido por ST
729    #[serde(rename = "$unflatten=pFCPST")]
730    #[serde(skip_serializing_if = "Option::is_none")]
731    pub percentual_fcp_st: Option<f32>,
732
733    /// Valor do FCP retido por ST
734    #[serde(rename = "$unflatten=vFCPST")]
735    #[serde(skip_serializing_if = "Option::is_none")]
736    pub valor_fcp_st: Option<f32>,
737
738    /// Valor do ICMS desonerado
739    #[serde(rename = "$unflatten=vICMSDeson")]
740    #[serde(skip_serializing_if = "Option::is_none")]
741    pub valor_icms_desonerado: Option<f32>,
742
743    /// Motivo da desoneração
744    #[serde(rename = "$unflatten=motDesICMS")]
745    #[serde(skip_serializing_if = "Option::is_none")]
746    pub motivo_desoneracao: Option<u8>,
747}
748
749// ==================== SIMPLES NACIONAL ====================
750
751/// ICMS Simples Nacional CSOSN 101 (tag `<ICMSSN101>`)
752#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
753pub struct IcmsSn101 {
754    /// Origem da mercadoria
755    #[serde(rename = "$unflatten=orig")]
756    pub origem: u8,
757
758    /// Código de Situação da Operação no Simples Nacional - sempre "101"
759    #[serde(rename = "$unflatten=CSOSN")]
760    pub csosn: String,
761
762    /// Alíquota aplicável de cálculo do crédito
763    #[serde(rename = "$unflatten=pCredSN")]
764    pub aliquota_credito_sn: f32,
765
766    /// Valor do crédito do ICMS permitido
767    #[serde(rename = "$unflatten=vCredICMSSN")]
768    pub valor_credito_icms_sn: f32,
769}
770
771/// ICMS Simples Nacional CSOSN 102, 103, 300, 400 (tag `<ICMSSN102>`)
772#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
773pub struct IcmsSn102 {
774    /// Origem da mercadoria
775    #[serde(rename = "$unflatten=orig")]
776    pub origem: u8,
777
778    /// Código de Situação da Operação no Simples Nacional
779    #[serde(rename = "$unflatten=CSOSN")]
780    pub csosn: String,
781}
782
783/// ICMS Simples Nacional CSOSN 201 (tag `<ICMSSN201>`)
784///
785/// Tributada com permissão de crédito e cobrança do ICMS por ST.
786#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
787pub struct IcmsSn201 {
788    /// Origem da mercadoria
789    #[serde(rename = "$unflatten=orig")]
790    pub origem: u8,
791
792    /// CSOSN - sempre "201"
793    #[serde(rename = "$unflatten=CSOSN")]
794    pub csosn: String,
795
796    /// Modalidade de determinação da BC do ICMS ST
797    #[serde(rename = "$unflatten=modBCST")]
798    pub modalidade_bc_st: u8,
799
800    /// Percentual da MVA do ICMS ST
801    #[serde(rename = "$unflatten=pMVAST")]
802    #[serde(skip_serializing_if = "Option::is_none")]
803    pub percentual_mva_st: Option<f32>,
804
805    /// Percentual de redução da BC do ICMS ST
806    #[serde(rename = "$unflatten=pRedBCST")]
807    #[serde(skip_serializing_if = "Option::is_none")]
808    pub percentual_reducao_bc_st: Option<f32>,
809
810    /// Valor da BC do ICMS ST
811    #[serde(rename = "$unflatten=vBCST")]
812    pub valor_bc_st: f32,
813
814    /// Alíquota do ICMS ST
815    #[serde(rename = "$unflatten=pICMSST")]
816    pub aliquota_st: f32,
817
818    /// Valor do ICMS ST
819    #[serde(rename = "$unflatten=vICMSST")]
820    pub valor_st: f32,
821
822    /// Percentual do FCP retido por ST
823    #[serde(rename = "$unflatten=pFCPST")]
824    #[serde(skip_serializing_if = "Option::is_none")]
825    pub percentual_fcp_st: Option<f32>,
826
827    /// Valor do FCP retido por ST
828    #[serde(rename = "$unflatten=vFCPST")]
829    #[serde(skip_serializing_if = "Option::is_none")]
830    pub valor_fcp_st: Option<f32>,
831
832    /// Alíquota aplicável de cálculo do crédito
833    #[serde(rename = "$unflatten=pCredSN")]
834    pub aliquota_credito_sn: f32,
835
836    /// Valor do crédito do ICMS
837    #[serde(rename = "$unflatten=vCredICMSSN")]
838    pub valor_credito_icms_sn: f32,
839}
840
841/// ICMS Simples Nacional CSOSN 202/203 (tag `<ICMSSN202>`)
842///
843/// Tributada sem permissão de crédito e cobrança do ICMS por ST.
844#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
845pub struct IcmsSn202 {
846    /// Origem da mercadoria
847    #[serde(rename = "$unflatten=orig")]
848    pub origem: u8,
849
850    /// CSOSN - "202" ou "203"
851    #[serde(rename = "$unflatten=CSOSN")]
852    pub csosn: String,
853
854    /// Modalidade de determinação da BC do ICMS ST
855    #[serde(rename = "$unflatten=modBCST")]
856    pub modalidade_bc_st: u8,
857
858    /// Percentual da MVA do ICMS ST
859    #[serde(rename = "$unflatten=pMVAST")]
860    #[serde(skip_serializing_if = "Option::is_none")]
861    pub percentual_mva_st: Option<f32>,
862
863    /// Percentual de redução da BC do ICMS ST
864    #[serde(rename = "$unflatten=pRedBCST")]
865    #[serde(skip_serializing_if = "Option::is_none")]
866    pub percentual_reducao_bc_st: Option<f32>,
867
868    /// Valor da BC do ICMS ST
869    #[serde(rename = "$unflatten=vBCST")]
870    pub valor_bc_st: f32,
871
872    /// Alíquota do ICMS ST
873    #[serde(rename = "$unflatten=pICMSST")]
874    pub aliquota_st: f32,
875
876    /// Valor do ICMS ST
877    #[serde(rename = "$unflatten=vICMSST")]
878    pub valor_st: f32,
879
880    /// Percentual do FCP retido por ST
881    #[serde(rename = "$unflatten=pFCPST")]
882    #[serde(skip_serializing_if = "Option::is_none")]
883    pub percentual_fcp_st: Option<f32>,
884
885    /// Valor do FCP retido por ST
886    #[serde(rename = "$unflatten=vFCPST")]
887    #[serde(skip_serializing_if = "Option::is_none")]
888    pub valor_fcp_st: Option<f32>,
889}
890
891/// ICMS Simples Nacional CSOSN 500 (tag `<ICMSSN500>`)
892///
893/// ICMS cobrado anteriormente por substituição tributária.
894#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
895pub struct IcmsSn500 {
896    /// Origem da mercadoria
897    #[serde(rename = "$unflatten=orig")]
898    pub origem: u8,
899
900    /// CSOSN - sempre "500"
901    #[serde(rename = "$unflatten=CSOSN")]
902    pub csosn: String,
903
904    /// Valor da BC do ICMS ST retido anteriormente
905    #[serde(rename = "$unflatten=vBCSTRet")]
906    #[serde(skip_serializing_if = "Option::is_none")]
907    pub valor_bc_st_retido: Option<f32>,
908
909    /// Alíquota suportada pelo consumidor final
910    #[serde(rename = "$unflatten=pST")]
911    #[serde(skip_serializing_if = "Option::is_none")]
912    pub aliquota_st_consumidor: Option<f32>,
913
914    /// Valor do ICMS próprio do substituto
915    #[serde(rename = "$unflatten=vICMSSubstituto")]
916    #[serde(skip_serializing_if = "Option::is_none")]
917    pub valor_icms_substituto: Option<f32>,
918
919    /// Valor do ICMS ST retido
920    #[serde(rename = "$unflatten=vICMSSTRet")]
921    #[serde(skip_serializing_if = "Option::is_none")]
922    pub valor_st_retido: Option<f32>,
923
924    /// Valor da BC do FCP retido anteriormente
925    #[serde(rename = "$unflatten=vBCFCPSTRet")]
926    #[serde(skip_serializing_if = "Option::is_none")]
927    pub valor_bc_fcp_st_retido: Option<f32>,
928
929    /// Percentual do FCP retido anteriormente
930    #[serde(rename = "$unflatten=pFCPSTRet")]
931    #[serde(skip_serializing_if = "Option::is_none")]
932    pub percentual_fcp_st_retido: Option<f32>,
933
934    /// Valor do FCP retido
935    #[serde(rename = "$unflatten=vFCPSTRet")]
936    #[serde(skip_serializing_if = "Option::is_none")]
937    pub valor_fcp_st_retido: Option<f32>,
938
939    /// Percentual de redução da BC efetiva
940    #[serde(rename = "$unflatten=pRedBCEfet")]
941    #[serde(skip_serializing_if = "Option::is_none")]
942    pub percentual_reducao_bc_efetiva: Option<f32>,
943
944    /// Valor da BC efetiva
945    #[serde(rename = "$unflatten=vBCEfet")]
946    #[serde(skip_serializing_if = "Option::is_none")]
947    pub valor_bc_efetiva: Option<f32>,
948
949    /// Alíquota do ICMS efetiva
950    #[serde(rename = "$unflatten=pICMSEfet")]
951    #[serde(skip_serializing_if = "Option::is_none")]
952    pub aliquota_efetiva: Option<f32>,
953
954    /// Valor do ICMS efetivo
955    #[serde(rename = "$unflatten=vICMSEfet")]
956    #[serde(skip_serializing_if = "Option::is_none")]
957    pub valor_efetivo: Option<f32>,
958}
959
960/// ICMS Simples Nacional CSOSN 900 (tag `<ICMSSN900>`)
961///
962/// Outros - situações não previstas nos CSOSNs anteriores.
963#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
964pub struct IcmsSn900 {
965    /// Origem da mercadoria
966    #[serde(rename = "$unflatten=orig")]
967    pub origem: u8,
968
969    /// CSOSN - sempre "900"
970    #[serde(rename = "$unflatten=CSOSN")]
971    pub csosn: String,
972
973    /// Modalidade de determinação da BC do ICMS
974    #[serde(rename = "$unflatten=modBC")]
975    #[serde(skip_serializing_if = "Option::is_none")]
976    pub modalidade_bc: Option<u8>,
977
978    /// Percentual de redução da BC
979    #[serde(rename = "$unflatten=pRedBC")]
980    #[serde(skip_serializing_if = "Option::is_none")]
981    pub percentual_reducao_bc: Option<f32>,
982
983    /// Valor da BC do ICMS
984    #[serde(rename = "$unflatten=vBC")]
985    #[serde(skip_serializing_if = "Option::is_none")]
986    pub valor_bc: Option<f32>,
987
988    /// Alíquota do ICMS
989    #[serde(rename = "$unflatten=pICMS")]
990    #[serde(skip_serializing_if = "Option::is_none")]
991    pub aliquota: Option<f32>,
992
993    /// Valor do ICMS
994    #[serde(rename = "$unflatten=vICMS")]
995    #[serde(skip_serializing_if = "Option::is_none")]
996    pub valor: Option<f32>,
997
998    /// Modalidade de determinação da BC do ICMS ST
999    #[serde(rename = "$unflatten=modBCST")]
1000    #[serde(skip_serializing_if = "Option::is_none")]
1001    pub modalidade_bc_st: Option<u8>,
1002
1003    /// Percentual da MVA do ICMS ST
1004    #[serde(rename = "$unflatten=pMVAST")]
1005    #[serde(skip_serializing_if = "Option::is_none")]
1006    pub percentual_mva_st: Option<f32>,
1007
1008    /// Percentual de redução da BC do ICMS ST
1009    #[serde(rename = "$unflatten=pRedBCST")]
1010    #[serde(skip_serializing_if = "Option::is_none")]
1011    pub percentual_reducao_bc_st: Option<f32>,
1012
1013    /// Valor da BC do ICMS ST
1014    #[serde(rename = "$unflatten=vBCST")]
1015    #[serde(skip_serializing_if = "Option::is_none")]
1016    pub valor_bc_st: Option<f32>,
1017
1018    /// Alíquota do ICMS ST
1019    #[serde(rename = "$unflatten=pICMSST")]
1020    #[serde(skip_serializing_if = "Option::is_none")]
1021    pub aliquota_st: Option<f32>,
1022
1023    /// Valor do ICMS ST
1024    #[serde(rename = "$unflatten=vICMSST")]
1025    #[serde(skip_serializing_if = "Option::is_none")]
1026    pub valor_st: Option<f32>,
1027
1028    /// Percentual do FCP retido por ST
1029    #[serde(rename = "$unflatten=pFCPST")]
1030    #[serde(skip_serializing_if = "Option::is_none")]
1031    pub percentual_fcp_st: Option<f32>,
1032
1033    /// Valor do FCP retido por ST
1034    #[serde(rename = "$unflatten=vFCPST")]
1035    #[serde(skip_serializing_if = "Option::is_none")]
1036    pub valor_fcp_st: Option<f32>,
1037
1038    /// Alíquota aplicável de cálculo do crédito
1039    #[serde(rename = "$unflatten=pCredSN")]
1040    #[serde(skip_serializing_if = "Option::is_none")]
1041    pub aliquota_credito_sn: Option<f32>,
1042
1043    /// Valor do crédito do ICMS
1044    #[serde(rename = "$unflatten=vCredICMSSN")]
1045    #[serde(skip_serializing_if = "Option::is_none")]
1046    pub valor_credito_icms_sn: Option<f32>,
1047}