Hórus — Gestão de
Chamados
Sistema interno para abertura e acompanhamento de chamados de Facilities e RH. Solicitantes abrem chamados via QR Code — a equipe gerencia pelo painel autenticado.
O que é o Hórus?
Uma visão direta do sistema — ideal para novos membros da equipe.
O Hórus é o sistema web interno da Sites Latam para gestão de chamados de Facilities e RH. Roda localmente via Python/FastAPI e é acessado pelo navegador. Solicitantes externos usam o formulário público (form.html) acessível via QR Code impresso. A equipe acessa o painel gerencial em index.html.
Abertura via QR Code
Solicitantes escaneiam o QR Code impresso e preenchem o formulário público sem precisar de login. O protocolo HOR-YY-XXXX é gerado automaticamente.
Fila de Chamados
A equipe de RH/Facilities acompanha todos os chamados em uma fila unificada. Filtros por status, urgência e período. Atribuição de responsável e acompanhamento em tempo real.
Custo do Chamado
Registro financeiro de cada chamado: mão de obra, materiais, equipamentos e serviços terceirizados. Inclui fornecedor, nota de qualidade e observações.
Dashboard Gerencial
5 KPIs em tempo real: Total, Abertos, Em Andamento, Concluídos e Custo Total. Gráficos de distribuição por urgência e por departamento.
Administração
Gestão de usuários com controle de perfil (admin / analista). Logs de acesso e auditoria de sessões da equipe.
Perfis de Acesso
Admin — acesso total incluindo painel de usuários. Analista — dashboard, chamados e custo. Público — somente formulário de abertura via QR Code.
Como executar o sistema
cd "<caminho-do-projeto>\backend"python -m uvicorn main:app --reload --use-colorsAbra frontend/index.html diretamente no navegador. Não usar venv localmente.
Stack Técnica
Tecnologias usadas em cada camada do sistema.
FastAPI
Framework backend — API REST na porta 8000
SQLAlchemy
ORM — modelos e sessões MySQL/SQLite
MySQL (prod)
Banco de dados em produção via .env
SQLite (dev)
Fallback local — backend/horus.db
python-jose
Geração e validação de tokens JWT
passlib / bcrypt
Hash seguro de senhas
Vanilla JS
Frontend SPA — fetch API, Chart.js, qrcodejs
Outfit® / Brand
Tipografia única — Manual de Marca Sites Latam
Uvicorn
Servidor ASGI — execução local (Anaconda)
Identidade Visual — Variáveis CSS obrigatórias
.main-content::before com opacity 0.65 — não alterar z-index dos filhos.Arquitetura do Sistema
Estrutura de arquivos e responsabilidade de cada componente.
Backend
| Arquivo | Responsabilidade |
|---|---|
main.py | Entrypoint FastAPI — registra routers, configura CORS, monta /uploads, executa create_all na inicialização. |
database.py | Engine SQLAlchemy — MySQL via .env com fallback SQLite (horus.db). Factory get_db(). |
models.py | 6 modelos ORM: Chamado, Historico, Anexo, Usuario, ValorChamado, LogAcesso. Enums: StatusChamado, UrgenciaChamado, CategoriaValor. |
schemas.py | Schemas Pydantic de validação de entrada e resposta para todos os modelos. |
security.py | JWT com python-jose + hash bcrypt com passlib. Funções: criar_token(), get_current_user(). |
routers/auth.py | POST /api/login · PATCH /api/usuarios/{email}/senha · GET /api/usuarios/{email}/status (heartbeat) |
routers/chamados.py | CRUD completo de chamados com upload de anexo, geração de protocolo e registro automático de histórico. |
routers/valor.py | GET / POST / DELETE de itens de custo financeiro por chamado. |
routers/estatisticas.py | Cards KPI (total, abertos, andamento, concluídos, custo_total) e dados para gráficos — com filtros de data e status. |
routers/admin.py | CRUD de usuários (admin-only) + listagem de logs de acesso. |
services/protocolo.py | Gera protocolo único no formato HOR-YY-XXXX (ex: HOR-26-0001). |
.env | Credenciais MySQL: DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME. Não versionar. |
Frontend
| Arquivo | Responsabilidade |
|---|---|
index.html | SPA unificado — login overlay + todas as views + sidebar retrátil. API_BASE_URL em <script> no topo — única linha a alterar no deploy Linux. |
form.html | Formulário público de abertura de chamados. Acessado via QR Code. Nunca modificar. |
documentacao.html | Este documento — documentação técnica do sistema. |
js/auth.js | Navegação SPA (navegarPara()), config VIEWS, authFetch(), guardião de sessão, logout. |
js/chamados.js | Fila de chamados, modal de detalhe, funções de Valor do Chamado e modal QR Code. |
js/dashboard.js | 5 KPIs + 2 gráficos Chart.js (urgência e departamento). |
js/admin.js | Gestão de usuários (CRUD) e listagem de logs de acesso. |
js/login.js | Autenticação — POST /api/login, armazena token e sessão no localStorage. |
css/layout.css | Design system global: sidebar, topbar, tabelas, KPIs, modais. |
Fluxo de requisição
(index.html)
+ JWT Bearer
(main.py)
específico
ORM
Tabelas e Modelos
Estrutura completa do banco — modelos ORM em backend/models.py.
models.Base.metadata.create_all(bind=engine) é chamado no main.py a cada inicialização — cria tabelas novas sem dropar as existentes.assignment tb_Horus_forms — Chamados
HOR-YY-XXXX, gerado por services/protocolo.pybaixa | media | alta | criticaaberto | em_andamento | concluido | canceladoconcluidohistory tb_Horus_historico — Linha do tempo do chamado
tb_Horus_forms.idPOST /api/chamados/{id}/historico.attach_file tb_Horus_anexos — Arquivos do chamado
tb_Horus_forms.id/uploads/{uuid}{extensao} — servido como static fileimage/jpeg, application/pdf)payments tb_Horus_valor_chamado — Custos financeiros
tb_Horus_forms.idmao_de_obra | material | equipamento | servico_terceiro | outrosperson tb_Horus_usuarios — Equipe autenticada
admin | analistareceipt_long tb_Horus_logs — Auditoria de sessões
tb_Horus_usuarios.idFluxo Completo do Chamado
Da abertura via QR Code até o encerramento pela equipe.
Abertura via QR Code
Solicitante escaneia o QR Code impresso no local. Abre form.html no navegador do celular — sem necessidade de login. Preenche nome, e-mail, departamento, local, tipo de serviço, urgência e descrição. Pode anexar uma foto.
Geração do Protocolo
O backend (POST /api/chamados) chama gerar_protocolo(db) que cria um código único no formato HOR-YY-XXXX. O IP e user-agent do solicitante são registrados como rastreio anti-trote.
Triagem pela equipe
Analista acessa index.html, faz login e navega para "Fila de Chamados". O chamado aparece com status aberto. A equipe atribui responsável e altera status para em_andamento.
Execução e registro de custo
Durante a execução, a equipe pode registrar itens de custo (mão de obra, materiais, etc.) diretamente no modal do chamado. Cada item aceita fornecedor e nota de qualidade.
Conclusão
Status alterado para concluido. O campo concluido_em é preenchido automaticamente. O custo total do chamado fica disponível no KPI do dashboard.
Dashboard — Indicadores Gerenciais
Visão consolidada de performance em tempo real com filtros de período e status.
KPIs disponíveis (5 cards)
| KPI | Fonte |
|---|---|
| Total de Chamados | GET /api/estatisticas/cards → total |
| Abertos | status = aberto |
| Em Andamento | status = em_andamento |
| Concluídos | status = concluido |
| Custo Total (azul) | SUM(tb_Horus_valor_chamado.valor_reais) |
Gráficos
- Distribuição por Urgência — gráfico de rosca (Chart.js)
- Chamados por Departamento — gráfico de barras (Chart.js)
Filtros disponíveis
data_inicio/data_fim— filtra porcriado_emstatus— filtra por status específico- Todos os filtros são aplicados simultaneamente nos cards e nos gráficos
Fila de Chamados
Gerenciamento e acompanhamento de todos os chamados abertos.
Funcionalidades
- Tabela com todos os chamados ordenados pelo mais recente
- Filtros por status, urgência e busca textual
- Modal de detalhe — histórico de ações, anexos e seção de Custo do Chamado
- PATCH de status diretamente pelo modal (aberto → em_andamento → concluido → cancelado)
- Atribuição de responsável registrada automaticamente no histórico
- Geração de QR Code para o link do formulário público
Status e cores
Urgência e cores
Valor do Chamado
Registro financeiro de custos por chamado — implementado na Fase 1.
Categorias de custo
| Enum | Exibição |
|---|---|
mao_de_obra | Mão de Obra |
material | Material |
equipamento | Equipamento |
servico_terceiro | Serviço Terceiro |
outros | Outros |
Campos por item
categoria— enum obrigatóriovalor_reais— NUMERIC(10,2) obrigatóriofornecedor_nome/fornecedor_contato— opcionaisnota_qualidade— 1 a 5 estrelas (opcional)obs_qualidade— texto livre (opcional)preenchido_por— email do usuário logado (automático)
SUM(valor_reais) no endpoint GET /api/estatisticas/cards.Administração
Gestão de usuários e auditoria de acesso — exclusivo para perfil admin.
Gestão de usuários
- Criar novos usuários (email, senha, perfil)
- Ativar / desativar usuário sem excluir
- Redefinir senha pelo admin
- Alterar perfil:
admin↔analista
Logs de acesso
- Listagem de todos os eventos de sessão registrados em
tb_Horus_logs - Visível apenas para administradores
- Heartbeat atualiza
ultimo_acessoa cada 10 segundos
Rotas da API
Documentação completa disponível em http://localhost:8000/docs (Swagger automático do FastAPI).
routers/auth.pyultimo_acesso (a cada 10s)routers/chamados.pyrouters/valor.pyrouters/estatisticas.pydata_inicio, data_fim, statusrouters/admin.py · Requer perfil adminFrontend SPA
Single Page Application — arquivo único frontend/index.html com login overlay e 4 views.
Views e acesso
| viewId | Título | Acesso | Função de carga |
|---|---|---|---|
viewInicio | Início | Todos | Hub de navegação — sem carga de dados |
viewDashboard | Indicadores Gerenciais | Todos | carregarDashboard() |
viewChamados | Fila de Chamados | Todos | carregarChamados() |
viewAdmin | Área do Administrador | Somente admin | carregarLogsAcesso() + carregarUsuariosADM() |
Autenticação no frontend
| Item | Detalhe |
|---|---|
localStorage.getItem('omni_token') | Token JWT Bearer — enviado em toda requisição autenticada via authFetch() |
localStorage.getItem('calculadora_sessao') | Objeto { email, perfil } — controla visibilidade de menus e rotas admin-only |
authFetch(url, options) | Wrapper de fetch() com Bearer automático. Intercepta 401 e chama fazerLogout() |
iniciarGuardiao() | Heartbeat a cada 10s em GET /api/usuarios/{email}/status |
navegarPara() usa display: block por padrão. Views com classe .hub-container recebem display: flex (necessário para o layout centralizado do Hub). Se uma futura view precisar de flex, adicionar a detecção em auth.js:45.Deploy Linux — única linha a alterar
Regras Críticas
Pontos de atenção que previnem quebras no sistema.
python.exe do Anaconda diretamente. Nunca criar venv neste projeto.models.Base.metadata.create_all() cria tabelas novas sem dropar as existentes. As tabelas tb_Horus_insumos e tb_Horus_insumos_movimento já existem no MySQL — não recriar manualmente.<style> do index.html. Design system global (sidebar, topbar, tabelas, KPIs) fica em css/layout.css.Roadmap — Próximas Fases
| Fase | Objetivo | Status |
|---|---|---|
| Fase 0 | Unificação SPA — index.html, sidebar, hub, auth | ✅ Concluída |
| Fase 1 | Valor do Chamado — custos financeiros + KPI custo total | ✅ Concluída |
| Fase 2 | Insumos / Consumíveis — controle de estoque de materiais | 🔲 Pendente |
| Fase 3 | Data Base Viewer — visualização paginada das tabelas (admin) | 🔲 Pendente |