5.0 KiB
5.0 KiB
Why
Hoje o LerNotaFiscal extrai fornecedor, data e valor de cada nota fiscal, mas não classifica a despesa por categoria (ex.: Alimentação, Transporte, Saúde). Sem categoria, o usuário não consegue entender para onde o dinheiro está indo pelo Dashboard, apenas por fornecedor ou período. Precisamos categorizar automaticamente cada nota no momento da extração, com uma regra de negócio clara (AI primeiro, palavra-chave como fallback) e sem risco de gerar custo descontrolado de tokens de IA.
What Changes
- Criar tabela
categoria(id,categoria,palavra_chave) para mapear palavras-chave a categorias, usada como fallback e administrável pelo usuário. O registroid = 1é reservado pelo sistema para a categoria "Não Encontrado" e é garantido automaticamente na inicialização do schema; o usuário é responsável por cadastrar as demais categorias/palavras-chave pela tela de CRUD. - Adicionar coluna
categoria_id(FK paracategoria) emfiscal_documentspara persistir a classificação. Documentos processados pelo novo fluxo sempre recebem umcategoria_idválido (nunca ficam nulos); apenas documentos já existentes antes desta mudança (não reprocessados) permanecem comcategoria_idnulo ("Sem categoria"). - Implementar fluxo de categorização automática:
- Ao processar uma nota, pedir à IA (mesma chamada de extração ou chamada dedicada) para sugerir a categoria a partir do nome do fornecedor.
- Se a IA não retornar uma categoria válida/reconhecida, buscar na tabela
categoriapor correspondência depalavra_chavenosupplier_namee usar acategoriaencontrada. - Se a IA não conseguir categorizar e nenhuma
palavra_chavecorresponder, gravarcategoria_id = 1("Não Encontrado") sem bloquear o processamento.
- Ajustar o Dashboard (
app/templates/dashboard.html+dashboard_routes.py) para exibir gastos agrupados por categoria (gráfico/lista) e permitir filtrar os dados exibidos por categoria, na mesma linha dos filtros de fornecedor/período já existentes na tela de documentos. - Criar tela administrativa de CRUD (Create, Read, Update, Delete) para a tabela
categoria, seguindo exatamente o mesmo layout/padrão já usado em "Documentos" (documents_list.html+document_form.html, mesmobase.html, mesmas classes CSS deapp/static/styles.css, mesmo padrão de rotasGET/POST /categorias,/categorias/new,/categorias/{id}/edit,POST /categorias/{id}/deletecom CSRF), para que o usuário possa cadastrar/editar/remover categorias e palavras-chave sem precisar de acesso direto ao banco. - Criar mecanismo de segurança contra loop infinito / consumo excessivo de tokens ao acionar a IA para categorização:
- Limite de tentativas de chamada de IA por nota (ex.: no máximo 1 tentativa de categorização por nota, sem retry automático).
- Cache/memória de categorização por fornecedor (se já categorizamos "Fornecedor X" antes, não chamar a IA de novo — reusar resultado ou usar a tabela
categoria). - Circuit breaker/limite global (ex.: máximo de N chamadas de categorização por lote de importação ou por janela de tempo), com log e interrupção segura (fallback para palavra-chave) ao atingir o limite.
Capabilities
New Capabilities
expense-categorization: Classificação automática de notas fiscais por categoria, com IA como fonte primária e a tabelacategoria(palavra-chave) como fallback determinístico.categorization-safety-limits: Limites e proteções (retries, cache, circuit breaker) para chamadas de IA usadas na categorização, evitando loops e consumo excessivo de tokens.
Modified Capabilities
- (nenhuma capability existente com spec.md hoje — projeto ainda não possui specs em
openspec/specs/)
Impact
- Banco de dados (
app/database.py): nova tabelacategoria; nova colunacategoria_idemfiscal_documents(e possivelmentedetected_documents); nova migração aditiva noSCHEMA/executescript. - IA (
app/ai_extraction.pyou novo móduloapp/categorization.py): nova função/chamada para sugerir categoria a partir dosupplier_name; ajuste no fluxo deextract_with_aiou chamada adicional pós-extração. - Ingestão (
ingestion.py): aplicar a lógica de categorização (IA → palavra-chave →categoria_id = 1"Não Encontrado") ao confirmar/criarfiscal_documents. - Rotas/Dashboard (
app/routes/dashboard_routes.py,app/templates/dashboard.html): novo agrupamento e filtro por categoria. - Nova rota de administração (
app/routes/categoria_routes.py, registrada emapp/main.py; novos templatesapp/templates/categorias_list.htmleapp/templates/categoria_form.html, reaproveitandobase.html): CRUD completo da tabelacategoria, no mesmo padrão das rotas/telas de "Documentos". - Rotas de documentos (
app/routes/documents_routes.py): opcionalmente permitir filtrar/editar categoria manualmente por nota. - Configuração (
app/config.py): novos parâmetros para limites de segurança (ex.:CATEGORIZATION_MAX_CALLS_PER_BATCH, cache TTL).