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.
127 lines
4.4 KiB
Markdown
127 lines
4.4 KiB
Markdown
# 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 4–6h. Com o preview bruto já existindo e a lógica de parse já implementada nos readers, o esforço real é de **2–3h**:
|
||
|
||
- 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
|