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_profilee queorganization.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).