# Requisitos — Gertel Talentos Backend

> Legenda: `[X]` implementado · `[ ]` pendente · `[~]` parcialmente implementado

Plataforma para gestão de processos seletivos da Gertel. Possui dois públicos distintos:
- **ADMIN/USER (RH)**: operadores internos que cadastram vagas, gerenciam candidaturas e avaliam candidatos.
- **CANDIDATE**: candidatos externos que se registram, montam currículo e se candidatam a vagas.

---

## 1. Autenticação e Autorização

### Requisitos funcionais
[X] Deve ser possível autenticar um usuário interno (login/senha);
[X] Deve ser possível autenticar um usuário interno via ATI (SSO Gertel);
[X] Deve ser possível autenticar um candidato (login/senha);
[X] Deve ser possível renovar o token de acesso via refresh token (cookie);
[X] Deve ser possível retornar dados do usuário autenticado (`/auth/me`);
[X] Deve ser possível solicitar recuperação de senha de candidato (e-mail);
[X] Deve ser possível validar token de recuperação de senha;
[X] Deve ser possível redefinir a senha via token recebido por e-mail;

### Requisitos não funcionais
[X] Tokens JWT devem ter expiração curta (access: 30m);
[X] Refresh token deve ser armazenado em cookie HTTP-only;
[X] Tokens emitidos devem ser persistidos e revogáveis (MongoDB `tokens`);
[X] Senhas devem ser armazenadas com hash (SHA-256);
[X] Payload do JWT deve distinguir papéis (`ADMINISTRATOR` / `CANDIDATE`);
[x] Deve existir rate-limit em endpoints sensíveis (login, forgot-password);

---

## 2. Controle de Usuários (RH/ADMIN)

### Requisitos funcionais
[X] Deve ser possível criar um usuário;
[X] Deve ser possível buscar um usuário;
[X] Deve ser possível listar todos os usuários;
[X] Deve ser possível alterar a senha de um usuário;
[ ] Deve ser possível inativar/excluir um usuário;
[ ] Deve ser possível atribuir/alterar o papel (role) de um usuário;

### Requisitos não funcionais
[X] Todo usuário deve estar vinculado a um departamento;
[X] Deve ser possível autenticar um usuário via ATI;
[X] Login do usuário deve ser único;

---

## 3. Controle de Departamentos

### Requisitos funcionais
[X] Deve ser possível criar um departamento;
[X] Deve ser possível listar os departamentos;
[ ] Deve ser possível atualizar o nome de um departamento;
[ ] Deve ser possível excluir um departamento (somente sem vínculos);

---

## 4. Controle de Candidatos

### Requisitos funcionais
[X] Deve ser possível criar uma conta de candidato;
[X] Deve ser possível verificar se um login já existe;
[X] Deve ser possível buscar um candidato por CPF;
[X] Deve ser possível listar candidatos (RH);
[X] Deve ser possível alterar a senha do candidato;
[X] Deve ser possível excluir a conta do candidato;
[X] Deve ser possível listar respostas gerais do candidato;
[X] Deve ser possível listar respostas específicas do candidato (por vaga);

### Requisitos não funcionais
[X] Cada conta deve ter login único (CPF);
[X] E-mail do candidato deve ser único;
[X] Candidato autenticado não deve acessar dados de outro candidato (JWT scope);
[X] Última atualização do perfil deve ser registrada (`last_update`);

---

## 5. Controle de Currículo

### Requisitos funcionais
[X] Deve ser possível registrar/atualizar dados pessoais (telefone, endereço, etc.);
[X] Deve ser possível registrar experiências profissionais;
[X] Deve ser possível registrar formações acadêmicas;
[X] Deve ser possível registrar idiomas;
[X] Deve ser possível registrar áreas de interesse;
[X] Deve ser possível fazer upload de anexos (currículo em PDF);
[X] Deve ser possível fazer upload da foto de perfil;
[X] Deve ser possível consultar o currículo completo;
[X] Deve ser possível atualizar o currículo;
[X] Deve ser possível excluir o currículo;

