Sistema completo de gestão de ponto eletrônico desenvolvido com Django e Django REST Framework, seguindo arquitetura API-first e princípios SOLID.
O Sistema de Ponto Eletrônico Maker é uma aplicação web robusta, segura e escalável para gestão de Time and Attendance. O sistema foi projetado com total desacoplamento entre backend e clientes (terminais físicos, sistemas de terceiros), utilizando uma arquitetura API-first.
- Arquitetura API-first: Total desacoplamento entre backend e frontend
- Autenticação Dupla: Token para terminais físicos e JWT para integrações externas
- Sistema de Permissões Dinâmico: Baseado no sistema nativo do Django (Groups e Permissions)
- Row-Level Security: Controle granular de acesso aos dados
- Importação/Exportação: Suporte a CSV e Excel
- Relatórios Automatizados: Cálculo automático de horas, atrasos e extras
- Python: 3.10+
- Framework: Django 4.2+
- API: Django REST Framework
- Banco de Dados: SQLite (desenvolvimento)
- Autenticação: DRF Token + JWT (Simple JWT)
- Python 3.10 ou superior
- pip
- virtualenv (recomendado)
- Clone o repositório (ou extraia o arquivo ZIP)
cd ponto_eletronico- Crie e ative o ambiente virtual
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# ou
venv\Scripts\activate # Windows- Instale as dependências
pip install -r requirements.txt- Execute as migrações
python manage.py migrate- Crie um superusuário
python manage.py createsuperuser- Inicie o servidor de desenvolvimento
python manage.py runserverO sistema estará disponível em http://localhost:8000
- Acesse o Django Admin em
/admin - Crie um usuário para o terminal
- Gere um Token em "Auth Token > Tokens"
- Use o token no header:
Authorization: Token <seu-token>
- Obtenha o token JWT:
POST /api/v1/token/
{
"username": "seu_usuario",
"password": "sua_senha"
}- Use o token no header:
Authorization: Bearer <seu-token-jwt>
POST /api/v1/ponto/registrar/
Authorization: Token <token>
Content-Type: application/json
{
"biometric_id": 12345,
"tipo": "Entrada"
}Tipos válidos: Entrada, Saída, Início Intervalo, Fim Intervalo
GET /api/v1/funcionarios/sincronizar/
Authorization: Token <token>Retorna lista de IDs biométricos ativos.
GET /api/v1/funcionarios/?departamento=1&cargo=2&status=Ativo
Authorization: Bearer <jwt-token>GET /api/v1/registros/?matricula_funcionario=12345&data_inicio=2024-01-01&data_fim=2024-01-31
Authorization: Bearer <jwt-token>GET /api/v1/relatorios/folha-ponto/?matricula_funcionario=12345&data_inicio=2024-01-01&data_fim=2024-01-31
Authorization: Bearer <jwt-token>POST /api/v1/ajuste-ponto/
Authorization: Bearer <jwt-token>
Content-Type: application/json
{
"funcionario": 1,
"timestamp": "2024-01-15T09:00:00Z",
"tipo": "Entrada",
"justificativa": "Esqueceu de registrar na entrada"
}Requer permissão: can_adjust_ponto
Todos os endpoints de listagem possuem ações de exportação:
GET /api/v1/funcionarios/export_csv/
GET /api/v1/funcionarios/export_excel/
GET /api/v1/departamentos/export_csv/
GET /api/v1/cargos/export_csv/
GET /api/v1/turnos/export_csv/
GET /api/v1/registros/export_csv/Requer permissão: can_export_data
O sistema utiliza o modelo nativo de permissões do Django, com três permissões customizadas:
- can_adjust_ponto: Permite realizar ajustes manuais no ponto
- can_view_all_reports: Permite visualizar todos os relatórios
- can_export_data: Permite exportar dados e relatórios
- Acesse o Django Admin (
/admin) - Vá em "Grupos" (Groups)
- Crie um novo grupo (ex: "Gestores", "RH", "Operadores")
- Atribua as permissões desejadas ao grupo
- Adicione usuários ao grupo
Importante: Não existem papéis pré-definidos no código. Todos os níveis de acesso são criados dinamicamente via Django Admin.
nome: Nome do departamento (único)
nome: Nome do cargo (único)
nome: Nome do turno (único)hora_inicio: Horário de iníciohora_fim: Horário de fimduracao_intervalo_minutos: Duração do intervalotolerancia_atraso_minutos: Tolerância de atraso (padrão: 5 min)
nome_completo: Nome completomatricula: Matrícula (único)email: E-mail corporativo (único)biometric_id: ID biométrico (único, opcional)status: Ativo, Inativo, Férias, Demitidodepartamento: FK para Departamentocargo: FK para Cargoturno: FK para Turno
funcionario: FK para Funcionariotimestamp: Data e hora do registrotipo: Entrada, Saída, Início Intervalo, Fim Intervaloorigem: Terminal Biométrico, Ajuste Manualjustificativa: Justificativa (obrigatória para ajustes)ajustado_por: FK para User (quem fez o ajuste)
Execute os testes com:
python manage.py testOs testes cobrem:
- Criação de modelos
- Endpoints da API
- Sistema de autenticação
- Sistema de permissões
- Validações de negócio
ponto_eletronico/
├── config/ # Configurações do projeto
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── core/ # App principal
│ ├── migrations/
│ ├── admin.py # Configuração do Django Admin
│ ├── models.py # Modelos de dados
│ ├── serializers.py # Serializers DRF
│ ├── views.py # Views da API
│ ├── urls.py # Rotas da API
│ ├── permissions.py # Permissões customizadas
│ ├── services.py # Lógica de negócio
│ └── tests.py # Testes
├── manage.py
├── requirements.txt
└── README.md
O projeto foi desenvolvido seguindo os princípios SOLID:
- Single Responsibility: Cada classe tem uma única responsabilidade
- Open/Closed: Extensível sem modificar código existente
- Liskov Substitution: Abstrações podem ser substituídas
- Interface Segregation: Serializers específicos para cada caso de uso
- Dependency Inversion: Views dependem de services (abstrações)
- Models: Representação dos dados (ORM)
- Serializers: Validação e serialização de dados
- Services: Lógica de negócio complexa
- Permissions: Controle de acesso granular
- Views: Orquestração e resposta HTTP
- URLs: Roteamento de requisições
Para produção, considere:
- Migrar para PostgreSQL ou MySQL
- Configurar variáveis de ambiente (SECRET_KEY, DEBUG, etc)
- Implementar cache (Redis)
- Configurar CORS adequadamente
- Adicionar rate limiting
- Implementar logging estruturado
- Configurar backup automático
- Deploy com Gunicorn + Nginx
Este projeto foi desenvolvido como parte do Sistema de Ponto Eletrônico Maker.
Para dúvidas ou suporte, consulte a documentação do Django e Django REST Framework: