Skip to main content

nfe_parser/base/
municipios.rs

1//! Tabela de Municípios IBGE
2//!
3//! Este módulo contém os códigos IBGE e configurações fiscais dos municípios brasileiros,
4//! com foco especial nos municípios de São Paulo.
5
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9/// Informações de um município
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Municipio {
12    /// Código IBGE do município (7 dígitos)
13    pub codigo_ibge: String,
14    /// Nome do município
15    pub nome: String,
16    /// Sigla da UF
17    pub uf: String,
18    /// Código da UF (2 dígitos)
19    pub codigo_uf: u8,
20    /// Alíquota padrão de ISS (%)
21    pub aliquota_iss_padrao: f32,
22    /// Alíquota mínima de ISS (%)
23    pub aliquota_iss_minima: f32,
24    /// Alíquota máxima de ISS (%)
25    pub aliquota_iss_maxima: f32,
26    /// Sistema de NFS-e utilizado
27    pub sistema_nfse: Option<SistemaNfse>,
28    /// URL do WebService de NFS-e (se disponível)
29    pub url_nfse: Option<String>,
30}
31
32/// Sistemas de NFS-e utilizados pelas prefeituras
33#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
34pub enum SistemaNfse {
35    /// ABRASF versão 1.0
36    Abrasf1,
37    /// ABRASF versão 2.0/2.04
38    Abrasf2,
39    /// Ginfes (Tecnos)
40    Ginfes,
41    /// IPM Sistemas
42    Ipm,
43    /// ISSNet
44    IssNet,
45    /// Betha Sistemas
46    Betha,
47    /// GISS Online
48    GissOnline,
49    /// Simpliss
50    Simpliss,
51    /// EL (E&L Produções de Software)
52    El,
53    /// Outro sistema proprietário
54    Outro(String),
55}
56
57/// Configurações fiscais de uma UF
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct ConfiguracaoUf {
60    /// Sigla da UF
61    pub uf: String,
62    /// Código da UF
63    pub codigo: u8,
64    /// Alíquota interna padrão de ICMS (%)
65    pub aliquota_icms_interna: f32,
66    /// Alíquota do FCP (Fundo de Combate à Pobreza) - se aplicável
67    pub aliquota_fcp: Option<f32>,
68    /// Alíquota interestadual para Sul/Sudeste (exceto ES)
69    pub aliquota_interestadual_sul_sudeste: f32,
70    /// Alíquota interestadual para demais estados
71    pub aliquota_interestadual_demais: f32,
72    /// Alíquota para produtos importados (Resolução 13/2012)
73    pub aliquota_importados: f32,
74}
75
76/// Tabela de alíquotas de ISS por código de serviço (LC 116/2003)
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct AliquotaIss {
79    /// Código do serviço (ex: "7.02")
80    pub codigo_servico: String,
81    /// Descrição do serviço
82    pub descricao: String,
83    /// Alíquota de ISS (%)
84    pub aliquota: f32,
85    /// ISS retido na fonte?
86    pub retencao: bool,
87}
88
89/// Retorna as configurações do município de Matão-SP
90pub fn matao() -> Municipio {
91    Municipio {
92        codigo_ibge: "3529302".to_string(),
93        nome: "Matão".to_string(),
94        uf: "SP".to_string(),
95        codigo_uf: 35,
96        aliquota_iss_padrao: 5.0,
97        aliquota_iss_minima: 2.0,
98        aliquota_iss_maxima: 5.0,
99        sistema_nfse: Some(SistemaNfse::GissOnline),
100        url_nfse: Some("https://matao.gissdigital.com.br".to_string()),
101    }
102}
103
104/// Retorna as configurações do município de Araraquara-SP
105pub fn araraquara() -> Municipio {
106    Municipio {
107        codigo_ibge: "3503208".to_string(),
108        nome: "Araraquara".to_string(),
109        uf: "SP".to_string(),
110        codigo_uf: 35,
111        aliquota_iss_padrao: 5.0,
112        aliquota_iss_minima: 2.0,
113        aliquota_iss_maxima: 5.0,
114        sistema_nfse: Some(SistemaNfse::GissOnline),
115        url_nfse: Some("https://araraquara.gissdigital.com.br".to_string()),
116    }
117}
118
119/// Retorna as configurações fiscais do estado de São Paulo
120pub fn sao_paulo_uf() -> ConfiguracaoUf {
121    ConfiguracaoUf {
122        uf: "SP".to_string(),
123        codigo: 35,
124        aliquota_icms_interna: 18.0,
125        aliquota_fcp: None, // SP não tem FCP
126        aliquota_interestadual_sul_sudeste: 12.0,
127        aliquota_interestadual_demais: 7.0,
128        aliquota_importados: 4.0,
129    }
130}
131
132/// Tabela de alíquotas de ISS para Matão-SP
133pub fn aliquotas_iss_matao() -> Vec<AliquotaIss> {
134    vec![
135        // Construção Civil
136        AliquotaIss {
137            codigo_servico: "7.02".to_string(),
138            descricao: "Execução de obras de construção civil".to_string(),
139            aliquota: 3.0,
140            retencao: true,
141        },
142        AliquotaIss {
143            codigo_servico: "7.04".to_string(),
144            descricao: "Demolição".to_string(),
145            aliquota: 3.0,
146            retencao: true,
147        },
148        AliquotaIss {
149            codigo_servico: "7.05".to_string(),
150            descricao: "Reparação, conservação e reforma de edifícios".to_string(),
151            aliquota: 3.0,
152            retencao: true,
153        },
154        AliquotaIss {
155            codigo_servico: "7.19".to_string(),
156            descricao: "Acompanhamento e fiscalização de obras".to_string(),
157            aliquota: 3.0,
158            retencao: false,
159        },
160        // Informática
161        AliquotaIss {
162            codigo_servico: "1.01".to_string(),
163            descricao: "Análise e desenvolvimento de sistemas".to_string(),
164            aliquota: 2.0,
165            retencao: false,
166        },
167        AliquotaIss {
168            codigo_servico: "1.02".to_string(),
169            descricao: "Programação".to_string(),
170            aliquota: 2.0,
171            retencao: false,
172        },
173        AliquotaIss {
174            codigo_servico: "1.03".to_string(),
175            descricao: "Processamento de dados".to_string(),
176            aliquota: 2.0,
177            retencao: false,
178        },
179        AliquotaIss {
180            codigo_servico: "1.04".to_string(),
181            descricao: "Elaboração de programas de computadores".to_string(),
182            aliquota: 2.0,
183            retencao: false,
184        },
185        AliquotaIss {
186            codigo_servico: "1.05".to_string(),
187            descricao: "Licenciamento de software".to_string(),
188            aliquota: 2.0,
189            retencao: false,
190        },
191        // Saúde
192        AliquotaIss {
193            codigo_servico: "4.01".to_string(),
194            descricao: "Medicina e biomedicina".to_string(),
195            aliquota: 3.0,
196            retencao: false,
197        },
198        AliquotaIss {
199            codigo_servico: "4.02".to_string(),
200            descricao: "Análises clínicas".to_string(),
201            aliquota: 3.0,
202            retencao: false,
203        },
204        AliquotaIss {
205            codigo_servico: "4.03".to_string(),
206            descricao: "Hospitais, clínicas e similares".to_string(),
207            aliquota: 3.0,
208            retencao: false,
209        },
210        // Educação
211        AliquotaIss {
212            codigo_servico: "8.01".to_string(),
213            descricao: "Ensino regular pré-escolar, fundamental, médio e superior".to_string(),
214            aliquota: 2.0,
215            retencao: false,
216        },
217        AliquotaIss {
218            codigo_servico: "8.02".to_string(),
219            descricao: "Instrução, treinamento, cursos".to_string(),
220            aliquota: 3.0,
221            retencao: false,
222        },
223        // Transporte
224        AliquotaIss {
225            codigo_servico: "16.01".to_string(),
226            descricao: "Transporte de natureza municipal".to_string(),
227            aliquota: 5.0,
228            retencao: false,
229        },
230        // Serviços gerais
231        AliquotaIss {
232            codigo_servico: "17.01".to_string(),
233            descricao: "Assessoria ou consultoria".to_string(),
234            aliquota: 5.0,
235            retencao: false,
236        },
237        AliquotaIss {
238            codigo_servico: "17.02".to_string(),
239            descricao: "Datilografia, digitação, estenografia".to_string(),
240            aliquota: 5.0,
241            retencao: false,
242        },
243        // Exploração de rodovia
244        AliquotaIss {
245            codigo_servico: "22.01".to_string(),
246            descricao: "Exploração de rodovia mediante cobrança de pedágio".to_string(),
247            aliquota: 3.0,
248            retencao: false,
249        },
250    ]
251}
252
253/// Tabela de alíquotas de ISS para Araraquara-SP
254pub fn aliquotas_iss_araraquara() -> Vec<AliquotaIss> {
255    vec![
256        // Construção Civil - Alíquota reduzida (LC 793)
257        AliquotaIss {
258            codigo_servico: "7.02".to_string(),
259            descricao: "Execução de obras de construção civil".to_string(),
260            aliquota: 2.0, // Alíquota reduzida conforme LC 793
261            retencao: true,
262        },
263        AliquotaIss {
264            codigo_servico: "7.04".to_string(),
265            descricao: "Demolição".to_string(),
266            aliquota: 3.0,
267            retencao: true,
268        },
269        AliquotaIss {
270            codigo_servico: "7.05".to_string(),
271            descricao: "Reparação, conservação e reforma de edifícios".to_string(),
272            aliquota: 3.0,
273            retencao: true,
274        },
275        AliquotaIss {
276            codigo_servico: "7.19".to_string(),
277            descricao: "Acompanhamento e fiscalização de obras".to_string(),
278            aliquota: 2.0, // Alíquota reduzida conforme LC 793
279            retencao: false,
280        },
281        // Informática
282        AliquotaIss {
283            codigo_servico: "1.01".to_string(),
284            descricao: "Análise e desenvolvimento de sistemas".to_string(),
285            aliquota: 2.0,
286            retencao: false,
287        },
288        AliquotaIss {
289            codigo_servico: "1.02".to_string(),
290            descricao: "Programação".to_string(),
291            aliquota: 2.0,
292            retencao: false,
293        },
294        AliquotaIss {
295            codigo_servico: "1.03".to_string(),
296            descricao: "Processamento de dados".to_string(),
297            aliquota: 2.0,
298            retencao: false,
299        },
300        AliquotaIss {
301            codigo_servico: "1.04".to_string(),
302            descricao: "Elaboração de programas de computadores".to_string(),
303            aliquota: 2.0,
304            retencao: false,
305        },
306        AliquotaIss {
307            codigo_servico: "1.05".to_string(),
308            descricao: "Licenciamento de software".to_string(),
309            aliquota: 2.0,
310            retencao: false,
311        },
312        // Saúde
313        AliquotaIss {
314            codigo_servico: "4.01".to_string(),
315            descricao: "Medicina e biomedicina".to_string(),
316            aliquota: 3.0,
317            retencao: false,
318        },
319        AliquotaIss {
320            codigo_servico: "4.02".to_string(),
321            descricao: "Análises clínicas".to_string(),
322            aliquota: 3.0,
323            retencao: false,
324        },
325        AliquotaIss {
326            codigo_servico: "4.03".to_string(),
327            descricao: "Hospitais, clínicas e similares".to_string(),
328            aliquota: 3.0,
329            retencao: false,
330        },
331        // Educação
332        AliquotaIss {
333            codigo_servico: "8.01".to_string(),
334            descricao: "Ensino regular".to_string(),
335            aliquota: 2.0,
336            retencao: false,
337        },
338        AliquotaIss {
339            codigo_servico: "8.02".to_string(),
340            descricao: "Instrução, treinamento, cursos".to_string(),
341            aliquota: 3.0,
342            retencao: false,
343        },
344        // Transporte
345        AliquotaIss {
346            codigo_servico: "16.01".to_string(),
347            descricao: "Transporte de natureza municipal".to_string(),
348            aliquota: 5.0,
349            retencao: false,
350        },
351        // Serviços gerais
352        AliquotaIss {
353            codigo_servico: "17.01".to_string(),
354            descricao: "Assessoria ou consultoria".to_string(),
355            aliquota: 5.0,
356            retencao: false,
357        },
358    ]
359}
360
361/// Tabela de alíquotas internas de ICMS por UF (2024-2026)
362pub fn aliquotas_icms_por_uf() -> HashMap<String, ConfiguracaoUf> {
363    let mut mapa = HashMap::new();
364
365    // Região Norte
366    mapa.insert("AC".to_string(), ConfiguracaoUf {
367        uf: "AC".to_string(), codigo: 12, aliquota_icms_interna: 19.0,
368        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
369        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
370    });
371    mapa.insert("AM".to_string(), ConfiguracaoUf {
372        uf: "AM".to_string(), codigo: 13, aliquota_icms_interna: 20.0,
373        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
374        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
375    });
376    mapa.insert("AP".to_string(), ConfiguracaoUf {
377        uf: "AP".to_string(), codigo: 16, aliquota_icms_interna: 18.0,
378        aliquota_fcp: None, aliquota_interestadual_sul_sudeste: 12.0,
379        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
380    });
381    mapa.insert("PA".to_string(), ConfiguracaoUf {
382        uf: "PA".to_string(), codigo: 15, aliquota_icms_interna: 19.0,
383        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
384        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
385    });
386    mapa.insert("RO".to_string(), ConfiguracaoUf {
387        uf: "RO".to_string(), codigo: 11, aliquota_icms_interna: 19.5,
388        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
389        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
390    });
391    mapa.insert("RR".to_string(), ConfiguracaoUf {
392        uf: "RR".to_string(), codigo: 14, aliquota_icms_interna: 20.0,
393        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
394        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
395    });
396    mapa.insert("TO".to_string(), ConfiguracaoUf {
397        uf: "TO".to_string(), codigo: 17, aliquota_icms_interna: 20.0,
398        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
399        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
400    });
401
402    // Região Nordeste
403    mapa.insert("AL".to_string(), ConfiguracaoUf {
404        uf: "AL".to_string(), codigo: 27, aliquota_icms_interna: 19.0,
405        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
406        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
407    });
408    mapa.insert("BA".to_string(), ConfiguracaoUf {
409        uf: "BA".to_string(), codigo: 29, aliquota_icms_interna: 20.5,
410        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
411        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
412    });
413    mapa.insert("CE".to_string(), ConfiguracaoUf {
414        uf: "CE".to_string(), codigo: 23, aliquota_icms_interna: 20.0,
415        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
416        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
417    });
418    mapa.insert("MA".to_string(), ConfiguracaoUf {
419        uf: "MA".to_string(), codigo: 21, aliquota_icms_interna: 22.0,
420        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
421        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
422    });
423    mapa.insert("PB".to_string(), ConfiguracaoUf {
424        uf: "PB".to_string(), codigo: 25, aliquota_icms_interna: 20.0,
425        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
426        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
427    });
428    mapa.insert("PE".to_string(), ConfiguracaoUf {
429        uf: "PE".to_string(), codigo: 26, aliquota_icms_interna: 20.5,
430        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
431        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
432    });
433    mapa.insert("PI".to_string(), ConfiguracaoUf {
434        uf: "PI".to_string(), codigo: 22, aliquota_icms_interna: 21.0,
435        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
436        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
437    });
438    mapa.insert("RN".to_string(), ConfiguracaoUf {
439        uf: "RN".to_string(), codigo: 24, aliquota_icms_interna: 20.0,
440        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
441        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
442    });
443    mapa.insert("SE".to_string(), ConfiguracaoUf {
444        uf: "SE".to_string(), codigo: 28, aliquota_icms_interna: 19.0,
445        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
446        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
447    });
448
449    // Região Centro-Oeste
450    mapa.insert("DF".to_string(), ConfiguracaoUf {
451        uf: "DF".to_string(), codigo: 53, aliquota_icms_interna: 20.0,
452        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
453        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
454    });
455    mapa.insert("GO".to_string(), ConfiguracaoUf {
456        uf: "GO".to_string(), codigo: 52, aliquota_icms_interna: 19.0,
457        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
458        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
459    });
460    mapa.insert("MS".to_string(), ConfiguracaoUf {
461        uf: "MS".to_string(), codigo: 50, aliquota_icms_interna: 17.0,
462        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
463        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
464    });
465    mapa.insert("MT".to_string(), ConfiguracaoUf {
466        uf: "MT".to_string(), codigo: 51, aliquota_icms_interna: 17.0,
467        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
468        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
469    });
470
471    // Região Sudeste
472    mapa.insert("ES".to_string(), ConfiguracaoUf {
473        uf: "ES".to_string(), codigo: 32, aliquota_icms_interna: 17.0,
474        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
475        aliquota_interestadual_demais: 12.0, aliquota_importados: 4.0,
476    });
477    mapa.insert("MG".to_string(), ConfiguracaoUf {
478        uf: "MG".to_string(), codigo: 31, aliquota_icms_interna: 18.0,
479        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
480        aliquota_interestadual_demais: 7.0, aliquota_importados: 4.0,
481    });
482    mapa.insert("RJ".to_string(), ConfiguracaoUf {
483        uf: "RJ".to_string(), codigo: 33, aliquota_icms_interna: 22.0,
484        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
485        aliquota_interestadual_demais: 7.0, aliquota_importados: 4.0,
486    });
487    mapa.insert("SP".to_string(), sao_paulo_uf());
488
489    // Região Sul
490    mapa.insert("PR".to_string(), ConfiguracaoUf {
491        uf: "PR".to_string(), codigo: 41, aliquota_icms_interna: 19.5,
492        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
493        aliquota_interestadual_demais: 7.0, aliquota_importados: 4.0,
494    });
495    mapa.insert("RS".to_string(), ConfiguracaoUf {
496        uf: "RS".to_string(), codigo: 43, aliquota_icms_interna: 17.0,
497        aliquota_fcp: Some(2.0), aliquota_interestadual_sul_sudeste: 12.0,
498        aliquota_interestadual_demais: 7.0, aliquota_importados: 4.0,
499    });
500    mapa.insert("SC".to_string(), ConfiguracaoUf {
501        uf: "SC".to_string(), codigo: 42, aliquota_icms_interna: 17.0,
502        aliquota_fcp: None, aliquota_interestadual_sul_sudeste: 12.0,
503        aliquota_interestadual_demais: 7.0, aliquota_importados: 4.0,
504    });
505
506    mapa
507}
508
509/// Busca um município pelo código IBGE
510pub fn buscar_municipio_por_codigo(codigo: &str) -> Option<Municipio> {
511    match codigo {
512        "3529302" => Some(matao()),
513        "3503208" => Some(araraquara()),
514        // Adicione mais municípios conforme necessário
515        _ => None,
516    }
517}
518
519/// Busca configuração de UF pela sigla
520pub fn buscar_uf(sigla: &str) -> Option<ConfiguracaoUf> {
521    aliquotas_icms_por_uf().get(sigla).cloned()
522}
523
524/// Calcula a alíquota interestadual entre duas UFs
525pub fn calcular_aliquota_interestadual(uf_origem: &str, uf_destino: &str) -> f32 {
526    // Sul e Sudeste (exceto ES) para demais estados: 7%
527    // Demais combinações: 12%
528    // Importados: 4%
529
530    let sul_sudeste = ["SP", "RJ", "MG", "PR", "SC", "RS"];
531    let origem_sul_sudeste = sul_sudeste.contains(&uf_origem);
532    let destino_sul_sudeste = sul_sudeste.contains(&uf_destino);
533
534    if origem_sul_sudeste && !destino_sul_sudeste {
535        7.0
536    } else {
537        12.0
538    }
539}
540
541/// Principais municípios de SP com seus códigos IBGE
542pub fn municipios_sp() -> Vec<(String, String)> {
543    vec![
544        ("3503208".to_string(), "Araraquara".to_string()),
545        ("3529302".to_string(), "Matão".to_string()),
546        ("3509502".to_string(), "Campinas".to_string()),
547        ("3518800".to_string(), "Guarulhos".to_string()),
548        ("3534401".to_string(), "Osasco".to_string()),
549        ("3543402".to_string(), "Ribeirão Preto".to_string()),
550        ("3547809".to_string(), "Santo André".to_string()),
551        ("3548500".to_string(), "Santos".to_string()),
552        ("3548708".to_string(), "São Bernardo do Campo".to_string()),
553        ("3549805".to_string(), "São José dos Campos".to_string()),
554        ("3550308".to_string(), "São Paulo".to_string()),
555        ("3552205".to_string(), "Sorocaba".to_string()),
556    ]
557}