# 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>>` — `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, pub serie: Result, pub valor: Option>, pub data: Option>, pub documento_tipo: Option>, } pub fn pre_visualizar_csv( caminho: &Path, layout: &LayoutCsv, n_linhas: usize, ) -> Vec pub fn pre_visualizar_xlsx( caminho: &Path, layout: &LayoutXlsx, n_linhas: usize, ) -> Vec ``` 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>, ``` 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