### Requisitos não funcionais
[X] Upload de arquivos limitado a 10MB;
[X] Arquivos servidos via rota estática `/uploads`;
[ ] Validar tipo MIME dos arquivos enviados (apenas PDF/imagem);
[ ] Aplicar antivírus/scan nos anexos antes de armazenar;

---

## 6. Controle de Vagas (ADMIN/RH)

### Requisitos funcionais
[X] Deve ser possível criar uma vaga;
[X] Deve ser possível buscar uma vaga pelo ID;
[X] Deve ser possível listar vagas em aberto;
[X] Deve ser possível listar vagas pausadas;
[X] Deve ser possível listar vagas encerradas;
[X] Deve ser possível atualizar uma vaga;
[X] Deve ser possível pausar uma vaga;
[X] Deve ser possível reabrir uma vaga;
[X] Deve ser possível encerrar uma vaga;
[X] Deve ser possível excluir uma vaga (soft delete);
[X] Deve ser possível associar perguntas (gerais/específicas) à vaga;
[X] Deve ser possível associar etapas de processo à vaga;

### Requisitos não funcionais
[X] Vaga deve ter status (OPENED | PAUSED | FINISHED);
[X] Vaga deve estar vinculada a um departamento;
[X] Exclusão deve ser lógica (campo `deleted_at`);

---

## 7. Controle de Vagas (CLIENT/Candidato)

### Requisitos funcionais
[X] Deve ser possível listar vagas em aberto (público);
[X] Deve ser possível buscar informações de uma vaga (público);
[X] Deve ser possível se candidatar a uma vaga;
[ ] Deve ser possível filtrar vagas por área/localização/modelo de trabalho;
[ ] Deve ser possível o candidato consultar suas próprias candidaturas;

---

## 8. Controle de Etapas de Vagas (VacancyStep)

### Requisitos funcionais
[X] Deve ser possível criar uma etapa para uma vaga;
[X] Deve ser possível listar as etapas de uma vaga;
[ ] Deve ser possível atualizar/reordenar etapas;
[ ] Deve ser possível excluir uma etapa;

---

## 9. Controle de Candidaturas

### Requisitos funcionais
[X] Deve ser possível registrar uma candidatura (candidato → vaga);
[X] Deve ser possível listar candidaturas (RH);
[X] Deve ser possível consultar uma candidatura;
[X] Deve ser possível atualizar uma candidatura;
[X] Deve ser possível avançar candidatura para próxima etapa;
[X] Deve ser possível aprovar uma candidatura;
[X] Deve ser possível reprovar uma candidatura;
[X] Deve ser possível listar avaliações associadas a candidaturas;
[X] Deve ser possível marcar candidatura como CONTRATADO (HIRED);
[ ] Deve ser possível notificar o candidato a cada mudança de status (e-mail);

### Requisitos não funcionais
[X] Candidatura deve ter status (ANALYSIS | APPROVED | REPROVED | HIRED);
[X] Candidatura referencia a etapa atual da vaga;
[X] Não deve ser possível candidatar-se mais de uma vez à mesma vaga;

---

## 10. Controle de Perguntas (Question)

### Requisitos funcionais
[X] Deve ser possível criar uma pergunta (geral ou específica de vaga);
[X] Deve ser possível listar perguntas;
[X] Deve ser possível buscar uma pergunta;
[X] Deve ser possível atualizar uma pergunta;
[X] Deve ser possível excluir uma pergunta;

### Requisitos não funcionais
[X] Perguntas podem ser do tipo GERAL (currículo) ou ESPECIFICA (vaga);

---

## 11. Controle de Respostas (Answer)

