Pular para conteúdo

US2.3

Publicação de Vagas de Voluntariado (RF20)

História de Usuário

Como organização, quero publicar vagas de voluntariado para que fiquem visíveis aos estudantes e comecem a receber candidaturas.


Rastreabilidade

Item Código / Referência
User Story US2.3
Requisito Funcional RF20 — Publicar oportunidade
Característica de Produto CP02 — Ciclo de Vagas e Engajamento
Requisitos Não-Funcionais RNF04 (responsivo iOS/Android)
Release Planejada R3 — Gestão e Triagem

Descrição

Implementar a funcionalidade de publicação de vagas de voluntariado. A organização deve poder alterar o estado de uma vaga de rascunho para publicada, tornando-a visível na busca de vagas para todos os estudantes. A publicação é o ato que faz a vaga "existir" publicamente na plataforma — sem ela, a vaga permanece invisível, e funcionalidades como busca (RF08) e candidatura (RF10) ficam sem efeito. O escopo é full-stack.


Critérios de Aceite (BDD / Gherkin)

Cenário 1: Publicação de vaga em rascunho

Dado que a organização possui uma vaga "Apoio em Eventos" em rascunho, com todos os campos obrigatórios preenchidos
Quando clica em "Publicar vaga" e confirma a ação
Então o sistema altera o estado da vaga para publicada, exibe "Vaga publicada com sucesso" e a vaga se torna visível na busca de estudantes

Cenário 2: Tentativa de publicar vaga incompleta

Dado que a vaga "Apoio em Eventos" está em rascunho, mas sem o campo de local preenchido
Quando a organização tenta publicá-la
Então o sistema bloqueia a publicação e exibe "Preencha todos os campos obrigatórios antes de publicar: local"

Cenário 3: Vaga já publicada não precisa ser publicada novamente

Dado que a vaga "Apoio em Eventos" já está publicada
Quando a organização acessa a vaga
Então o sistema exibe a indicação "Publicada" e oculta o botão "Publicar", substituindo-o por "Pausar" ou "Encerrar"

Cenário 4: Pausar vaga publicada

Dado que a vaga "Apoio em Eventos" está publicada e ativa
Quando a organização clica em "Pausar", confirmando que deseja interromper temporariamente as inscrições
Então o sistema altera o estado para pausada, a vaga deixa de aparecer na busca de estudantes, mas as candidaturas já registradas são preservadas

Cenário 5: Organização não aprovada tenta publicar

Dado que a organização "Nova ONG" ainda está com cadastro aguardando moderação administrativa
Quando tenta publicar uma vaga
Então o sistema bloqueia a publicação e exibe "Sua organização precisa ser aprovada pela administração antes de publicar vagas"


Regras de Negócio

  • Apenas organizações aprovadas pela moderação administrativa podem publicar vagas de voluntariado.
  • Uma vaga só pode ser publicada se todos os campos obrigatórios estiverem devidamente preenchidos.
  • Uma vez publicada, a vaga torna-se visível para todos os estudantes na plataforma e passa a aceitar candidaturas.
  • A organização pode, a qualquer momento, pausar uma vaga publicada, suspendendo temporariamente sua visibilidade e o recebimento de novas candidaturas, sem afetar as candidaturas já registradas.
  • A organização pode, a qualquer momento, reativar uma vaga pausada, retornando-a ao estado publicada e restabelecendo sua visibilidade e a possibilidade de novas candidaturas.
  • O estado da vaga determina seu comportamento na plataforma: rascunho (invisível, editável), publicada (visível, recebendo candidaturas), pausada (invisível, candidaturas preservadas), encerrada (invisível, não aceita novas candidaturas).

