feat: add DMED comparador library with TXT and XLS processing

- 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.
This commit is contained in:
FelipeCN
2026-01-30 10:42:23 -03:00
parent fab1c26445
commit 3a888a058f
14 changed files with 5570 additions and 353 deletions
+210
View File
@@ -0,0 +1,210 @@
# DMED - Comparador TXT vs XLS
Biblioteca Rust para processar e comparar arquivos DMED (TXT) com relatórios Prosoft (XLS).
## 📋 Funcionalidades
### 1️⃣ Processador TXT (DMED)
- Lê arquivos TXT do formato DMED
- Extrai registros RPPSS (CPF, Nome, Valor)
- Pula as 4 primeiras linhas automaticamente
- Converte valores (últimos 2 dígitos são decimais)
### 2️⃣ Processador XLS (Prosoft)
- Lê arquivos XLS e XLSX (detecção automática)
- Extrai CPF (coluna E) e Valor (coluna H)
- Remove formatação de CPF (pontos e hífens)
- **Agrupa por CPF** e **soma valores** de múltiplas notas
- Filtra apenas CPF (11 dígitos), descarta CNPJ
### 3️⃣ Comparador
- Compara valores entre TXT e XLS
- Identifica divergências
- Gera relatório detalhado
- Estatísticas completas
## 🚀 Como usar
### Instalação
Adicione ao seu `Cargo.toml`:
```toml
[dependencies]
dmed = { path = "../dmed" }
```
### Como biblioteca
```rust
use dmed::{processar_arquivo, xls::processar_xls};
fn main() -> std::io::Result<()> {
// Processa TXT
let pessoas_txt = processar_arquivo("LfsIssDmed068325.txt")?;
// Processa XLS
let pessoas_xls = processar_xls("RELATORIO_PROSOFT_MOD_51.xls")?;
// Comparar, buscar, etc.
Ok(())
}
```
### Executar exemplos
#### 1. Comparador básico (só TXT)
```bash
cargo run --example comparador
```
#### 2. Comparador completo (TXT + XLS)
```bash
# Coloque o arquivo RELATORIO_PROSOFT_MOD_51.xls na pasta do projeto
cargo run --example comparador_completo
```
#### 3. Main (demonstração)
```bash
cargo run
```
## 📁 Estrutura do projeto
```
dmed/
├── src/
│ ├── lib.rs # API principal
│ ├── xls.rs # Processador XLS
│ └── main.rs # Exemplo de uso
├── examples/
│ ├── comparador.rs # Exemplo com TXT
│ └── comparador_completo.rs # Exemplo TXT vs XLS
├── Cargo.toml
└── README.md
```
## 🔧 API Pública
### Structs
```rust
pub struct Pessoa {
pub cpf: String, // CPF (11 dígitos, sem formatação)
pub nome: String, // Nome completo
pub valor: f64, // Valor em reais
}
```
### Funções
#### Processamento TXT
```rust
// Processa arquivo TXT
pub fn processar_arquivo(caminho: &str) -> io::Result<Vec<Pessoa>>
// Processa string (útil para testes)
pub fn processar_conteudo(conteudo: &str) -> io::Result<Vec<Pessoa>>
```
#### Processamento XLS
```rust
// Processa arquivo XLS/XLSX (módulo xls)
pub fn processar_xls(caminho: &str) -> io::Result<Vec<Pessoa>>
```
**Nota:** Aceita tanto `.xls` quanto `.xlsx` - a detecção é automática!
#### Utilidades
```rust
// Converte para JSON
pub fn para_json(pessoas: &[Pessoa]) -> Result<String, serde_json::Error>
// Busca por CPF
pub fn buscar_por_cpf<'a>(pessoas: &'a [Pessoa], cpf: &str) -> Option<&'a Pessoa>
// Filtra por valor mínimo
pub fn filtrar_por_valor_minimo(pessoas: &[Pessoa], valor_minimo: f64) -> Vec<&Pessoa>
```
## 📊 Formato dos arquivos
### TXT (DMED)
```
Dmed|2026|2025|N||| <- Linha 1 (pular)
RESPO|...|... <- Linha 2 (pular)
DECPJ|...|... <- Linha 3 (pular)
PSS| <- Linha 4 (pular)
RPPSS|00276808860|MARCO ANTONIO MACHADO|2200000| <- Processar
RPPSS|00633999032|ELISANDRA BARBOSA TORRES|600000| <- Processar
...
```
**Campos:**
- Campo 1: `RPPSS` (filtro)
- Campo 2: CPF (11 dígitos)
- Campo 3: Nome
- Campo 4: Valor (últimos 2 dígitos = decimais)
### XLS (Prosoft)
| A | B | C | D | E (CPF) | F | G | H (Valor) |
|---|---|---|---|---------|---|---|-----------|
| ... | ... | ... | ... | 123.456.789-01 | ... | ... | 1500.50 |
| ... | ... | ... | ... | 123.456.789-01 | ... | ... | 500.00 |
- Linhas 1-3: Identificação (pular)
- Linha 4: Cabeçalho (pular)
- Coluna E: CPF/CNPJ (manter apenas CPF)
- Coluna H: Valores (somar por CPF)
## 🧪 Testes
```bash
cargo test
```
## 📝 Exemplo de saída
```
═══════════════════════════════════════════════
COMPARADOR DMED (TXT) vs PROSOFT (XLS)
═══════════════════════════════════════════════
📄 Processando arquivo TXT (DMED)...
✓ 336 registros encontrados
📊 Processando arquivo XLS (Prosoft)...
✓ 245 registros únicos encontrados
═══════════════════════════════════════════════
ANÁLISE
═══════════════════════════════════════════════
📊 Estatísticas:
Total de CPFs únicos: 400
Presentes em ambos: 181
Apenas no TXT: 155
Apenas no XLS: 64
📈 Divergências de valores:
Total: 12 registros com diferenças
═══════════════════════════════════════════════
TOP 10 DIVERGÊNCIAS
═══════════════════════════════════════════════
1. CPF: 00276808860
Nome: MARCO ANTONIO MACHADO
TXT (DMED): R$ 22000.00
XLS (Prosoft): R$ 22500.00
Diferença: R$ 500.00 (+2.3%)
...
```
## 📄 Licença
MIT
## 🤝 Contribuindo
Pull requests são bem-vindos!