6.8 KiB
6.8 KiB
1. Migração de Schema (Banco de Dados)
- 1.1 Em
app/database.py, implementar rebuild defiscal_documents(tabela_newcommes INTEGER NOT NULL,ano INTEGER NOT NULL, demais colunas iguais, sempurchase_date), copiando dados existentes commes = CAST(substr(purchase_date,6,2) AS INTEGER)eano = CAST(substr(purchase_date,1,4) AS INTEGER), dentro de uma transação, guardado por checagemPRAGMA table_info(só roda sepurchase_dateainda existir). - 1.2 Repetir o mesmo rebuild para
detected_documents, commes INTEGEReano INTEGERnullable (mantendo o mesmo comportamento opcional quepurchase_datetinha). - 1.3 Substituir o índice
idx_fiscal_dateporidx_fiscal_competencia ON fiscal_documents(ano, mes). - 1.4 Testar a migração rodando
init_db()contra uma cópia do banco atual (com dados depurchase_datejá existentes) e validar quemes/anoforam preenchidos corretamente e que rodarinit_db()de novo não falha nem duplica/recria o rebuild.
2. Normalização de Competência (app/dates.py)
- 2.1 Promover a lista
_MESES(hoje emdashboard_routes.py) paraapp/dates.pycomo fonte única de abreviações de mês. - 2.2 Implementar
resolve_competencia(date_raw, reference=None) -> tuple[int, int], substituindoresolve_purchase_date, com fallback para mês/ano corrente quando o valor for inválido/ausente. - 2.3 Implementar
format_competencia(mes: int, ano: int) -> strno formato"Jun/26"(mês abreviado capitalizado + ano com 2 dígitos), substituindoformat_br_date, e atualizar o filtro Jinja registrado emapp/templating.py(brdate→ filtro de competência). - 2.4 Ajustar
_is_plausible_purchase_date(ou equivalente) para validar plausibilidade em termos de mês/ano (ex. não mais que alguns meses no futuro, ano não muito no passado), em vez de dias.
3. Extração (IA e OCR)
- 3.1 Confirmar que
app/ai_extraction.pyelernotafiscal/extraction.pycontinuam extraindo a data completa do documento sem alteração de prompt/regex (Decisão de design: descarte do dia acontece na normalização, não na extração). - 3.2 Renomear/ajustar
RawExtraction.purchase_date_raweDetectedDocumentCandidate.purchase_dateapenas na camada de repasse (app/ingestion.py:_candidate_to_raw), garantindo que o valor bruto siga atéresolve_competenciasem mudança de comportamento de extração.
4. Persistência e Consultas (app/database.py)
- 4.1 Atualizar
insert_detectedeupdate_stagedpara gravarmes/ano(viaresolve_competencia) em vez depurchase_date. - 4.2 Atualizar
confirm_batchpara exigirmes/anoválidos (em vez depurchase_datetruthy) antes de promover um documento de staging parafiscal_documents. - 4.3 Atualizar
create_fiscaleupdate_fiscalpara recebermes/anocomo parâmetros obrigatórios em vez depurchase_date. - 4.4 Atualizar
_fiscal_wherepara filtrar por intervalo de competência usando a expressão(ano * 12 + mes) BETWEEN ? AND ?, substituindo o filtro porpurchase_date >= / <=. - 4.5 Atualizar
FISCAL_SORT_COLUMNSpara expor ordenação por(ano, mes)no lugar depurchase_date. - 4.6 Atualizar
monthly_totalspara agrupar diretamente porano, mes(GROUP BY ano, mes ORDER BY ano, mes), eliminandosubstr(purchase_date, 1, 7). - 4.7 Atualizar
category_totalspara filtrar por competência usando a mesma expressão(ano * 12 + mes).
5. Fluxo de Upload e Revisão (Staging)
- 5.1 Em
app/routes/upload_routes.py, atualizar o handler de upload (POST /upload) para gravarmes/ano(viaresolve_competencia) em vez depurchase_dateao inserir emdetected_documents. - 5.2 Atualizar
app/templates/staging.html: substituir o<input type="date" name="purchase_date">por dois<select>— Mês (Jan-Dez) e Ano (2026-2030) — pré-selecionados com o valor detectado quando disponível. - 5.3 Atualizar o handler
POST /import/{batch_id}/update/{detected_id}para receber e persistirmes/anodo formulário de revisão. - 5.4 Garantir que o cálculo de
summary["pendentes"](usado para bloquear o botão de confirmação do lote) passe a considerarmes/anoausentes/inválidos como pendência, em vez depurchase_date.
6. Cadastro Manual de Documento
- 6.1 Atualizar
app/templates/document_form.html: substituir o<input type="date" name="purchase_date">pelos mesmos dois<select>de Mês/Ano usados na revisão, pré-preenchidos na edição. - 6.2 Atualizar os handlers de criação/edição em
app/routes/documents_routes.py(/documents/new,/documents/{id}/edit) para lermes/anodo formulário e repassar acreate_fiscal/update_fiscal.
7. Listagem e Filtros (/documents)
- 7.1 Atualizar
app/templates/documents_list.html: substituir os filtros<input type="date" name="start">/name="end"por dois pares de<select>Mês/Ano ("De" e "Até"). - 7.2 Atualizar o handler
GET /documentsemapp/routes/documents_routes.pypara ler os novos parâmetros de filtro de competência e repassá-los alist_fiscal/fiscal_summary. - 7.3 Atualizar a coluna "Data" em
documents_list.htmlpara exibir a competência formatada (format_competencia) e manter a ordenação por competência (sort_urlapontando paraano/mes).
8. Dashboard
- 8.1 Atualizar
app/routes/dashboard_routes.py:_mes_labelpassa a usarformat_competencia/_MESEScentralizados emapp/dates.py, consumindoano/mesnativos vindos demonthly_totals. - 8.2 Atualizar
app/templates/dashboard.html: tabela "Últimos documentos" exibe a competência (format_competencia) no lugar ded.purchase_date | brdate.
9. Scripts e Testes
- 9.1 Atualizar
scripts/migrate_notas.pypara gravarmes/anoem vez depurchase_dateao chamarcreate_fiscal. - 9.2 Atualizar
tests/test_app.py(usos deresolve_purchase_date,create_fiscal,update_fiscalcompurchase_date=...) para o novo par de campos. - 9.3 Atualizar
tests/test_ingestion.py(docs[0].purchase_date) para verificarmes/anoem vez de data completa. - 9.4 Atualizar
tests/test_categorization.py(db.create_fiscal(..., purchase_date=...)) para o novo schema. - 9.5 Rodar a suíte de testes completa e corrigir quaisquer quebras remanescentes relacionadas a
purchase_date.
10. Validação Manual
- 10.1 Rodar a aplicação localmente, fazer upload de um documento de teste, confirmar que a tela de revisão exige seleção de Mês/Ano antes de habilitar a confirmação do lote, e validar que o documento aparece corretamente no Dashboard e em
/documentsapós confirmado. - 10.2 Validar cadastro manual (criar/editar) de um documento fiscal usando os novos seletores de Mês/Ano.
- 10.3 Validar o filtro por intervalo de competência em
/documentse a ordenação pela coluna de competência.