1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct Municipio {
12 pub codigo_ibge: String,
14 pub nome: String,
16 pub uf: String,
18 pub codigo_uf: u8,
20 pub aliquota_iss_padrao: f32,
22 pub aliquota_iss_minima: f32,
24 pub aliquota_iss_maxima: f32,
26 pub sistema_nfse: Option<SistemaNfse>,
28 pub url_nfse: Option<String>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
34pub enum SistemaNfse {
35 Abrasf1,
37 Abrasf2,
39 Ginfes,
41 Ipm,
43 IssNet,
45 Betha,
47 GissOnline,
49 Simpliss,
51 El,
53 Outro(String),
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct ConfiguracaoUf {
60 pub uf: String,
62 pub codigo: u8,
64 pub aliquota_icms_interna: f32,
66 pub aliquota_fcp: Option<f32>,
68 pub aliquota_interestadual_sul_sudeste: f32,
70 pub aliquota_interestadual_demais: f32,
72 pub aliquota_importados: f32,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct AliquotaIss {
79 pub codigo_servico: String,
81 pub descricao: String,
83 pub aliquota: f32,
85 pub retencao: bool,
87}
88
89pub 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
104pub 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
119pub 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, aliquota_interestadual_sul_sudeste: 12.0,
127 aliquota_interestadual_demais: 7.0,
128 aliquota_importados: 4.0,
129 }
130}
131
132pub fn aliquotas_iss_matao() -> Vec<AliquotaIss> {
134 vec![
135 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 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 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 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 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 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 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
253pub fn aliquotas_iss_araraquara() -> Vec<AliquotaIss> {
255 vec![
256 AliquotaIss {
258 codigo_servico: "7.02".to_string(),
259 descricao: "Execução de obras de construção civil".to_string(),
260 aliquota: 2.0, 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, retencao: false,
280 },
281 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 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 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 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 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
361pub fn aliquotas_icms_por_uf() -> HashMap<String, ConfiguracaoUf> {
363 let mut mapa = HashMap::new();
364
365 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 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 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 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 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
509pub fn buscar_municipio_por_codigo(codigo: &str) -> Option<Municipio> {
511 match codigo {
512 "3529302" => Some(matao()),
513 "3503208" => Some(araraquara()),
514 _ => None,
516 }
517}
518
519pub fn buscar_uf(sigla: &str) -> Option<ConfiguracaoUf> {
521 aliquotas_icms_por_uf().get(sigla).cloned()
522}
523
524pub fn calcular_aliquota_interestadual(uf_origem: &str, uf_destino: &str) -> f32 {
526 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
541pub 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}