Voltar para desafios

#4 Sistema de Ponto

#4 Sistema de Ponto

#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:

  1. Gerenciar usuários (funcionários e administradores).
  2. Registrar horários de entrada e saída.
  3. Calcular horas trabalhadas.
  4. Fornecer relatórios e métricas para administradores.

Requisitos Técnicos

MVP (Minimum Viable Product)

  1. API RESTful com endpoints para registro, consulta e relatório de pontos.
  2. Banco de dados estruturado para armazenar registros de ponto, usuários e seus papéis.
  3. Cálculo de horas trabalhadas por dia, semana ou mês.
  4. 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

  1. Integração com notificações (ex.: lembrete para bater ponto).
  2. Painel web para gerenciamento.
  3. Relatórios exportáveis (CSV ou PDF).
  4. Configuração de horas extras e jornadas específicas.

Fluxo de Uso

Funcionários

  1. Fazem login no sistema.
  2. Registram horários de entrada e saída.
  3. Consultam o histórico de pontos e horas trabalhadas.

Administradores

  1. Fazem login no sistema com privilégios elevados.
  2. Visualizam e gerenciam os registros de todos os funcionários.
  3. Geram relatórios com base em filtros (por funcionário, data, etc.).
  4. Configuram a jornada padrão (ex.: 8h diárias, 44h semanais).

Endpoints

Autenticação

  1. Registrar usuário

    • POST /api/users/register
    • Body:
      1{ 2 "name": "Fulano da Silva", 3 "email": "joao@example.com", 4 "password": "123456", 5 "role": "employee" 6}
    • Response:
      1{ 2 "id": "12345", 3 "message": "User created successfully" 4}
  2. Login

    • POST /api/auth/login
    • Body:
      1{ 2 "email": "joao@example.com", 3 "password": "123456" 4}
    • Response:
      1{ 2 "token": "jwt-token", 3 "role": "employee" 4}

Funcionários

  1. Registrar ponto

    • POST /api/punch-clock
    • Headers: Authorization: Bearer <jwt-token>
    • Body:
      1{ 2 "type": "check-in" // or "check-out" 3}
    • Response:
      1{ 2 "message": "Ponto registrado com sucesso", 3 "timestamp": "2024-11-21T08:00:00Z" 4}
  2. Consultar histórico de pontos

    • GET /api/punch-clock/history
    • Headers: Authorization: Bearer <jwt-token>
    • Response:
      1[ 2 { 3 "date": "2024-11-21", 4 "check-in": "08:00", 5 "check-out": "17:00", 6 "hours_worked": 9 7 } 8]

Administradores

  1. Listar todos os registros

    • GET /api/admin/punch-clock
    • Headers: Authorization: Bearer <jwt-token>
    • Query Params:
      • employeeId (opcional)
      • startDate e endDate (opcional)
    • Response:
      1[ 2 { 3 "employee": "Fulano da Silva", 4 "date": "2024-11-21", 5 "check-in": "08:00", 6 "check-out": "17:00", 7 "hours_worked": 9 8 } 9]
  2. Gerar relatório

    • GET /api/admin/reports
    • Headers: Authorization: Bearer <jwt-token>
    • Query Params:
      • startDate
      • endDate
    • Response (CSV ou JSON):
      1{ 2 "total_hours": 44, 3 "employees": [ 4 { 5 "name": "Fulano da Silva", 6 "hours_worked": 44 7 }, 8 { 9 "name": "Ciclana Machado", 10 "hours_worked": 40 11 } 12 ] 13}

Estrutura do Banco de Dados

Tabelas

  1. Users

    • id (UUID, Primary Key)
    • name (String)
    • email (String, único)
    • password (Hash)
    • role (Enum: employee, admin)
  2. PunchClock

    • id (UUID, Primary Key)
    • user_id (Foreign Key para Users)
    • type (Enum: check-in, check-out)
    • timestamp (DateTime)
  3. 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 ou xlsx.

Como Disponibilizar no Portfólio

Para adicionar esse projeto ao seu portfólio de maneira atrativa, considere os seguintes pontos:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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.

Rafael Coelho
2024- 2025

v2.0.2 • Build: 2025-04-22