- Implemented TXT processor for DMED files, extracting RPPSS records. - Added XLS processor for Prosoft reports, supporting both XLS and XLSX formats. - Created a comparison tool to identify discrepancies between TXT and XLS data. - Developed a GUI using eframe for user-friendly interaction. - Included detailed README documentation for setup and usage instructions. - Added error handling for file processing and improved data extraction methods. - Implemented tests for data processing functions and utilities. - Introduced a build script for Windows resource management. - Added example scripts for basic and complete comparisons. - Included a report generation feature for discrepancies found during comparisons.
77 lines
2.7 KiB
Rust
77 lines
2.7 KiB
Rust
// Exemplo de como usar a lib dmed em um comparador
|
|
|
|
use dmed::{processar_arquivo, Pessoa, buscar_por_cpf};
|
|
use std::collections::HashMap;
|
|
|
|
fn main() -> std::io::Result<()> {
|
|
// Processa dois arquivos diferentes
|
|
println!("=== COMPARADOR DE ARQUIVOS DMED ===\n");
|
|
|
|
let arquivo1 = "LfsIssDmed008425.txt";
|
|
let pessoas1 = processar_arquivo(arquivo1)?;
|
|
|
|
println!("Arquivo 1: {} registros", pessoas1.len());
|
|
// let pessoas2 = processar_arquivo("arquivo2.txt")?;
|
|
// println!("Arquivo 2: {} registros\n", pessoas2.len());
|
|
|
|
// Cria um mapa de CPF -> Pessoa para busca rápida
|
|
let mapa1: HashMap<&str, &Pessoa> = pessoas1
|
|
.iter()
|
|
.map(|p| (p.cpf.as_str(), p))
|
|
.collect();
|
|
|
|
// Exemplo 1: Buscar CPF específico
|
|
println!("=== Busca de CPF ===");
|
|
let cpf_busca = "00276808860";
|
|
if let Some(pessoa) = buscar_por_cpf(&pessoas1, cpf_busca) {
|
|
println!("✓ CPF {} encontrado", cpf_busca);
|
|
println!(" Nome: {}", pessoa.nome);
|
|
println!(" Valor: R$ {:.2}", pessoa.valor);
|
|
}
|
|
|
|
// Exemplo 2: Comparar valores de mesmos CPFs entre arquivos
|
|
println!("\n=== Comparação de valores ===");
|
|
// Simulando segundo arquivo com mesmos CPFs mas valores diferentes
|
|
let cpfs_exemplo = ["00276808860", "00633999032", "01133252826"];
|
|
|
|
for cpf in &cpfs_exemplo {
|
|
if let Some(p1) = mapa1.get(cpf) {
|
|
println!("\nCPF: {}", cpf);
|
|
println!(" Arquivo 1: R$ {:.2}", p1.valor);
|
|
// if let Some(p2) = mapa2.get(cpf) {
|
|
// let diferenca = p2.valor - p1.valor;
|
|
// println!(" Arquivo 2: R$ {:.2}", p2.valor);
|
|
// println!(" Diferença: R$ {:.2} ({:+.1}%)",
|
|
// diferenca,
|
|
// (diferenca / p1.valor) * 100.0
|
|
// );
|
|
// }
|
|
}
|
|
}
|
|
|
|
// Exemplo 3: Encontrar divergências
|
|
println!("\n=== Análise de divergências ===");
|
|
let total_registros = pessoas1.len();
|
|
let com_valor = pessoas1.iter().filter(|p| p.valor > 0.0).count();
|
|
let sem_valor = total_registros - com_valor;
|
|
|
|
println!("Total de registros: {}", total_registros);
|
|
println!("Com valor: {}", com_valor);
|
|
println!("Sem valor: {}", sem_valor);
|
|
|
|
// Exemplo 4: Top 5 maiores valores
|
|
println!("\n=== Top 5 maiores valores ===");
|
|
let mut pessoas_sorted = pessoas1.clone();
|
|
pessoas_sorted.sort_by(|a, b| b.valor.partial_cmp(&a.valor).unwrap());
|
|
|
|
for (i, pessoa) in pessoas_sorted.iter().take(5).enumerate() {
|
|
println!("{}. {} - R$ {:.2}",
|
|
i + 1,
|
|
pessoa.nome,
|
|
pessoa.valor
|
|
);
|
|
}
|
|
|
|
Ok(())
|
|
}
|