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

4.4 KiB
Raw Blame History

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.

// 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 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:

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