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.
4.4 KiB
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:131renderizar_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.
// 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
// 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
DragValuede índice (via.changed()) - Mudança de qualquer
text_editde 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 parseadoErr(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:
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