From e7d72c7e019bd99aff1adca1783766616329a8d8 Mon Sep 17 00:00:00 2001 From: FelipeCN <57776624+felipecaninnovaes@users.noreply.github.com> Date: Tue, 3 Mar 2026 17:04:38 -0300 Subject: [PATCH] =?UTF-8?q?F-03=20est=C3=A1=2040%=20implementado.=20O=20pr?= =?UTF-8?q?eview=20raw=20existe=20e=20funciona=20bem.=20O=20que=20seria=20?= =?UTF-8?q?novo=20=C3=A9=20sobrepor=20ao=20preview=20existente=20uma=20seg?= =?UTF-8?q?unda=20linha=20de=20"interpreta=C3=A7=C3=A3o"=20=E2=80=94=20ind?= =?UTF-8?q?icando=20qual=20coluna=20mapeada=20seria=20o=20n=C3=BAmero,=20q?= =?UTF-8?q?ual=20seria=20a=20s=C3=A9rie,=20e=20se=20o=20valor=20parsearia?= =?UTF-8?q?=20com=20sucesso.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 3 +- F03_PREVIEW_INTERPRETADO.md | 126 ++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 F03_PREVIEW_INTERPRETADO.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json index c652360..6ba000b 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -8,7 +8,8 @@ "Bash(cargo metadata --no-deps --format-version 1)", "Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); [print\\(p[''name''], p[''version'']\\) for p in d[''packages'']]\")", "WebFetch(domain:github.com)", - "WebFetch(domain:api.github.com)" + "WebFetch(domain:api.github.com)", + "Bash(ls D:/PROJECTS/comparador-notas/*.md)" ] } } diff --git a/F03_PREVIEW_INTERPRETADO.md b/F03_PREVIEW_INTERPRETADO.md new file mode 100644 index 0000000..2de337b --- /dev/null +++ b/F03_PREVIEW_INTERPRETADO.md @@ -0,0 +1,126 @@ +# 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