# Gap Analysis: GoHorseJobs vs Careerjet (2026) ## Objetivo Mapear o que já existe no GoHorseJobs e o que ainda falta para alcançar um fluxo equivalente ao Careerjet, com backlog acionável. ## Escopo analisado - Busca pública de vagas (home + listagem + detalhe) - Filtros e parâmetros de URL - Recursos de candidato (alerta, salvar vaga, currículo) - Recursos de empresa/recrutador ## Achados principais (resumo executivo) ### O que já está bom no GoHorseJobs 1. **Fluxo base de busca já existe** com listagem, paginação e filtros essenciais (`q`, localização, tipo, modalidade). 2. **Detalhe de vaga e candidatura** já cobrem o núcleo do funil candidato. 3. **Estrutura multi-perfil** (candidato/recrutador/admin) e módulo de empresas já está presente. ### Lacunas mais críticas para paridade com Careerjet 1. **Compatibilidade de URL estilo Careerjet (`s`/`l`)** não estava completa de ponta a ponta. 2. **Filtros “Date posted”, empresa e jornada de trabalho** ainda não estão consolidados no fluxo público. 3. **Alertas de vaga por e-mail** ainda não estão evidentes no fluxo público principal. 4. **Página de empresas pública com foco em descoberta** precisa de reforço (seguir empresa, vagas da empresa com filtros rápidos). ## Melhorias implementadas neste ciclo ### 1) Compatibilidade de URL estilo Careerjet - Home agora envia também os aliases `s` e `l` (além de `q` e `location`) para facilitar compartilhamento e importação de links externos. - Home também envia `workMode` além de `mode` para reduzir inconsistência entre páginas. - Página `/jobs` agora consome `s`/`l`/`mode`/`workMode` além dos parâmetros antigos. ### 2) Correção de re-fetch para filtros avançados - A listagem de vagas não reexecutava busca ao alterar alguns filtros avançados (salário, moeda, ordenação, suporte a visto). - Ajustado para atualizar resultados ao mudar esses filtros. ### 3) Backend com alias Careerjet - Endpoint `GET /api/v1/jobs` passou a aceitar `s` como alias de termo de busca e `l` como alias de localização. - Incluído teste automatizado cobrindo esse comportamento. ## Backlog recomendado (priorizado) ## P0 (alta prioridade, impacto imediato) 1. **Date Posted no backend + frontend** - [x] Backend: aceitar `datePosted` (`24h`, `7d`, `30d`) e filtrar por `created_at`. - [x] Frontend: filtro visível na listagem com UX similar ao Careerjet. 2. **Filtro por empresa no público** - [x] Endpoint de jobs com `companyId` já existe; falta UX forte para seleção por empresa. 3. **Persistência de buscas recentes** - [x] LocalStorage para anônimos + conta autenticada (sincronização opcional). ## P1 (médio prazo) 4. **Alerta de vagas público** - “Create alert” com confirmação por e-mail e gerenciamento no painel do candidato. 5. **Melhorias na página de empresas** - Botão “seguir”, filtro por data e exibição de vagas com metadados completos. 6. **Salvar vaga** - Reforçar botão “Salvar” em cards e detalhe para usuários autenticados. ## P2 (evolução) 7. **Navegação Previous/Next no detalhe da vaga** 8. **Origem da vaga (source link) quando for agregação externa** 9. **Ranking de relevância para ordenação “relevance”** ## Critérios de aceite sugeridos ### Busca / URL - Dado um link `/jobs?s=Data+Engineer&l=Recife`, a tela carrega com termo e local preenchidos e lista filtrada. - Dado um link `/jobs?mode=remote`, o filtro de modalidade entra como “remote”. ### Filtros avançados - Ao alterar ordenação/moeda/faixa salarial, a lista atualiza sem refresh manual. ### Backend - `GET /api/v1/jobs?s=qa&l=Lisboa` retorna os mesmos resultados que `q` e `location` equivalentes. ## Plano técnico (sprint recomendado de 2 semanas) ### Semana 1 - Implementar `datePosted` no backend e cobertura de testes. - Expor filtro na UI pública e validar UX. - Persistir “recent searches” localmente. ### Semana 2 - Criar fluxo de alertas (CRUD mínimo + envio inicial). - Melhorar página pública de empresas (seguir + vagas + filtros). - Ajustes de observabilidade (métricas de conversão busca → clique → candidatura). ## Riscos e dependências - **Dependência de modelagem de dados** para alertas e follows. - **Qualidade dos dados de salário/empresa** impacta filtros e ordenação. - **Internacionalização**: novas labels e mensagens precisam entrar no i18n. --- ## Execução acelerada via Codex (para fechar rápido) Se a prioridade é **concluir o gap com velocidade**, este é o recorte que o Codex consegue tocar de ponta a ponta com boa previsibilidade: ### O que dá para entregar imediatamente (1–3 dias) 1. **Alerta de vagas público (MVP funcional)** - Criar endpoints mínimos (`create`, `list`, `delete`) no backend. - Conectar formulário simples na listagem pública (`/jobs`) com CTA “Criar alerta”. - Disparo de e-mail inicial de confirmação + log básico de auditoria. 2. **Salvar vaga com destaque forte no funil** - Reforçar botão “Salvar” no card e no detalhe. - Persistir estado no backend para autenticados e fallback local para anônimos. - Mostrar feedback visual claro (“vaga salva”). 3. **Melhoria rápida da página pública de empresas** - Adicionar bloco de vagas da empresa com filtros rápidos (data/tipo/modalidade). - Preparar ação “seguir empresa” com endpoint e contador simples. ### O que dá para adiantar em paralelo (3–5 dias) 4. **Status pós-pagamento da vaga** - Implementar transições `pending_review`, `active`, `failed_payment`. - Garantir trilha de auditoria (quem alterou, quando, motivo). 5. **Comprovante/registro de transação** - Gerar registro transacional persistido e exibir no painel da empresa. - Expor endpoint para consulta do último pagamento da vaga. 6. **QA automatizado dos critérios pendentes** - Cobrir validações obrigatórias por etapa do fluxo de publicação. - Validar regras condicionais de candidatura e salário. ### Sequência recomendada (ordem para reduzir risco) 1. Alertas MVP → 2. Salvar vaga → 3. Status pós-pagamento → 4. Comprovante → 5. Empresas pública. ### Definição de pronto (DoD) para cada item - Código implementado + testes automatizados passando. - Mensagens i18n em `pt-BR` e `en` para novos textos. - Checklist de QA correspondente marcado como concluído neste documento. --- ## Checklist evoluído — Publicação de vaga no padrão Careerjet > Referência funcional para o portal GoHorseJobs no fluxo de publicação: > **1) Detalhes da vaga → 2) Pré-visualização → 3) Informações de faturamento → 4) Pagamento**. ### 1) Detalhes da vaga (escopo obrigatório) #### Identificação da vaga - [x] **Título da vaga** - Regra: obrigatório, texto claro e conciso, até **65 caracteres**. - Validações: bloquear excesso de pontuação, abreviações promocionais e termos de marketing (ex.: “IMPERDÍVEL!!!”). - [x] **Localidade da vaga** - Regra: obrigatório, **uma única localidade** por anúncio. - Validações: cidade/município válido, sem múltiplas localidades no mesmo campo. - [x] **País** - Regra: obrigatório, selecionado de lista de países. - Dependência: país deve dirigir moeda padrão e preço do anúncio (quando aplicável no billing). #### Modelo de contratação - [x] **Tipo de contrato** - Opções-alvo: `Permanent`, `Contract`, `Training`, `Temporary`, `Voluntary`, `Any`. - [x] **Jornada de trabalho** - Opções-alvo: `Full-time`, `Part-time`, `Any`. #### Salário - [x] **Modo de pagamento** - Opções: `Salary range` ou `Fixed salary`. - Validação: exibir campos condicionalmente conforme o modo. - [x] **Moeda** - Regra: obrigatório quando salário informado. - Opções: lista internacional (USD, EUR, BRL etc.). - [x] **Período do salário** - Opções: por `hora`, `dia`, `semana`, `mês` ou `ano`. #### Conteúdo da vaga - [x] **Descrição da oferta** - Regra: obrigatório, editor rico. - Recomendação UX: suporte a parágrafos e listas para habilidades e qualificações. #### Sobre a empresa (opcional, com ocultação) - [x] **Nome da empresa** - [x] **Site da empresa** - [x] **Número de empregados** - Opções-alvo: `Self-employed`, `1–10`, `11–50`, `51–200`, `201–500`, `501–1000`, `1001–5000`, `5001–10000`, `10000+`. - [x] **Ano de fundação** - [x] **Descrição da empresa** - [ ] **Toggle “Ocultar dados da empresa”** - Regra: quando ativo, ocultar bloco de empresa na visualização pública da vaga. #### Recebimento de candidaturas - [x] **Canal de candidatura** - Opções: `E-mail`, `Link externo`, `Telefone`. - Validação condicional: - E-mail: validar formato RFC básico. - Link externo: exigir URL HTTPS válida. - Telefone: validar DDI + número. - [x] **Requerer envio de currículo** - Opções: `Obrigatório`, `Opcional`, `Não solicitado`. - [x] **Idioma da descrição da vaga** - Regra: obrigatório. - Recomendação: idioma deve ser compatível com o país selecionado. #### Extensões locais (GoHorseJobs) - [x] **CNPJ da empresa (Brasil)** - Regra: opcional/obrigatório por política comercial. - Validação: máscara e dígitos verificadores. - [x] **Benefícios** (multiselect) - [x] **Área de atuação** (taxonomia do portal) --- ### 2) Pré-visualização - [x] Exibir versão final da vaga com todos os metadados selecionados. - [x] Indicar claramente campos ocultos (ex.: dados de empresa) antes de prosseguir. - [x] Permitir voltar para edição sem perda de dados. ### 3) Informações de faturamento - [x] Capturar dados fiscais (pessoa/empresa, documento, endereço de cobrança). - [x] Exibir plano/preço por país e duração (ex.: **US$130/30 dias** para EUA, quando aplicável). - [x] Validar consistência entre país da vaga e país de faturamento conforme regra de negócio. ### 4) Pagamento - [x] Seleção de método de pagamento disponível no país. - [x] Confirmação final com resumo: vaga + faturamento + valor. - [ ] Geração de comprovante/registro de transação. - [ ] Definição de status da vaga pós-pagamento (`pending_review`, `active`, `failed_payment`). --- ## Critérios de aceite (checklist de QA) ### Validação de formulário - [ ] Não permite avançar sem campos obrigatórios da etapa atual. - [ ] Exibe mensagens de erro específicas por campo. - [ ] Mantém dados preenchidos ao navegar entre etapas. ### Regras de negócio - [ ] Salário fixo/range respeita lógica condicional dos campos. - [ ] Canal de candidatura valida apenas o tipo selecionado. - [ ] Idioma e país possuem validação mínima de compatibilidade. ### Publicação - [ ] Pré-visualização reflete exatamente o payload persistido. - [ ] Após pagamento aprovado, vaga segue para status esperado. - [ ] Logs/auditoria registram criação e transição de status.