FinHelper e uma aplicacao web que automatiza a conciliacao financeira entre arquivos de diferentes sistemas (fornecedores e o sistema interno Wintour), integrando um assistente de IA baseado na OpenAI para analise dos resultados.
Desenvolvido para a Wee Travel, o projeto elimina o trabalho manual de cruzar planilhas, identificar divergencias de valores e gerar relatorios consolidados.
- Compara valores liquidos por localizador entre dois arquivos financeiros (fornecedor vs. sistema Wintour).
- Identifica automaticamente registros:
- Ok — valores batem entre os dois arquivos.
- Divergente — valores diferentes entre os arquivos.
- Somente Fornecedor / Somente Wintour — localizador presente em apenas um dos arquivos.
- Comparacao campo a campo — identifica exatamente ONDE esta a divergencia:
- Tarifa com Tarifa
- Taxa com Taxa
- Markup com Markup
- Taxa de embarque com Taxa de embarque
- Over com Incentivo (campos correspondentes com nomes diferentes)
- Detecta divergencias internas no Wintour: verifica se
Total Fornec. (-DF) == Total Tarifa - Markup. - Gera planilha Excel consolidada com todos os resultados.
- Chat com IA para perguntar sobre os dados processados.
O projeto possui dois modos de execucao: interface web moderna (FastAPI + HTML/CSS/JS) e interface Gradio (legado).
finhelper-2.0/
|
|-- server.py # Backend FastAPI (API REST)
|-- conciliador.py # Motor de conciliacao financeira
|-- finhelper.py # Integracao com OpenAI Assistants API
|-- app.py # Interface Gradio (modo legado)
|
|-- static/ # Frontend web
| |-- index.html # Pagina principal
| |-- style.css # Estilos (paleta Wee Travel)
| |-- app.js # Logica do frontend
| |-- logo-wee.png # Logo Wee Travel
|
|-- Dockerfile # Container do backend (Python)
|-- Dockerfile.frontend # Container do frontend (Nginx)
|-- docker-compose.yml # Orquestracao dos containers
|-- nginx.conf # Configuracao do Nginx (proxy reverso)
|
|-- requirements.txt # Dependencias completas (inclui Gradio)
|-- requirements.docker.txt # Dependencias para Docker (sem Gradio)
|-- .env.example # Modelo de variaveis de ambiente
|-- .dockerignore # Arquivos ignorados pelo Docker
| Arquivo | Responsabilidade |
|---|---|
server.py |
API REST com FastAPI. Endpoints: processar arquivos, download Excel, chat IA. Serve os arquivos estaticos. |
conciliador.py |
Classe Conciliador — leitura de arquivos, agrupamento por localizador, comparacao de valores liquidos, comparacao campo a campo, deteccao de divergencias e geracao de planilha Excel. |
finhelper.py |
Classe FinHelper — integracao com a API de Assistentes da OpenAI. Cria threads de conversa com o contexto dos dados e responde perguntas. |
app.py |
Interface Gradio (modo legado). Pode ser usado independentemente do frontend web. |
| Metodo | Rota | Descricao |
|---|---|---|
GET |
/ |
Serve a pagina HTML principal |
POST |
/api/processar |
Recebe 2 arquivos, retorna resumo + resultados JSON |
GET |
/api/download |
Download da planilha Excel gerada |
POST |
/api/chat |
Envia mensagem para o assistente IA, retorna resposta |
| Extensao | Sistema | Separador | Encoding |
|---|---|---|---|
.xlsx |
Wintour / Fornecedor | — | — |
.csv |
Fornecedor | ; |
latin-1 |
.cnf |
Fornecedor | ; |
latin-1 |
Quando o sistema encontra valores diferentes entre os dois arquivos para o mesmo localizador, ele compara campo a campo:
| Campo Fornecedor | Campo Wintour | Descricao |
|---|---|---|
| Tarifa | Total Tarifa | Valor da tarifa |
| Taxa | Total Taxas | Taxas do bilhete |
| TxDU | Total DU/RAV | Taxa de embarque |
| Incentivo | Over Agencia | Over / Incentivo (nomes diferentes) |
Saida esperada: Quando encontra divergencia, informa qual campo divergiu.
- Exemplo:
Diferenca em: Taxa (Fornec: 50.00 x Wintour: 35.00) - Exemplo:
Diferenca em: Tarifa (Fornec: 2000.00 x Wintour: 1800.00)
Regra de localizadores repetidos: Um mesmo localizador pode ter varias pessoas (passageiros) ou servicos diferentes, gerando vendas distintas. O sistema nunca esconde localizadores repetidos — todos aparecem na planilha.
O FinHelper utiliza a OpenAI Assistants API (com threads persistentes):
- Criacao do contexto: Quando o usuario processa os dois arquivos, o sistema serializa todo o resultado da conciliacao em texto estruturado.
- Injecao na thread: Os dados sao enviados como mensagem inicial da thread com instrucoes detalhadas e regras de negocio.
- Chat interativo: Cada pergunta do usuario e adicionada a mesma thread. O assistente responde com base nos dados reais da conciliacao.
- Tolerancia a falhas: Se a API da OpenAI estiver fora do ar, o processamento funciona normalmente — apenas o chat fica indisponivel.
O assistente e configurado via um Assistant ID pre-criado na plataforma OpenAI (variavel OPENAI_ASSISTANT_ID).
- Python 3.10+
- Docker e Docker Compose (para rodar com containers)
- Conta na OpenAI com acesso a Assistants API
- Um Assistant criado no painel da OpenAI
git clone <url-do-repositorio>
cd finhelper-2.0Copie o arquivo de exemplo e preencha com suas credenciais:
cp .env.example .envEdite o .env:
OPENAI_API_KEY=sk-sua-chave-aqui
OPENAI_ASSISTANT_ID=asst_seu-id-aquiOnde conseguir:
OPENAI_API_KEY: Acesse platform.openai.com/api-keys e crie uma nova chave.OPENAI_ASSISTANT_ID: Acesse platform.openai.com/assistants, crie um assistente e copie o ID (comeca comasst_).
docker compose up --buildAguarde ate ver no terminal:
backend-1 | INFO: Uvicorn running on http://0.0.0.0:8000
frontend-1 | ... ready for start up
Abra o navegador em: http://localhost
| Servico | URL | Porta |
|---|---|---|
| Frontend (Nginx) | http://localhost | 80 |
| Backend (FastAPI) | http://localhost:8000 | 8000 |
# Subir os containers em segundo plano
docker compose up -d --build
# Ver logs em tempo real
docker compose logs -f
# Parar os containers
docker compose down
# Rebuildar apos mudancas no codigo
docker compose up --build
# Ver status dos containers
docker compose psgit clone <url-do-repositorio>
cd finhelper-2.0python -m venv venv
# Windows
venv\Scripts\activate
# Linux/macOS
source venv/bin/activatepip install -r requirements.txtcp .env.example .envEdite o .env com suas credenciais (mesmo procedimento da Opcao 1, Passo 2).
Frontend moderno (FastAPI):
python server.pyAcesse: http://localhost:8000
Interface Gradio (legado):
python app.pyAcesse: http://localhost:7860
- Acesse a aplicacao no navegador.
- No campo FLYTOUR, faca upload do arquivo do fornecedor (
.csv,.xlsxou.cnf). - No campo WINTOUR, faca upload do arquivo do sistema Wintour (
.xlsx). - Clique em Processar.
- Veja o Resumo com os totais de cada status.
- Use os filtros (Todos, Divergente, Somente Fornecedor, Somente Wintour, Ok) para navegar pelos resultados.
- Clique em Baixar Excel para download da planilha consolidada.
- Use o Chat IA (botao no canto superior direito) para tirar duvidas sobre os dados.
- "Quais localizadores estao divergentes?"
- "Qual a diferenca no localizador C9WAQD?"
- "Quantos registros estao somente no fornecedor?"
- "Onde esta a divergencia do passageiro Carlos Abreu?"
| Funcionalidade | Descricao |
|---|---|
| Upload com drag & drop | Arraste os arquivos para as areas de upload |
| Botao X no upload | Remove o arquivo individualmente para trocar |
| Cabecalho fixo da tabela | O header roxo fica fixo ao rolar a tabela |
| Tooltip nas celulas | Passe o mouse sobre celulas truncadas para ver o texto completo |
| Celulas coloridas | Valores divergentes sao destacados com cores (vermelho = maior, amarelo = menor, ciano = presente, rosa = ausente) |
| Badges de status | Ok (verde), Divergente (vermelho), Somente Fornecedor (ciano), Somente Wintour (amarelo) |
| Chat lateral retratil | Abre/fecha pelo botao "Chat IA" no header, empurra o conteudo sem sobrepor |
| Logo como botao Home | Clique na logo para voltar ao topo da pagina |
| Divergentes primeiro | A tabela sempre ordena divergentes no topo |
| Cor | Hex | Uso |
|---|---|---|
| Roxo | #7F2EC2 |
Header, botoes primarios, badges |
| Ciano | #00EAE1 |
Upload boxes, destaques, badges |
| Cinza | #BDBFBF |
Textos secundarios, bordas |
| Verde | #22C55E |
Status Ok |
| Vermelho | #EF4444 |
Status Divergente |
| Amarelo | #EAB308 |
Status Somente Wintour |
| Tecnologia | Uso |
|---|---|
| Python 3.12 | Linguagem principal |
| FastAPI | Backend / API REST |
| Uvicorn | Servidor ASGI |
| Pandas | Manipulacao de dados |
| OpenPyXL | Leitura/escrita de Excel |
| OpenAI Assistants API | IA conversacional |
| Nginx | Servidor web / proxy reverso (Docker) |
| Docker | Containerizacao |
| HTML/CSS/JS | Frontend moderno |
| Gradio | Interface legado |
| Problema | Solucao |
|---|---|
| Erro 500 ao processar | Verifique os logs do backend (docker compose logs backend). Pode ser formato de arquivo nao suportado. |
| Chat nao responde | Verifique se OPENAI_API_KEY e OPENAI_ASSISTANT_ID estao corretos no .env. A API da OpenAI pode estar fora do ar. |
| Porta 8000 ocupada | Mate o processo: taskkill /F /IM python.exe (Windows) ou kill $(lsof -ti:8000) (Linux/Mac). |
| Porta 80 ocupada (Docker) | Altere a porta no docker-compose.yml: "3000:80" e acesse http://localhost:3000. |
| Docker build falha no pip | Use requirements.docker.txt (sem Gradio). Verifique o Dockerfile. |
| Tabela com scroll horizontal | Isso nao deveria acontecer. Limpe o cache do navegador (Ctrl+Shift+R). |
| Arquivo .cnf nao carrega | Verifique se o separador e ; e o encoding e latin-1. |
Projeto interno da Wee Travel. Uso restrito.