Requisitos do Sistema
Requisitos Funcionais
RF001 - Gestão de Usuários
Cadastro e Autenticação
- RF001.1: O sistema deve permitir cadastro de usuários usando CPF
- RF001.2: Autenticação deve suportar múltiplos fatores (SMS, email, biometria no mobile)
- RF001.3: Recuperação de senha via SMS ou email
- RF001.4: Login social opcional (Google, Facebook) vinculado ao CPF
- RF001.5 (Planejado): Integração com CadÚnico para validação e importação de dados
Perfil Profissional
- RF001.6: Criação de perfil profissional completo
- RF001.7: Upload de documentos (PDF, imagens)
- RF001.8: Validação automática de certificados
- RF001.9: Histórico de experiências profissionais
RF002 - Gestão de Vagas
Publicação
- RF002.1: Empresas devem poder publicar vagas após validação
- RF002.2: Categorização automática de vagas
- RF002.3: Definição de requisitos e competências
- RF002.4: Geolocalização de vagas
Busca e Filtros
- RF002.5: Busca por palavra-chave com correção ortográfica
- RF002.6: Filtros por localização, salário, tipo de contrato
- RF002.7: Ordenação por relevância, data, distância
- RF002.8: Salvamento de buscas favoritas
RF003 - Sistema de Matching
Algoritmo de Compatibilidade
- RF003.1: Cálculo de score de compatibilidade candidato-vaga
- RF003.2: Consideração de múltiplos fatores (skills, localização, experiência)
- RF003.3: Aprendizado contínuo baseado em feedback
- RF003.4: Explicação do score para transparência
# Exemplo de cálculo de score
def calculate_match_score(candidate, job):
skill_score = calculate_skill_match(candidate.skills, job.requirements)
location_score = calculate_location_match(candidate.location, job.location)
experience_score = calculate_experience_match(candidate.experience, job.experience_required)
weights = {
'skills': 0.4,
'location': 0.3,
'experience': 0.3
}
final_score = (
skill_score * weights['skills'] +
location_score * weights['location'] +
experience_score * weights['experience']
)
return {
'score': final_score,
'breakdown': {
'skills': skill_score,
'location': location_score,
'experience': experience_score
}
}
RF004 - Processo de Candidatura
Aplicação
- RF004.1: Candidatura com um clique
- RF004.2: Possibilidade de carta de apresentação
- RF004.3: Acompanhamento de status em tempo real
- RF004.4: Histórico completo de candidaturas
Comunicação
- RF004.5: Notificações sobre mudanças de status
- RF004.6: Chat entre empresa e candidato (após match)
- RF004.7: Agendamento de entrevistas integrado
- RF004.8: Feedback estruturado pós-processo
RF005 - Dashboard e Analytics
Para Cidadãos
- RF005.1: Visualização de estatísticas pessoais
- RF005.2: Recomendações de melhoria de perfil
- RF005.3: Insights sobre mercado de trabalho
- RF005.4: Progresso em processos seletivos
Para Empresas
- RF005.5: Métricas de vagas (visualizações, candidaturas)
- RF005.6: Funil de contratação
- RF005.7: Comparativo com mercado
- RF005.8: ROI de contratações
Para Gestores Públicos
- RF005.9: Dashboard executivo com KPIs
- RF005.10: Mapas de calor de empregabilidade
- RF005.11: Relatórios customizáveis
- RF005.12: Previsões e tendências
Requisitos Não-Funcionais
RNF001 - Performance
Tempo de Resposta
| Operação | Tempo Máximo | Percentil |
|---|---|---|
| Carregamento de página | 2s | p95 |
| Busca de vagas | 500ms | p95 |
| API calls | 200ms | p95 |
| Processamento de match | 5s | p99 |
Capacidade
- RNF001.1: Suportar 1 milhão de usuários ativos mensais
- RNF001.2: Processar 10.000 requisições por segundo
- RNF001.3: Armazenar 10TB de dados com crescimento de 20% ao ano
- RNF001.4: Processar 100.000 matches por hora
RNF002 - Disponibilidade
SLA
- RNF002.1: 99.9% de disponibilidade (downtime máximo: 43.2 min/mês)
- RNF002.2: RTO (Recovery Time Objective): 30 minutos
- RNF002.3: RPO (Recovery Point Objective): 5 minutos
- RNF002.4: Manutenções programadas fora de horário comercial
Resiliência
resilience_requirements:
circuit_breaker:
threshold: 5 failures
timeout: 60 seconds
retry_policy:
max_attempts: 3
backoff: exponential
bulkhead:
max_concurrent: 100
queue_size: 1000
timeouts:
http_request: 30s
database_query: 5s
external_api: 10s
RNF003 - Segurança
Autenticação e Autorização
- RNF003.1: OAuth 2.0 + JWT para APIs
- RNF003.2: Sessões com timeout de 30 minutos de inatividade
- RNF003.3: Rate limiting por IP e por usuário
- RNF003.4: CAPTCHA após 3 tentativas falhas
Proteção de Dados
- RNF003.5: Criptografia AES-256 para dados em repouso
- RNF003.6: TLS 1.3 para dados em trânsito
- RNF003.7: PII tokenization para dados sensíveis
- RNF003.8: Logs sem dados pessoais
RNF004 - Usabilidade
Acessibilidade
- RNF004.1: Conformidade com WCAG 2.1 nível AA
- RNF004.2: Suporte a leitores de tela
- RNF004.3: Navegação por teclado completa
- RNF004.4: Contraste mínimo de 4.5:1
Mobile First
- RNF004.5: Design responsivo para todos os tamanhos de tela
- RNF004.6: PWA com funcionalidade offline
- RNF004.7: Touch targets mínimo de 44x44 pixels
- RNF004.8: Otimização para conexões lentas (2G/3G)
RNF005 - Manutenibilidade
Código
- RNF005.1: Cobertura de testes mínima de 80%
- RNF005.2: Documentação inline para todas as funções públicas
- RNF005.3: Linting e formatação automática
- RNF005.4: Análise estática de segurança
Arquitetura
RNF006 - Conformidade Legal
LGPD
- RNF006.1: Consentimento explícito para coleta de dados
- RNF006.2: Direito ao esquecimento implementado
- RNF006.3: Portabilidade de dados em formato padrão
- RNF006.4: Relatório de impacto de proteção de dados
Normas Trabalhistas
- RNF006.5: Conformidade com CLT
- RNF006.6: Não discriminação algorítmica
- RNF006.7: Transparência em processos seletivos
- RNF006.8: Auditabilidade completa
RNF007 - Internacionalização
Idiomas
- RNF007.1: Interface em Português brasileiro (padrão)
- RNF007.2: Suporte para inglês e espanhol
- RNF007.3: Datas e números no formato local
- RNF007.4: Moeda em Real brasileiro
RNF008 - Integração
APIs Externas
- RNF008.1: Timeout configurável para cada integração
- RNF008.2: Fallback para indisponibilidade
- RNF008.3: Cache de respostas quando apropriado
- RNF008.4: Monitoramento de SLA de terceiros
Matriz de Rastreabilidade
| Requisito | Prioridade | Módulo | Responsável | Status |
|---|---|---|---|---|
| RF001.1 | Alta | Auth | Backend | Implementado |
| RF001.2 | Alta | Auth | Backend | Em desenvolvimento |
| RF002.1 | Alta | Jobs | Backend | Planejado |
| RF003.1 | Crítica | Matching | ML Team | Em desenvolvimento |
| RNF001.1 | Alta | Infra | DevOps | Implementado |
| RNF003.1 | Crítica | Security | Security Team | Implementado |
Casos de Uso Principais
UC001 - Candidatar-se a uma Vaga
UC002 - Publicar Vaga (Empresa)
// Fluxo de publicação de vaga
async function publishJob(jobData: JobInput): Promise<Job> {
// 1. Validação
const validation = await validateJobData(jobData);
if (!validation.isValid) {
throw new ValidationError(validation.errors);
}
// 2. Enriquecimento
const enrichedData = await enrichJobData(jobData, {
categorize: true,
extractSkills: true,
geocode: true
});
// 3. Aprovação (se necessário)
if (requiresApproval(enrichedData)) {
await submitForApproval(enrichedData);
return { status: 'pending_approval', ...enrichedData };
}
// 4. Publicação
const job = await createJob(enrichedData);
// 5. Indexação
await indexForSearch(job);
// 6. Notificação de candidatos compatíveis
await notifyMatchingCandidates(job);
return job;
}
Priorização
Os requisitos estão priorizados usando o método MoSCoW (Must have, Should have, Could have, Won't have) e são revisados a cada sprint de desenvolvimento.