Skip to main content

nfe_parser/base/item/imposto/
issqn.rs

1//! ISSQN - Imposto sobre Serviços de Qualquer Natureza
2//!
3//! Este módulo implementa a estrutura para representar o ISS na NF-e.
4//!
5//! ## Quando Utilizar
6//!
7//! O grupo ISSQN deve ser informado quando a operação envolver prestação
8//! de serviços sujeitos ao ISS, mesmo em notas que também contenham mercadorias.
9//!
10//! ## Nota Importante
11//!
12//! A presença do grupo ISSQN **substitui** o grupo ICMS para aquele item.
13//! Não devem ser informados ambos os grupos para o mesmo item.
14//!
15//! ## Cálculo
16//!
17//! ```text
18//! vISSQN = vBC × (alíquota ISS / 100)
19//! ```
20
21use serde::{Deserialize, Serialize};
22
23/// ISSQN - Imposto sobre Serviços (tag `<ISSQN>`)
24///
25/// Informar apenas para itens que são serviços sujeitos ao ISS.
26#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
27pub struct Issqn {
28    /// Valor da Base de Cálculo do ISSQN (tag `<vBC>`)
29    #[serde(rename = "$unflatten=vBC")]
30    pub valor_bc: f32,
31
32    /// Alíquota do ISSQN em percentual (tag `<vAliq>`)
33    #[serde(rename = "$unflatten=vAliq")]
34    pub aliquota: f32,
35
36    /// Valor do ISSQN (tag `<vISSQN>`)
37    #[serde(rename = "$unflatten=vISSQN")]
38    pub valor: f32,
39
40    /// Código do município de ocorrência do fato gerador (tag `<cMunFG>`)
41    /// Código IBGE do município
42    #[serde(rename = "$unflatten=cMunFG")]
43    pub codigo_municipio_fato_gerador: String,
44
45    /// Código da Lista de Serviços LC 116/2003 (tag `<cListServ>`)
46    /// Formato: NN.NN (ex: "14.01")
47    #[serde(rename = "$unflatten=cListServ")]
48    pub codigo_lista_servico: String,
49
50    /// Valor dedução para redução da Base de Cálculo (tag `<vDeducao>`)
51    #[serde(rename = "$unflatten=vDeducao")]
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub valor_deducao: Option<f32>,
54
55    /// Valor outras retenções (tag `<vOutro>`)
56    #[serde(rename = "$unflatten=vOutro")]
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub valor_outras_retencoes: Option<f32>,
59
60    /// Valor desconto incondicionado (tag `<vDescIncond>`)
61    #[serde(rename = "$unflatten=vDescIncond")]
62    #[serde(skip_serializing_if = "Option::is_none")]
63    pub valor_desconto_incondicionado: Option<f32>,
64
65    /// Valor desconto condicionado (tag `<vDescCond>`)
66    #[serde(rename = "$unflatten=vDescCond")]
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub valor_desconto_condicionado: Option<f32>,
69
70    /// Valor retenção ISS (tag `<vISSRet>`)
71    #[serde(rename = "$unflatten=vISSRet")]
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub valor_retencao_iss: Option<f32>,
74
75    /// Indicador da exigibilidade do ISS (tag `<indISS>`)
76    /// 1=Exigível, 2=Não incidência, 3=Isenção, 4=Exportação,
77    /// 5=Imunidade, 6=Exigibilidade suspensa por decisão judicial,
78    /// 7=Exigibilidade suspensa por processo administrativo
79    #[serde(rename = "$unflatten=indISS")]
80    pub indicador_exigibilidade: u8,
81
82    /// Código do serviço prestado dentro do município (tag `<cServico>`)
83    #[serde(rename = "$unflatten=cServico")]
84    #[serde(skip_serializing_if = "Option::is_none")]
85    pub codigo_servico_municipio: Option<String>,
86
87    /// Código do município de incidência do imposto (tag `<cMun>`)
88    #[serde(rename = "$unflatten=cMun")]
89    #[serde(skip_serializing_if = "Option::is_none")]
90    pub codigo_municipio_incidencia: Option<String>,
91
92    /// Código do país onde o serviço foi prestado (tag `<cPais>`)
93    #[serde(rename = "$unflatten=cPais")]
94    #[serde(skip_serializing_if = "Option::is_none")]
95    pub codigo_pais: Option<String>,
96
97    /// Número do processo de suspensão (tag `<nProcesso>`)
98    /// Informar quando indISS = 6 ou 7
99    #[serde(rename = "$unflatten=nProcesso")]
100    #[serde(skip_serializing_if = "Option::is_none")]
101    pub numero_processo: Option<String>,
102
103    /// Indicador de incentivo fiscal (tag `<indIncentivo>`)
104    /// 1=Sim, 2=Não
105    #[serde(rename = "$unflatten=indIncentivo")]
106    pub indicador_incentivo_fiscal: u8,
107}
108
109impl Default for Issqn {
110    fn default() -> Self {
111        Self {
112            valor_bc: 0.0,
113            aliquota: 0.0,
114            valor: 0.0,
115            codigo_municipio_fato_gerador: String::new(),
116            codigo_lista_servico: String::new(),
117            valor_deducao: None,
118            valor_outras_retencoes: None,
119            valor_desconto_incondicionado: None,
120            valor_desconto_condicionado: None,
121            valor_retencao_iss: None,
122            indicador_exigibilidade: 1,
123            codigo_servico_municipio: None,
124            codigo_municipio_incidencia: None,
125            codigo_pais: None,
126            numero_processo: None,
127            indicador_incentivo_fiscal: 2,
128        }
129    }
130}