Requisitos Técnicos

  • Backend: Django + DRF. Endpoints: PATCH /api/v1/opportunities/{id}/publish/ — publicar vaga. PATCH /api/v1/opportunities/{id}/pause/ — pausar vaga. PATCH /api/v1/opportunities/{id}/resume/ — reativar vaga pausada.
  • Validação: Antes de publicar, verificar se todos os campos obrigatórios estão preenchidos e se a organização está aprovada.
  • Segurança: Validar que opportunity.organization == request.user.organization_profile e que organization.status == 'approved'.
  • Frontend: React Native + Expo + NativeWind. Botão "Publicar" no formulário de criação/edição da vaga. Indicador visual do estado atual da vaga (rascunho/publicada/pausada/encerrada). Ações de pausar e reativar no painel da vaga.
  • Responsividade: Layout adaptável a iOS e Android (RNF04).
  • Testes: pytest para testar publicação, bloqueio de publicação de vaga incompleta, pausa, reativação, validação de organização aprovada e transições de estado inválidas.

Referências de Design

  • Protótipo Figma (Geral): https://www.figma.com/design/f6bQuVohTvZLF5WWPEbNob/Liaison?node-id=0-1
  • Observação: Os indicadores visuais de estado da vaga e os botões de ação (publicar/pausar) precisam ser confirmados no protótipo Figma.

Dependências

  • Relacionada a: #19 (Criação de Vagas — RF18/US2.1), US2.2 (Edição de Vagas — RF19), #18 (Moderação de Organizações — RF06/US1.7)
  • Bloqueada por: #19 (RF18 — Criar oportunidade), #18 (RF06 — Moderar organização)
  • Bloqueia: #20 (Busca e Filtro — RF08/US2.5), #21 (Visualização de Detalhes — RF09/US2.6), #22 (Candidatura — RF10/US2.7)

Notas

  • ICE Score: I=8 C=9 E=7 = 504 | MoSCoW: Must | Quadrante: Quick Win
  • RF20 é um Quick Win sólido (E=7, C=9). A implementação é essencialmente uma mudança de estado com validações, sem complexidade de interface adicional significativa.
  • A publicação é o evento que dispara toda a cadeia de engajamento do CP02: sem vaga publicada, não há busca (RF08), não há detalhes (RF09) e não há candidatura (RF10). Por isso, RF20 é uma dependência crítica para várias outras funcionalidades.
  • A distinção entre criar vaga (RF18) e publicar vaga (RF20) é importante: criar é o ato de preencher o formulário e salvar; publicar é o ato de tornar visível. Uma vaga pode existir indefinidamente em rascunho sem nunca ser publicada.

Definição de Preparado (DoR)

Item de Verificação (Universal) Evidência / Rastreabilidade Situação
A história está bem descrita e com critérios de aceite? Documentada e alinhada com o escopo do MVP. ✔ Sim
Possui protótipos de interface necessários? Interface mapeada e disponível no Figma da equipe. ✔ Sim
A história é independente o suficiente para ser entregue? Cadeia de dependências resolvida (vide Matriz MVP). ✔ Sim
Foi estimada pela equipe? Estimada utilizando o método ICE Score. ✔ Sim

Definição de Pronto (DoD)

Pergunta Fundamental (Universal) Evidência de Implementação Status
O código foi implementado e revisado? Pull Request aprovado e fundido na branch principal. ✔ Sim
Coerente com o protótipo validado? O layout segue os componentes e tokens de design. ✔ Sim
Passou nos testes necessários? Testes (unitários/integração) executados e aprovados. ✔ Sim
A documentação está atualizada? Atualizada no repositório de requisitos. ✔ Sim

Critérios de Aceitação (CA)

  • Publicação com sucesso: A organização clica em "Publicar vaga" em uma vaga em rascunho com todos os campos preenchidos, confirma a ação e vê "Vaga publicada com sucesso". A vaga passa a aparecer para os estudantes na busca.
  • Vaga incompleta: Se algum campo obrigatório estiver vazio, o sistema bloqueia a publicação e indica o que precisa ser preenchido.
  • Vaga já publicada: Se a vaga já estiver publicada, o botão "Publicar" é substituído por "Pausar" ou "Encerrar".
  • Pausar vaga: A organização consegue pausar uma vaga publicada — ela deixa de aparecer na busca, mas as candidaturas já registradas são mantidas.
  • Organização não aprovada: Se o cadastro da organização ainda não foi aprovado pelo administrador, o sistema bloqueia a publicação com a mensagem adequada.

Acesso & Evidência

  • Código Homologado: Repositório Principal
  • Status de Conclusão: 100% Entregue (conforme Matriz de Completude).