F-03 está 40% implementado. O preview raw existe e funciona bem. O que

seria novo é sobrepor ao preview existente uma segunda linha de
"interpretação" — indicando qual coluna mapeada seria o número, qual
seria a série, e se o valor parsearia com sucesso.
This commit is contained in:
FelipeCN
2026-03-03 17:04:38 -03:00
parent b9052e073f
commit e7d72c7e01
2 changed files with 128 additions and 1 deletions
+2 -1
View File
@@ -8,7 +8,8 @@
"Bash(cargo metadata --no-deps --format-version 1)", "Bash(cargo metadata --no-deps --format-version 1)",
"Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); [print\\(p[''name''], p[''version'']\\) for p in d[''packages'']]\")", "Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); [print\\(p[''name''], p[''version'']\\) for p in d[''packages'']]\")",
"WebFetch(domain:github.com)", "WebFetch(domain:github.com)",
"WebFetch(domain:api.github.com)" "WebFetch(domain:api.github.com)",
"Bash(ls D:/PROJECTS/comparador-notas/*.md)"
] ]
} }
} }
+126
View File
@@ -0,0 +1,126 @@
# F-03 — Preview Interpretado de Colunas
> Análise feita em 03/03/2026. O preview bruto já existe; este documento descreve apenas o que falta.
## O que já existe
A tela de configuração de colunas (`src/ui/screens/configuracao_colunas.rs`) exibe as primeiras 5 linhas do arquivo como uma tabela de dados brutos, com cabeçalhos A(0), B(1), C(2)... O preview é atualizado quando o delimitador muda (CSV).
- `app.preview_arquivo: Option<Vec<Vec<String>>>``src/ui/app.rs:131`
- `renderizar_tabela_preview()``src/ui/screens/mod.rs:22`
- Recálculo ao mudar delimitador — `src/ui/screens/configuracao_colunas.rs:165`
## O que falta implementar
### 1. Struct `LinhaPreview`
Resultado do parse tentativo de cada linha usando o layout atual.
```rust
// src/application/usecases/pre_visualizar.rs (arquivo novo)
pub struct LinhaPreview {
pub numero: Result<u64, String>,
pub serie: Result<String, String>,
pub valor: Option<Result<rust_decimal::Decimal, String>>,
pub data: Option<Result<String, String>>,
pub documento_tipo: Option<Result<String, String>>,
}
pub fn pre_visualizar_csv(
caminho: &Path,
layout: &LayoutCsv,
n_linhas: usize,
) -> Vec<LinhaPreview>
pub fn pre_visualizar_xlsx(
caminho: &Path,
layout: &LayoutXlsx,
n_linhas: usize,
) -> Vec<LinhaPreview>
```
Internamente, reutiliza a lógica de parse já existente em `importar_csv` / `importar_xlsx`, mas sem abortar na primeira falha — retorna `Err(mensagem)` por campo.
---
### 2. Estado no `App`
```rust
// src/ui/app.rs
pub preview_interpretado: Option<Vec<LinhaPreview>>,
```
Recalculado sempre que qualquer campo de configuração muda (não só o delimitador). Gatilhos em `configuracao_colunas.rs`:
- Mudança de delimitador (já atualiza preview bruto; adicionar aqui)
- Mudança de encoding
- Mudança de qualquer `DragValue` de índice (via `.changed()`)
- Mudança de qualquer `text_edit` de posição XLSX (via `.changed()`)
---
### 3. Widget `renderizar_tabela_preview_interpretado`
Substitui ou complementa `renderizar_tabela_preview` na tela de configuração. Exibe uma tabela com colunas fixas pelos campos mapeados (Número, Série, Valor, Data, Tipo), não pelas colunas do arquivo.
Comportamento por célula:
- `Ok(v)` → texto verde ou neutro com o valor parseado
- `Err(msg)` → fundo vermelho claro, texto com o erro curto (ex: `"não é número"`)
- Campo opcional não mapeado → célula vazia/cinza
```
| Número | Série | Valor | Data | Tipo |
|--------|-------|----------|------------|------|
| 1001 | 001 | 1.250,00 | 2024-01-05 | |
| ✗ "abc"| 001 | 980,50 | 2024-01-06 | |
| 1003 | 001 | ✗ "" | 2024-01-07 | |
```
---
### 4. Atualização reativa nos campos de índice
Atualmente, mudar um `DragValue` de índice não recalcula o preview. É necessário capturar `.changed()` em cada campo e disparar o recálculo.
Exemplo para CSV em `configuracao_colunas.rs`:
```rust
let changed = campo_indice_rastreado(ui, "Número:", &mut app.layout_csv_atual.indice_numero);
if changed {
recalcular_preview_interpretado(app);
}
```
Alternativa mais simples: comparar o layout no início e no fim do frame e recalcular se diferente (evita modificar cada campo individualmente).
---
## Escopo de arquivos afetados
| Arquivo | Mudança |
|---|---|
| `src/application/usecases/pre_visualizar.rs` | Criar — lógica de parse tentativo |
| `src/ui/app.rs` | Adicionar campo `preview_interpretado` |
| `src/ui/screens/configuracao_colunas.rs` | Adicionar gatilhos de recálculo e chamar novo widget |
| `src/ui/screens/mod.rs` | Adicionar `renderizar_tabela_preview_interpretado()` |
Não são necessárias novas dependências. O parse tentativo reutiliza funções já existentes nos readers.
---
## O que NÃO precisa mudar
- O preview bruto (`renderizar_tabela_preview`) pode ser mantido ou removido — a tabela interpretada é mais informativa.
- Nenhuma mudança em domínio, banco ou PDF.
- O fluxo de importação real não é alterado.
---
## Esforço reavaliado
O backlog estimava 46h. Com o preview bruto já existindo e a lógica de parse já implementada nos readers, o esforço real é de **23h**:
- 45min — `pre_visualizar.rs` (reutiliza lógica dos readers)
- 30min — estado no `App` + gatilhos de recálculo
- 1h — widget `renderizar_tabela_preview_interpretado`
- 30min — testes e ajustes visuais