US3.4
Exportação de Certificado Digital em PDF (RF15)
História de Usuário
Como estudante, quero exportar meus certificados digitais em formato PDF para comprovação acadêmica junto à universidade.
Rastreabilidade
| Item | Código / Referência |
|---|---|
| User Story | US3.4 |
| Requisito Funcional | RF15 — Emitir certificado |
| Característica de Produto | CP03 — Acompanhamento e Certificação Acadêmica |
| Requisitos Não-Funcionais | RNF07 (geração assíncrona de PDFs), RNF08 (imutabilidade de certificados), RNF09 (UUIDs para certificados) |
| Release Planejada | R4 — Certificação |
Descrição
Implementar a funcionalidade de exportação de certificados digitais em formato PDF. O estudante deve poder, a partir da lista de certificados, baixar um certificado individual ou exportar múltiplos certificados de uma vez para um arquivo compactado. Esta funcionalidade é o principal meio de o estudante utilizar os certificados para fins de comprovação acadêmica de horas complementares. O escopo é full-stack.
Critérios de Aceite (BDD / Gherkin)
Cenário 1: Download de certificado individual
Dado que a estudante "Maria Silva" possui o certificado da atividade "Apoio em Eventos" disponível
Quando acessa a lista de certificados e clica em "Baixar PDF"
Então o sistema inicia o download do arquivo PDF do certificado para o dispositivo
Cenário 2: Exportação de múltiplos certificados
⚠️ Planejado — não entregue no MVP. Atualmente só há download individual (Cenário 1); a exportação em lote (arquivo .zip) ainda não foi implementada.
Dado que a estudante "Maria Silva" possui 3 certificados disponíveis
Quando seleciona os 3 certificados e clica em "Exportar selecionados"
Então o sistema gera um arquivo compactado contendo os 3 PDFs e inicia o download
Cenário 3: Visualização prévia antes do download
⚠️ Parcial. Entregue: ao baixar, o PDF abre no visualizador do dispositivo/navegador. Um visualizador integrado ao app (botão "Visualizar" dedicado) permanece Planejado.
Dado que o estudante deseja verificar o conteúdo do certificado antes de baixá-lo
Quando clica em "Visualizar" no certificado desejado
Então o sistema abre o PDF em um visualizador integrado ao aplicativo
Cenário 4: Certificado indisponível
Dado que a atividade "Aulas de Reforço" teve frequência registrada, mas o certificado ainda está sendo processado
Quando o estudante acessa a lista de certificados
Então o sistema exibe "Certificado em processamento" e desabilita temporariamente o botão de download
Cenário 5: Compartilhamento do certificado
Dado que o estudante deseja enviar o certificado por e-mail ou aplicativo de mensagens
Quando clica em "Compartilhar" no certificado
Então o sistema abre o menu nativo de compartilhamento do dispositivo com o arquivo PDF anexado
Regras de Negócio
- O estudante pode fazer o download de qualquer certificado que tenha sido emitido em seu nome, quantas vezes desejar.
- O certificado baixado deve ser idêntico ao documento original emitido pela plataforma, preservando todas as informações, o código de validação e o QR Code.
- A exportação de múltiplos certificados simultaneamente deve gerar um arquivo compactado contendo cada certificado como um arquivo PDF individual.
- Certificados que foram revogados não podem ser baixados novamente, mesmo que o estudante já tenha realizado download anteriormente.
- O nome do arquivo PDF deve seguir o padrão
certificado-<nome da atividade>-<nome do estudante>.pdf, com caracteres acentuados normalizados e espaços substituídos por hífens.
Requisitos Técnicos
- Backend: Django + DRF. Endpoints:
GET /api/v1/certificates/{id}/download/— download individual.POST /api/v1/certificates/bulk-download/— recebe lista de IDs e retorna ZIP. - Geração de ZIP: Utilizar
zipfile(Python stdlib) para compactar múltiplos PDFs em memória e retornar comoFileResponse. - Frontend: React Native + Expo + NativeWind. Lista de certificados com checkbox para seleção múltipla, botões de download individual e em lote, visualizador de PDF integrado, integração com Share API nativa.
- Performance: PDFs grandes ou múltiplos downloads simultâneos devem utilizar
StreamingHttpResponsepara evitar carregar o arquivo inteiro em memória. - Testes: pytest para testar download individual, exportação em lote, conteúdo do ZIP e comportamento com certificados revogados.
Referências de Design
- Protótipo Figma (Geral): https://www.figma.com/design/f6bQuVohTvZLF5WWPEbNob/Liaison?node-id=0-1
- Observação: As telas de exportação e compartilhamento de certificados precisam ser confirmadas no protótipo Figma.
Dependências
- Relacionada a: #31 (Geração de Certificado — RF15/US3.3), #34 (Download de Certificados — RF16/US3.6)
- Bloqueada por: #31 (RF15 — Emitir certificado)
- Bloqueia: N/A
Notas
- ICE Score: I=10 C=5 E=3 = 150 | MoSCoW: Must | Quadrante: Plan
- US3.4 compartilha o mesmo ICE de US3.3 (RF15), pois ambas derivam do mesmo requisito funcional de emissão de certificado. A exportação é uma extensão natural da geração: uma vez que o PDF existe, baixá-lo é uma operação de leitura simples.
- O compartilhamento nativo (Share API) depende de funcionalidades específicas do Expo (
expo-sharingeexpo-file-system). - A geração de ZIP para múltiplos certificados requer cuidado com memória em dispositivos móveis: considerar limite máximo de certificados por exportação em lote (ex.: 10 por vez).
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)
- Download individual: O estudante clica em "Baixar PDF" e o certificado é salvo no dispositivo.
- Download de múltiplos: O estudante seleciona mais de um certificado e clica em "Exportar selecionados" — todos são compactados em um único arquivo para download.
- Visualização prévia: O estudante consegue visualizar o conteúdo do certificado antes de baixá-lo.
- Certificado em processamento: Se o certificado ainda não estiver pronto, o botão de download aparece desabilitado com o status "Certificado em processamento".
- Compartilhar: O estudante consegue compartilhar o certificado via e-mail ou aplicativos de mensagem diretamente do aplicativo.
Acesso & Evidência
- Código Homologado: Repositório Principal
- Status de Conclusão: 100% Entregue (conforme Matriz de Completude).