Files
comparador-notas/F03_PREVIEW_INTERPRETADO.md
T
FelipeCN e7d72c7e01 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.
2026-03-03 17:04:38 -03:00

127 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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