#4 Desafio de Programação: Sistema de Ponto
Descrição
Desenvolva um Sistema de Ponto para empresas, onde funcionários podem registrar seus horários de entrada e saída, e administradores podem acompanhar e gerenciar esses registros. O foco principal é no backend, mas um frontend simples e opcional pode ser criado para demonstrar o funcionamento básico do sistema.
Objetivo
Criar uma API backend para:
- Gerenciar usuários (funcionários e administradores).
- Registrar horários de entrada e saída.
- Calcular horas trabalhadas.
- Fornecer relatórios e métricas para administradores.
Requisitos Técnicos
MVP (Minimum Viable Product)
- API RESTful com endpoints para registro, consulta e relatório de pontos.
- Banco de dados estruturado para armazenar registros de ponto, usuários e seus papéis.
- Cálculo de horas trabalhadas por dia, semana ou mês.
- Controle de autenticação e autorização:
- Usuários autenticados podem registrar seus pontos.
- Administradores têm acesso aos relatórios e métricas.
Extras para Diferencial
- Integração com notificações (ex.: lembrete para bater ponto).
- Painel web para gerenciamento.
- Relatórios exportáveis (CSV ou PDF).
- Configuração de horas extras e jornadas específicas.
Fluxo de Uso
Funcionários
- Fazem login no sistema.
- Registram horários de entrada e saída.
- Consultam o histórico de pontos e horas trabalhadas.
Administradores
- Fazem login no sistema com privilégios elevados.
- Visualizam e gerenciam os registros de todos os funcionários.
- Geram relatórios com base em filtros (por funcionário, data, etc.).
- Configuram a jornada padrão (ex.: 8h diárias, 44h semanais).
Endpoints
Autenticação
-
Registrar usuário
- POST
/api/users/register
- Body:
{ "name": "Fulano da Silva", "email": "joao@example.com", "password": "123456", "role": "employee" }
- Response:
{ "id": "12345", "message": "User created successfully" }
- POST
-
Login
- POST
/api/auth/login
- Body:
{ "email": "joao@example.com", "password": "123456" }
- Response:
{ "token": "jwt-token", "role": "employee" }
- POST
Funcionários
-
Registrar ponto
- POST
/api/punch-clock
- Headers:
Authorization: Bearer <jwt-token>
- Body:
{ "type": "check-in" // or "check-out" }
- Response:
{ "message": "Ponto registrado com sucesso", "timestamp": "2024-11-21T08:00:00Z" }
- POST
-
Consultar histórico de pontos
- GET
/api/punch-clock/history
- Headers:
Authorization: Bearer <jwt-token>
- Response:
[ { "date": "2024-11-21", "check-in": "08:00", "check-out": "17:00", "hours_worked": 9 } ]
- GET
Administradores
-
Listar todos os registros
- GET
/api/admin/punch-clock
- Headers:
Authorization: Bearer <jwt-token>
- Query Params:
employeeId
(opcional)startDate
eendDate
(opcional)
- Response:
[ { "employee": "Fulano da Silva", "date": "2024-11-21", "check-in": "08:00", "check-out": "17:00", "hours_worked": 9 } ]
- GET
-
Gerar relatório
- GET
/api/admin/reports
- Headers:
Authorization: Bearer <jwt-token>
- Query Params:
startDate
endDate
- Response (CSV ou JSON):
{ "total_hours": 44, "employees": [ { "name": "Fulano da Silva", "hours_worked": 44 }, { "name": "Ciclana Machado", "hours_worked": 40 } ] }
- GET
Estrutura do Banco de Dados
Tabelas
-
Users
id
(UUID, Primary Key)name
(String)email
(String, único)password
(Hash)role
(Enum:employee
,admin
)
-
PunchClock
id
(UUID, Primary Key)user_id
(Foreign Key paraUsers
)type
(Enum:check-in
,check-out
)timestamp
(DateTime)
-
Settings
id
(UUID, Primary Key)workday_hours
(Decimal, horas padrão por dia)overtime_rate
(Decimal, taxa de hora extra)
Tecnologias Recomendadas
Backend
- Sugestões de Linguagem: .NET Core, Java, Node.js (Express) ou Python (Django/Flask).
- Banco de Dados: PostgreSQL ou MySQL.
- Autenticação: JWT (JSON Web Tokens).
Frontend (Opcional)
- Framework: React.js, Angular ou Vue.js.
- Design: Tailwind CSS ou Ant Design.
Extras
- Notificações: Twilio ou SendGrid para lembretes.
- Relatórios: Biblioteca como
pdfkit
ouxlsx
.
Como Disponibilizar no Portfólio
Para adicionar esse projeto ao seu portfólio de maneira atrativa, considere os seguintes pontos:
-
Publicar no GitHub com um bom README.md: Suba o código no GitHub com uma descrição completa do projeto, incluindo uma breve introdução, estrutura do banco de dados, principais endpoints e instruções para instalação modo de uso, regras de negócio, explicação das decisões técnicas e etc.
-
Documentação da API: Use o Swagger ou Postman para documentar a API, incluindo exemplos de requisições e respostas. Isso facilita a compreensão das funcionalidades e mostra seu cuidado com documentação.
-
Demonstração com Docker: Disponibilize uma configuração Docker para facilitar a execução da API. Isso torna o projeto acessível para quem deseja testá-lo rapidamente.
-
Apresentação Visual: Crie um README.md organizado e visualmente atrativo, com imagens e diagramas simples (como diagrama ER) para demonstrar o funcionamento e a arquitetura do sistema.
-
Demo em Produção: Se possível, hospede o projeto em uma plataforma gratuita como Vercel ou Render, para que recrutadores ou interessados possam testar a API em tempo real.
-
Explicação Técnica no Portfólio: Adicione uma seção explicando os desafios enfrentados e soluções implementadas. Destacar problemas específicos resolvidos mostra seu conhecimento técnico.
Boa sorte e bom desafio! 🚀
Envie o link do seu projeto
Envie o link do seu projeto para o email contato@racoelho.com.br.