📋 Prestação de Contas — Relatório de Evolução

Sistema de prestação de contas de viagens com extração automática de notas fiscais por IA de visão local.

prestacaocontas.sistematica.pro

⏸ Projeto pausado em 13/07/2026 — dados preservados, pronto para reativação

Status atual

O projeto foi pausado em 13/07/2026 para liberar memória e processamento da VPS (o container de IA de visão consumia ~3,3 GiB de RAM residentes). Toda a stack Docker foi desligada, porém nenhum dado foi apagado: banco (volumes/pg-data), imagens das notas (volumes/uploads) e modelos de IA (volumes/ollama) permanecem intactos no servidor. Este relatório é servido como HTML estático e não depende do projeto estar no ar.

Visão geral do sistema

O colaborador em viagem fotografa a nota fiscal e faz o upload pelo site ou pelo app. O sistema extrai automaticamente Estabelecimento, Data/Hora e Valor usando IA de visão local (Ollama, modelo qwen2.5vl:3b) com o Tesseract como segunda análise independente. O processamento é assíncrono "estilo YouTube": o upload responde na hora (HTTP 202) e o usuário recebe uma notificação (sino/badge) quando a nota termina de processar. Um humano então revisa, corrige se necessário e confirma.

PENDENTE PROCESSANDO REVISAR CONFIRMADO (ou ERRO após esgotar tentativas)

Arquitetura e stack

🖥 Frontend

React 19 + Vite + TypeScript, servido por nginx. Responsivo mobile-first, PWA (atalho iOS em tela cheia) e download do APK Android na tela de login.

⚙️ Backend

Java 25 + Spring Boot 3: API REST, autenticação JWT/BCrypt, Flyway (migrações V1–V6), worker @Scheduled de OCR com recovery de notas presas.

🤖 OCR / IA

Python 3.12 + FastAPI: pré-processamento OpenCV, correção de orientação, e duas análises independentes — visão (Ollama qwen2.5vl:3b) e Tesseract — com timeout e medição de tempo.

🗄 Banco de dados

PostgreSQL 16 dedicado (porta local 15433), UUID em todas as tabelas (pgcrypto), análises salvas em JSONB.

📱 Mobile

App Flutter (WebView) único para Android e iOS. APK de ~44 MB compilado via Docker; build iOS previsto via Codemagic (macOS na nuvem).

🐳 Infraestrutura

Docker Compose com 5 containers (postgres, backend, ocr, ollama, frontend) na rede prestacao-pc-net; HTTPS via proxy-nginx compartilhado + Let's Encrypt.

Linha do tempo — 12 evoluções

Desenvolvimento concentrado entre 20 e 21 de junho de 2026, registrado em docs/CHANGELOG.md.

20/06/2026 — Fundação

Evolução 1 — Arquitetura, base completa e go-live

  • Plano de ação aprovado; estrutura poliglota criada (backend Java, OCR Python, frontend React).
  • Docker Compose completo, Flyway V1 (UUID), auth JWT, CRUD de notas com upload e worker assíncrono.
  • Subdomínio com SSL no ar; fluxo validado fim a fim, incluindo o caminho de erro.
20–21/06/2026

Evolução 2 — Login por usuário e senha provisória

  • Login por nome de usuário (não mais e-mail); troca de senha obrigatória no 1º acesso, com bloqueio no backend (SenhaProvisoriaFilter).
  • 12 colaboradores cadastrados.
20–21/06/2026

Evolução 3 — Perfil admin e primeiro OCR real

  • Cadastro público removido; criação de usuários restrita a admin.
  • Resolvido OOM do modelo de visão e o descarte indevido de extrações (legivel virou informativo).
  • Primeira nota real extraída ponta a ponta (estabelecimento, data/hora e valor).
21/06/2026

Evolução 4 — Ollama dedicado e precisão

  • Container prestacao-ollama dedicado (12 GB / 4 núcleos), isolado da infra compartilhada.
  • Modelo primário qwen2.5vl:3b; imagem reduzida a ~1400 px; botões de girar no upload.
  • Inferência ~80 s/nota em CPU — compatível com o fluxo assíncrono.
21/06/2026

Evolução 5 — Site responsivo e app Flutter

  • Interface mobile-first (menu hambúrguer, tabelas viram cartões).
  • App Flutter WebView único para Android/iOS; APK de ~44 MB compilado via Docker.
21/06/2026

Evolução 6 — Identidade visual e distribuição

  • Ícone e splash do app; botão "Baixar app Android (APK)" na tela de login.
  • Dois novos admins promovidos (total de 3).
21/06/2026

Evolução 7 — iOS/PWA, giro na revisão e temporizador

  • Instruções de "Adicionar à Tela de Início" no iOS + suporte PWA completo.
  • Endpoint para girar e persistir a imagem na revisão.
  • Countdown de processamento autocalibrado pela média real das últimas notas (migração V4).
21/06/2026

Evolução 8 — Robustez: recovery e timeouts

  • Recuperação automática de notas presas em PROCESSANDO após restart do backend.
  • Timeouts no Tesseract (que chegou a travar o serviço em 99% de CPU por 30+ min).
21/06/2026

Evolução 9 — Duas análises independentes na revisão

  • IA de visão e Tesseract passam a rodar sempre, de forma independente (migração V5, JSONB).
  • Tela de revisão com dois cards comparativos e botão "Usar esta" para pré-preencher o formulário.
21/06/2026

Evolução 10 — Campo "Local" (cidade)

  • Novo campo para registrar a cidade onde a nota foi gerada (migração V6).
21/06/2026

Evolução 11 — Área administrativa de notas

  • Admin visualiza e revisa notas de qualquer colaborador (/admin/notas + GET /api/admin/notas).
21/06/2026

Evolução 12 — Métricas por motor e OCR sem bloqueio

  • Tempo de cada análise (visão vs Tesseract) exibido nos cards da revisão.
  • Tesseract movido para fora do event loop (asyncio.to_thread + timeout de 120s com kill de processos órfãos).
  • Recovery corrigido para não penalizar notas interrompidas por restart.

Evolução do modelo de dados (Flyway V1–V6)

MigraçãoO que introduziu
V1__initEsquema inicial: usuários, notas e notificações, tudo com PK UUID (pgcrypto).
V2__login_e_senha_provisoriaLogin por usuário (único, case-insensitive) e flag de senha provisória.
V3__adminColuna admin — controle de acesso administrativo.
V4__tempo_processamentoInício e duração do processamento — base do countdown autocalibrado.
V5__analises_separadasJSONB analise_visao e analise_tesseract — análises independentes.
V6__local_notaCampo local (cidade onde a nota foi gerada).

Números do projeto

12

evoluções entregues em 2 dias de desenvolvimento intensivo (20–21/jun/2026).

5

containers Docker: postgres, backend, ocr, ollama e frontend.

12

colaboradores cadastrados, sendo 3 administradores.

2

motores de extração independentes por nota: IA de visão + Tesseract.

Como reativar o projeto

Todos os dados (usuários, notas, imagens e modelo de IA já baixado) estarão exatamente como ficaram na pausa.