US3.3
Geração Automática de Certificado Digital (RF15)
História de Usuário
Como estudante, quero receber meu certificado digital em PDF ao concluir uma atividade de voluntariado.
Rastreabilidade
| Item | Código / Referência |
|---|---|
| User Story | US3.3 |
| Requisito Funcional | RF15 — Emitir certificado |
| Característica de Produto | CP03 — Acompanhamento e Certificação Acadêmica |
| Requisitos Não-Funcionais | RNF08 (imutabilidade de certificados), RNF09 (UUIDs para certificados) |
| Release Planejada | R4 — Certificação |
Descrição
Permitir a emissão de um certificado digital em PDF a partir do registro de frequência do estudante numa atividade de voluntariado. O certificado reúne os dados do estudante (nome), da atividade (título, carga horária atestada) e da organização (nome, CNPJ), recebe um código de validação único e fica disponível para o estudante. É o objetivo final da plataforma: transformar horas de voluntariado em documento comprobatório com validade acadêmica.
Critérios de Aceite (BDD / Gherkin)
Cenário 1: Geração do certificado após registro de frequência
Dado que a organização registrou a presença da estudante "Maria Silva" com 20 horas cumpridas na atividade "Apoio em Eventos"
Quando a frequência é confirmada
Então o sistema gera um certificado digital em PDF contendo nome da estudante, título da atividade, carga horária de 20 horas, nome e CNPJ da organização, data de emissão, código de validação único e QR Code com link de validação
Cenário 2: Certificado disponível para o estudante
Dado que o certificado da atividade "Apoio em Eventos" foi gerado para "Maria Silva"
Quando a estudante acessa seus certificados
Então o sistema exibe apenas os certificados dela, com a opção de visualizar ou baixar o PDF
Cenário 3: Certificado não gerado sem frequência registrada
Dado que a estudante "Maria Silva" foi aprovada para a vaga "Aulas de Reforço", mas a organização ainda não registrou sua presença
Quando se tenta emitir o certificado
Então o sistema impede a emissão, pois não há frequência confirmada
Cenário 4: Imutabilidade do certificado após emissão
Dado que o certificado de "Maria Silva" para "Apoio em Eventos" já foi emitido com 20 horas
Quando se tenta alterar os dados do certificado já emitido
Então o sistema bloqueia a alteração e mantém o certificado original
Cenário 5: Dados corretos no PDF
Dado que o certificado foi gerado para "Maria Silva"
Quando o PDF é aberto
Então o documento exibe layout padronizado com identidade visual do Liaison, todos os dados legíveis, e o QR Code que direciona ao portal de validação
Cenário 6: Emissão única por atividade
Dado que "Maria Silva" já tem certificado emitido para "Apoio em Eventos"
Quando se tenta emitir um segundo certificado para a mesma estudante e atividade
Então o sistema impede a emissão duplicada
Regras de Negócio
- O certificado digital é emitido a partir do registro de presença do estudante numa atividade de voluntariado.
- Cada certificado recebe um código único de validação, gerado na emissão, que permite a verificação pública de autenticidade.
- Conteúdo obrigatório: nome completo do estudante, título da atividade, carga horária atestada, nome e CNPJ da organização e data de emissão.
- Uma vez emitido, o certificado é imutável: nenhum dado do certificado pode ser alterado.
- Há no máximo um certificado por estudante e atividade.
Requisitos Técnicos
- Backend: Django + DRF. Modelo
Certificate1:1 comApplication—student/opportunity/organizationsão acessados viacertificate.application.*(sem tabelaAttendance; frequência é estado daApplication). Campos:id(UUID PK),application(OneToOneField,PROTECT),hours(snapshot da carga atestada),pdf_file(FileField),validation_uuid(UUIDField, unique, default=uuid4),issued_at(auto_now_add),revoked_at(nullable). Imutabilidade pós-emissão nosave()(sópdf_file/revoked_atmutáveis). - Geração de PDF:
reportlab(pip puro, sem deps de sistema). QR Code viaqrcode[pil]apontando para{CERT_VALIDATION_BASE_URL}/{validation_uuid}. Layout com identidade visual do Liaison (Figma node 654:2). - Geração síncrona, sem Celery. PDF de 1 página gera em ~200 ms; Celery seria desproporcional. RNF07 segue "Won't Have". Lógica isolada em
services.py/pdf.py— ponto único de troca se surgir necessidade de lote. - Storage:
pdf_fileem storage local ou S3 conformeUSE_S3. - Endpoints:
GET /api/v1/certificates/(lista do próprio estudante);GET /api/v1/certificates/{id}/download/(download, dono only).POST /api/v1/certificates/issue/(org dona da vaga) — temporário até #27 plugar o trigger no mesmo serviceissue_certificate(application, hours). - Frontend: fora do escopo desta issue (cai em #34).
- Testes: pytest cobrindo emissão via service (PDF não-vazio + dados presentes), unicidade de UUID, imutabilidade, list só-do-dono, download dono/não-dono e o endpoint
issue/.
Referências de Design
- Protótipo Figma (Certificado): https://www.figma.com/design/f6bQuVohTvZLF5WWPEbNob/Liaison?node-id=654-2&t=Bn4zGHNjZFTDPrK5-0
Dependências
- Relacionada a: #27 (Registro de Frequência — RF14/US3.2), #26 (Listagem de Aprovados — RF13/US3.1), #30 (Portal de Validação — RF17/US3.7)
- Bloqueia: #32 (Exportação de Certificado — RF15/US3.4), #30 (Validação de Certificado — RF17/US3.7), #33 (Histórico de Horas — RF16/US3.5), #34 (Download de Certificados — RF16/US3.6)
Notas
- ICE Score: I=10 C=5 E=3 = 150 | MoSCoW: Must | Quadrante: Plan
- RF15 é um dos itens mais críticos do backlog — objetivo final da plataforma (I=10).
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)
- Geração após presença confirmada: Assim que a organização registra a presença do estudante, o sistema gera um certificado em PDF com: nome do estudante, título da atividade, carga horária, nome e CNPJ da organização, data de emissão, código de validação único e QR Code.
- Certificado acessível pelo estudante: O estudante acessa a lista de seus certificados e consegue visualizar ou baixar o PDF da atividade concluída. Ele só vê seus próprios certificados.
- Sem presença, sem certificado: Se a organização ainda não tiver registrado a presença, o sistema impede a emissão do certificado.
- Imutabilidade: Um certificado já emitido não pode ter seus dados alterados.
- PDF correto: O documento exibe layout padronizado com identidade visual do Liaison, com todos os dados legíveis e o QR Code funcional.
- Unicidade: Não é possível emitir um segundo certificado para o mesmo estudante na mesma atividade.
Acesso & Evidência
- Código Homologado: Repositório Principal
- Status de Conclusão: 100% Entregue (conforme Matriz de Completude).