10 KiB
10 KiB
Banco de Talentos — Plano de Implementação
Visão geral
Sistema completo de vagas de emprego integrado à plataforma multi-tenant:
- Landing page pública — vitrine de vagas por empresa com data e contagem de candidatos
- Área do candidato — cadastro de currículo e candidatura a vagas
- Painel admin — gestão completa de vagas, candidatos e currículos
1. Banco de Dados — sistema-nuvem
1.1 Tabela jobs (vagas)
CREATE TABLE IF NOT EXISTS jobs (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
title TEXT NOT NULL,
description TEXT NOT NULL,
requirements TEXT,
benefits TEXT,
location TEXT,
work_mode TEXT NOT NULL DEFAULT 'presencial', -- presencial | híbrido | remoto
job_type TEXT NOT NULL DEFAULT 'clt', -- clt | pj | freelance | estagio | temporario
category TEXT,
salary_min NUMERIC(10,2),
salary_max NUMERIC(10,2),
salary_hide BOOLEAN NOT NULL DEFAULT false,
slots INT NOT NULL DEFAULT 1,
active BOOLEAN NOT NULL DEFAULT true,
published_at TIMESTAMPTZ DEFAULT NOW(),
expires_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
1.2 Tabela resumes (currículos)
CREATE TABLE IF NOT EXISTS resumes (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
user_cpf TEXT NOT NULL,
user_nome TEXT NOT NULL,
email TEXT,
phone TEXT,
linkedin TEXT,
portfolio TEXT,
about TEXT,
experience JSONB NOT NULL DEFAULT '[]',
-- [{ company, role, start, end, current, description }]
education JSONB NOT NULL DEFAULT '[]',
-- [{ institution, degree, course, start, end, current }]
skills JSONB NOT NULL DEFAULT '[]',
-- [{ name, level }] level: basico | intermediario | avancado
file_url TEXT, -- PDF anexado pelo candidato
updated_at TIMESTAMPTZ DEFAULT NOW(),
created_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE (tenant_id, user_cpf)
);
1.3 Tabela job_applications (candidaturas)
CREATE TABLE IF NOT EXISTS job_applications (
id SERIAL PRIMARY KEY,
tenant_id INT NOT NULL,
job_id INT NOT NULL REFERENCES jobs(id) ON DELETE CASCADE,
resume_id INT REFERENCES resumes(id),
applicant_nome TEXT NOT NULL,
applicant_email TEXT,
applicant_phone TEXT,
applicant_cpf TEXT NOT NULL,
cover_letter TEXT,
status TEXT NOT NULL DEFAULT 'novo',
-- novo | em_analise | aprovado | reprovado | contratado
admin_notes TEXT,
applied_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE (job_id, applicant_cpf)
);
1.4 Índices
CREATE INDEX IF NOT EXISTS idx_jobs_tenant ON jobs(tenant_id, active);
CREATE INDEX IF NOT EXISTS idx_jobs_published ON jobs(published_at DESC);
CREATE INDEX IF NOT EXISTS idx_applications_job ON job_applications(job_id);
CREATE INDEX IF NOT EXISTS idx_resumes_cpf ON resumes(tenant_id, user_cpf);
2. Backend — sistema-nuvem/controllers + routes
2.1 Endpoints públicos (customer-app)
GET /api/jobs— listar vagas ativas com contagem de candidatos- Query params:
category,work_mode,job_type,limit,offset - Retorna:
{ jobs, total }— cada vaga incluiapplicants_count
- Query params:
GET /api/jobs/:id— detalhe da vaga (sem candidatos)POST /api/jobs/:id/apply— candidatar-se a uma vaga- Body:
{ applicant_cpf, applicant_nome, applicant_phone, applicant_email, cover_letter, resume_id? } - Impede candidatura duplicada (mesmo CPF + vaga)
- Body:
2.2 Endpoints do candidato (autenticado — verifyUserToken)
GET /api/user/resume— buscar currículo do usuário logadoPOST /api/user/resume— criar currículoPUT /api/user/resume— atualizar currículo completoPOST /api/user/resume/upload— upload de PDF (multer →/public/resumes/)GET /api/user/applications— listar candidaturas do usuárioDELETE /api/user/applications/:id— cancelar candidatura (se aindanovo)
2.3 Endpoints admin (autenticado — verifyToken)
GET /api/admin/jobs— listar todas as vagas comapplicants_count- Query:
active,category,work_mode,search,limit,offset
- Query:
POST /api/admin/jobs— criar vagaPUT /api/admin/jobs/:id— editar vagaPATCH /api/admin/jobs/:id/toggle— ativar / desativar vagaDELETE /api/admin/jobs/:id— remover vaga (apenas sem candidatos, senão desativar)GET /api/admin/jobs/:id/applications— candidatos de uma vaga- Query:
status,limit,offset - Retorna dados + currículo vinculado
- Query:
GET /api/admin/applications/:id— detalhe de candidatura com currículo completoPATCH /api/admin/applications/:id— atualizar status + notas adminGET /api/admin/resumes— buscar currículos por CPF / nomeGET /api/admin/resumes/:cpf— currículo completo de um candidato
3. Admin App — admin-app/src
3.1 Sidebar + Rota
- Adicionar item Vagas no sidebar de
App.tsx(ícone:Briefcase) - Nova rota
/jobs→<JobsPage />
3.2 JobsService — services/api.ts
list(params),create(data),update(id, data),toggle(id),remove(id)getApplications(jobId, params),getApplication(id),updateApplication(id, data)searchResumes(params),getResume(cpf),kpi()
3.3 JobsPage.tsx — visão geral
- Header com: total de vagas ativas, total de candidaturas, botão "Nova Vaga"
- KPI cards: Vagas ativas · Vagas encerradas · Total candidatos · Contratações
- Tabela/lista de vagas com colunas:
- Título · Categoria · Modo · Tipo · Publicado em · Expira em · Candidatos · Status · Ações
- Filtros: busca por título, categoria, modo de trabalho, status (ativo/inativo)
- Paginação
- Botão Ver candidatos por vaga (abre drawer lateral)
- Botões Editar / Ativar-Desativar / Excluir por linha
3.4 JobModal — criar / editar vaga
- Título, Descrição, Requisitos, Benefícios, Localização
- Modo de trabalho (select: Presencial / Híbrido / Remoto)
- Tipo de contrato (select: CLT / PJ / Freelance / Estágio / Temporário)
- Categoria, Número de vagas, Salário (min · max · checkbox "A combinar")
- Data de expiração (opcional), Ativa (toggle)
3.5 ApplicationsDrawer — candidatos de uma vaga
- Lista de candidatos com: nome, CPF, telefone, data de candidatura, status
- Filtro por status
- Clicar em candidato → abre
CandidateDetailModal
3.6 CandidateDetailModal — perfil completo do candidato
- Dados pessoais do candidato
- Carta de apresentação (se enviou)
- Currículo completo inline: Sobre · Experiências · Formação · Habilidades
- Selector de status com cores: Novo · Em Análise · Aprovado · Reprovado · Contratado
- Campo de notas internas do admin
- Botão Salvar status + notas
- Botão Baixar currículo PDF (se disponível)
3.7 ResumesView — banco de currículos
- Busca por nome ou CPF
- Tabela: nome, CPF, e-mail, telefone, última atualização, vagas candidatadas
- Clicar → abre currículo completo
4. Customer App — customer-app/src
4.1 Landing page — seção Vagas
- Nova seção
VagasSectionemLandingPage.tsx - Grid de cards de vagas (máx. 6 na landing, link "Ver todas")
- Card de vaga inclui título, modo, tipo, localização, salário, data, candidatos
- Link "Ver todas as vagas" →
/vagas - Seção só aparece se houver vagas ativas
4.2 JobsAPI — api.ts
list(params),get(id),apply(id, data)myResume(),saveResume(data),myApplications(),cancelApplication(id)
4.3 Nova página — VagasListPage /vagas
- Listagem completa de vagas com filtros por palavra-chave, modo e tipo
- Cards modernos com todas as informações
- Paginação (12 por página)
4.4 Nova página — VagaDetailPage /vagas/:id
- Descrição completa + requisitos + benefícios
- Info: localização, modo, tipo, salário, data, candidatos
- Formulário de candidatura com auto-preenchimento se logado
- Badge "Você já se candidatou" + status da candidatura se já aplicou
4.5 Área do Membro — DashboardPage
- Nova aba "Vagas" no dashboard
- Sub-aba "Minhas Candidaturas": lista com vaga, data, status (badge colorido)
- Sub-aba "Meu Currículo": ResumeBuilder completo
4.6 Construtor de Currículo — ResumeBuilder
- Seção Dados Pessoais: nome, e-mail, telefone, LinkedIn, portfólio, sobre
- Seção Experiências (lista dinâmica): empresa, cargo, início, fim, atual, descrição
- Seção Formação (lista dinâmica): instituição, grau, curso, início, fim
- Seção Habilidades (lista dinâmica): nome + nível
- Botão Salvar Currículo
4.7 Navbar — novo link
- Adicionar "Vagas" na Navbar com
to="/vagas"
5. Rotas novas — server.js
- Montar controller
jobController.jscom todos os endpoints - Registrar todas as rotas em
server.js
Ordem de implementação
- Banco: criar tabelas
jobs,resumes,job_applications+ índices - Backend: controller + rotas públicas (listar vagas, candidatar)
- Backend: rotas do candidato (currículo, candidaturas)
- Backend: rotas admin (CRUD vagas, candidatos, currículos)
- Admin: JobsService + JobsPage + JobModal
- Admin: ApplicationsDrawer + CandidateDetailModal
- Admin: ResumesView (integrada na JobsPage)
- Customer: JobsAPI + seção Vagas na landing
- Customer: VagasListPage + VagaDetailPage
- Customer: ResumeBuilder no Dashboard
- Customer: aba Vagas/Candidaturas no Dashboard
- Navbar: link Vagas
- Build dos 3 apps (customer-app + admin-app) — zero erros TS