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:
@@ -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!
|
||||
Reference in New Issue
Block a user