1use serde::{Deserialize, Serialize};
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct Nfse {
23 pub identificacao: IdentificacaoNfse,
25 pub prestador: PrestadorServico,
27 pub tomador: Option<TomadorServico>,
29 pub intermediario: Option<IntermediarioServico>,
31 pub servico: ServicoNfse,
33 pub valores: ValoresNfse,
35 pub informacoes_complementares: Option<String>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct IdentificacaoNfse {
42 pub numero: u64,
44 pub codigo_verificacao: String,
46 pub data_emissao: String,
48 pub competencia: String,
50 pub numero_rps: Option<u64>,
52 pub serie_rps: Option<String>,
54 pub tipo_rps: Option<u8>,
56 pub natureza_operacao: NaturezaOperacaoNfse,
58 pub regime_especial: Option<RegimeEspecialNfse>,
60 pub optante_simples_nacional: bool,
62 pub incentivador_cultural: bool,
64 pub status: StatusNfse,
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
70#[repr(u8)]
71pub enum NaturezaOperacaoNfse {
72 TributacaoMunicipio = 1,
74 TributacaoForaMunicipio = 2,
76 Isencao = 3,
78 Imune = 4,
80 SuspensaJudicial = 5,
82 SuspensaAdministrativo = 6,
84}
85
86#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
88#[repr(u8)]
89pub enum RegimeEspecialNfse {
90 MicroempresaMunicipal = 1,
92 Estimativa = 2,
94 SociedadeProfissionais = 3,
96 Cooperativa = 4,
98 Mei = 5,
100 MeEppSimplesNacional = 6,
102}
103
104#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
106pub enum StatusNfse {
107 Normal,
109 Cancelada,
111 Substituida,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct PrestadorServico {
118 pub cnpj: String,
120 pub inscricao_municipal: Option<String>,
122 pub razao_social: String,
124 pub nome_fantasia: Option<String>,
126 pub endereco: EnderecoNfse,
128 pub telefone: Option<String>,
130 pub email: Option<String>,
132}
133
134#[derive(Debug, Clone, Serialize, Deserialize)]
136pub struct TomadorServico {
137 pub tipo_documento: u8,
139 pub documento: String,
141 pub inscricao_municipal: Option<String>,
143 pub inscricao_estadual: Option<String>,
145 pub razao_social: String,
147 pub endereco: Option<EnderecoNfse>,
149 pub telefone: Option<String>,
151 pub email: Option<String>,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
157pub struct IntermediarioServico {
158 pub tipo_documento: u8,
160 pub documento: String,
162 pub razao_social: String,
164 pub inscricao_municipal: Option<String>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct EnderecoNfse {
171 pub logradouro: String,
173 pub numero: String,
175 pub complemento: Option<String>,
177 pub bairro: String,
179 pub codigo_municipio: String,
181 pub municipio: String,
183 pub uf: String,
185 pub cep: String,
187 pub codigo_pais: Option<String>,
189}
190
191#[derive(Debug, Clone, Serialize, Deserialize)]
193pub struct ServicoNfse {
194 pub codigo_servico: String,
196 pub codigo_cnae: Option<String>,
198 pub codigo_servico_municipio: Option<String>,
200 pub codigo_tributacao_municipio: Option<String>,
202 pub discriminacao: String,
204 pub municipio_prestacao: String,
206 pub codigo_pais: Option<String>,
208 pub codigo_obra: Option<String>,
210 pub art: Option<String>,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize)]
216pub struct ValoresNfse {
217 pub valor_servicos: f32,
219 pub valor_deducoes: f32,
221 pub valor_pis: f32,
223 pub valor_cofins: f32,
225 pub valor_inss: f32,
227 pub valor_ir: f32,
229 pub valor_csll: f32,
231 pub outras_retencoes: f32,
233 pub valor_iss: f32,
235 pub aliquota_iss: f32,
237 pub desconto_incondicionado: f32,
239 pub desconto_condicionado: f32,
241 pub base_calculo: f32,
243 pub valor_liquido: f32,
245 pub iss_retido: bool,
247 pub valor_iss_retido: f32,
249 pub responsavel_retencao: Option<u8>,
251}
252
253impl Default for ValoresNfse {
254 fn default() -> Self {
255 Self {
256 valor_servicos: 0.0,
257 valor_deducoes: 0.0,
258 valor_pis: 0.0,
259 valor_cofins: 0.0,
260 valor_inss: 0.0,
261 valor_ir: 0.0,
262 valor_csll: 0.0,
263 outras_retencoes: 0.0,
264 valor_iss: 0.0,
265 aliquota_iss: 0.0,
266 desconto_incondicionado: 0.0,
267 desconto_condicionado: 0.0,
268 base_calculo: 0.0,
269 valor_liquido: 0.0,
270 iss_retido: false,
271 valor_iss_retido: 0.0,
272 responsavel_retencao: None,
273 }
274 }
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize)]
279pub struct Rps {
280 pub identificacao: IdentificacaoRps,
282 pub data_emissao: String,
284 pub status: u8,
286 pub rps_substituido: Option<IdentificacaoRps>,
288}
289
290#[derive(Debug, Clone, Serialize, Deserialize)]
292pub struct IdentificacaoRps {
293 pub numero: u64,
295 pub serie: String,
297 pub tipo: u8,
299}
300
301#[derive(Debug, Clone, Serialize, Deserialize)]
303pub struct LoteRps {
304 pub numero_lote: String,
306 pub cnpj_prestador: String,
308 pub inscricao_municipal_prestador: String,
310 pub quantidade_rps: u32,
312 pub lista_rps: Vec<RpsCompleto>,
314}
315
316#[derive(Debug, Clone, Serialize, Deserialize)]
318pub struct RpsCompleto {
319 pub rps: Rps,
321 pub prestador: PrestadorServico,
323 pub tomador: Option<TomadorServico>,
325 pub servico: ServicoNfse,
327 pub valores: ValoresNfse,
329}
330
331#[derive(Debug, Clone, Serialize, Deserialize)]
333pub struct RespostaConsultaNfse {
334 pub sucesso: bool,
336 pub mensagem: Option<String>,
338 pub nfses: Vec<Nfse>,
340}
341
342#[derive(Debug, Clone, Serialize, Deserialize)]
344pub struct RespostaEnvioLote {
345 pub numero_lote: String,
347 pub protocolo: Option<String>,
349 pub data_recebimento: Option<String>,
351 pub situacao: u8,
353 pub mensagens: Vec<MensagemRetorno>,
355}
356
357#[derive(Debug, Clone, Serialize, Deserialize)]
359pub struct MensagemRetorno {
360 pub codigo: String,
362 pub mensagem: String,
364 pub correcao: Option<String>,
366}
367
368pub fn calcular_valores_nfse(
370 valor_servicos: f32,
371 aliquota_iss: f32,
372 valor_deducoes: f32,
373 iss_retido: bool,
374 aliquota_pis: Option<f32>,
375 aliquota_cofins: Option<f32>,
376 aliquota_inss: Option<f32>,
377 aliquota_ir: Option<f32>,
378 aliquota_csll: Option<f32>,
379) -> ValoresNfse {
380 let base_calculo = valor_servicos - valor_deducoes;
381 let valor_iss = base_calculo * (aliquota_iss / 100.0);
382
383 let valor_pis = aliquota_pis.map(|a| base_calculo * (a / 100.0)).unwrap_or(0.0);
384 let valor_cofins = aliquota_cofins.map(|a| base_calculo * (a / 100.0)).unwrap_or(0.0);
385 let valor_inss = aliquota_inss.map(|a| base_calculo * (a / 100.0)).unwrap_or(0.0);
386 let valor_ir = aliquota_ir.map(|a| base_calculo * (a / 100.0)).unwrap_or(0.0);
387 let valor_csll = aliquota_csll.map(|a| base_calculo * (a / 100.0)).unwrap_or(0.0);
388
389 let valor_iss_retido = if iss_retido { valor_iss } else { 0.0 };
390 let outras_retencoes = valor_pis + valor_cofins + valor_inss + valor_ir + valor_csll;
391
392 let valor_liquido = valor_servicos - valor_iss_retido - outras_retencoes;
393
394 ValoresNfse {
395 valor_servicos,
396 valor_deducoes,
397 valor_pis,
398 valor_cofins,
399 valor_inss,
400 valor_ir,
401 valor_csll,
402 outras_retencoes,
403 valor_iss,
404 aliquota_iss,
405 desconto_incondicionado: 0.0,
406 desconto_condicionado: 0.0,
407 base_calculo,
408 valor_liquido,
409 iss_retido,
410 valor_iss_retido,
411 responsavel_retencao: if iss_retido { Some(2) } else { None }, }
413}