### Requisitos funcionais
[X] Deve ser possível registrar uma resposta a uma pergunta;
[X] Deve ser possível listar respostas;
[X] Deve ser possível buscar uma resposta;
[X] Deve ser possível atualizar uma resposta;
[X] Deve ser possível excluir uma resposta;

### Requisitos não funcionais
[X] Resposta deve ser do tipo CANDIDATURE ou CURRICULUM;
[X] Resposta deve guardar referência à entidade de origem (`id_reference`);

---

## 12. Controle de Avaliações (Avaliation)

### Requisitos funcionais
[X] Deve ser possível avaliar um currículo ou candidatura (nota + texto);
[X] Deve ser possível listar avaliações;
[X] Deve ser possível buscar uma avaliação;
[X] Deve ser possível atualizar uma avaliação;
[X] Deve ser possível excluir uma avaliação;

### Requisitos não funcionais
[X] Avaliação deve registrar autor (usuário RH) e data de criação;
[X] Avaliação deve ter tipo (CANDIDATURE | CURRICULUM);

---

## 13. Controle de Feedbacks

### Requisitos funcionais
[X] Deve ser possível registrar um feedback em uma candidatura;
[X] Deve ser possível listar feedbacks;
[X] Deve ser possível buscar um feedback;
[X] Deve ser possível atualizar um feedback;
[X] Deve ser possível excluir um feedback;
[ ] Feedbacks devem ser enviados ao candidato por e-mail quando publicados;

---

## 14. Controle de Benefícios

### Requisitos funcionais
[X] Deve ser possível listar benefícios (público — exibição na página de vagas);
[ ] Deve ser possível criar/editar/excluir benefícios (RH);

---

## 15. Integrações Externas

### Requisitos funcionais
[X] Deve ser possível autenticar contra a API Gertel (token cache);
[X] Deve ser possível enviar e-mail (mailing — SMTP/serviço de envio);
[X] Deve ser possível enviar e-mail transacional via API Gertel (`/gertel/email`);
[X] Deve ser possível enviar SMS via API Gertel (`/gertel/sms`);
[X] Deve ser possível validar reCAPTCHA do Google;
[X] Deve ser possível autenticar usuário via SSO ATI;

### Requisitos não funcionais
[X] Token da API Gertel deve ser cacheado e renovado automaticamente;
[X] Toda chamada externa deve ser logada (`external_requests`);

---

## 16. Auditoria e Observabilidade

### Requisitos funcionais
[X] Deve ser possível registrar todas as requisições HTTP (`requests`);
[X] Deve ser possível registrar todas as chamadas externas (`external_requests`);
[X] Deve ser possível registrar tokens emitidos (`tokens`);
[ ] Deve ser possível consultar logs de requisições via API (rota de admin);
[ ] Integração com ferramenta externa (Sentry/DataDog) para erros em produção;

### Requisitos não funcionais
[X] Logs devem incluir IP, headers, body, payload de resposta e status;
[X] Tokens expirados devem ser auto-removidos (TTL index no MongoDB);

---

## 17. Infraestrutura e Armazenamento

### Requisitos não funcionais
[X] Banco relacional MySQL via Prisma para dados de negócio;
[X] MongoDB via Mongoose para logs e tokens;
[X] Armazenamento local de uploads em `/uploads`;
[X] Configuração por variáveis de ambiente validadas com Zod;
[X] CORS habilitado para o frontend;
[X] Fuso horário fixado em `America/Sao_Paulo`;
[ ] Storage de arquivos em provedor externo (S3/GCS) para produção;
[ ] Backups automatizados do banco relacional;

---

## 18. Qualidade e Testes

### Requisitos não funcionais
[X] Casos de uso possuem testes unitários (Vitest);
[X] Repositórios in-memory para isolar testes do banco;
[X] Arquitetura hexagonal (use-cases independentes de framework);
[ ] Cobertura mínima de testes definida no CI;
[ ] Testes end-to-end das rotas HTTP;
