Tela: Importar Formandos (/Formandos/Import)
?? Tela: Importar Formandos via Excel
Rota: /Formandos/Import
Tipo: Formulário de upload com instruções
Permissão necessária: Administrador
?? Visão Geral da Tela
Tela para importação em lote de formandos através de arquivo Excel (.xlsx ou .xls) seguindo um template padronizado, com instruções claras e tabela de referência.
?? Elementos da Interface
1. Cabeçalho
- Título: "Importar Formandos via Excel"
- Botão Voltar: Retorna para listagem de formandos
2. Alertas de Feedback (TempData)
Alerts condicionais baseados no TempData:
- Success: Alert verde dismissível com ícone de check
- Error: Alert vermelho dismissível com ícone de erro
- Warnings: Alert amarelo dismissível com lista de avisos (HTML raw)
3. Card de Instruções
Alert azul informativo com lista numerada:
- Baixe o template Excel clicando no botão abaixo
- Preencha o arquivo com os dados dos formandos
- Mantenha os cabeçalhos da primeira linha
- Campos obrigatórios estão marcados com *
- Selecione a turma e faça o upload do arquivo
4. Botão de Download
- Texto: "Baixar Template Excel"
- Estilo: Botão grande verde (btn-lg) com ícone de download
- Ação: Chama /Formandos/DownloadTemplate (download direto)
5. Divisor Horizontal
hr.my-4 para separar seções
6. Formulário de Upload
Campos:
- Turma * (select):
- Carregado dinamicamente via JavaScript (API: /api/admin/turmas)
- Option padrão: "Selecione uma turma"
- Formato do label: "Nome da Turma - Código"
- Required
- Texto de ajuda: "Todos os formandos importados serão associados a esta turma"
- Arquivo Excel * (file):
- Accept: .xlsx, .xls
- Required
- Texto de ajuda: "Formatos aceitos: .xlsx, .xls"
Botões de ação:
- Importar Formandos: Botão primário grande (btn-lg) com ícone de upload
- Cancelar: Botão secundário grande (redireciona para Index)
7. Divisor Horizontal
hr.my-4 para separar seções
8. Tabela de Estrutura do Arquivo
Tabela bordered pequena com 4 colunas:
| Coluna Excel | Campo | Obrigatório | Formato/Exemplo |
|---|---|---|---|
| A | Nome Completo | Sim | João da Silva Santos |
| B | Sim | joao.silva@email.com | |
| C | Telefone | Não | (11) 98765-4321 |
| D | CPF | Não | 123.456.789-00 |
| E | RG | Não | 12.345.678-9 |
| F | Data Nascimento | Não | 01/01/2000 |
| G | Endereço | Não | Rua das Flores, 123 |
| H | Cidade | Não | São Paulo |
| I | Estado | Não | SP |
| J | CEP | Não | 01234-567 |
? Funcionalidades Interativas
Carregamento Dinâmico de Turmas
JavaScript no $(document).ready():
- Função loadTurmas() chama API: GET /api/admin/turmas
- Headers: Authorization (Bearer token) + X-Tenant-Id
- Parse do response: data?.turmas || data?.data || []
- Para cada turma: extrai nome, código e cria option
- Formato do label: "Nome - Código" ou fallback para "Turma #id"
Estados do Botão Importar
- Normal: "Importar Formandos" com ícone de upload
- Processando: Desabilitado + spinner + "Importando..."
Modal de Resultado (Bootstrap 5)
Exibido automaticamente se houver mensagens no TempData:
- Título: "Resultado da Importação"
- Body: Inserido dinamicamente via JavaScript:
- Success: Alert verde
- Warnings: Alert amarelo
- Errors: Alert vermelho
- Footer:
- Botão "Ir para Formandos" (primário, redireciona para Index)
- Botão "Fechar" (secundário, fecha modal)
Validação de Arquivo
- Validação HTML5: apenas .xlsx e .xls aceitos (attribute accept)
- Campo obrigatório (attribute required)
?? Notificações e Feedback
Sucesso
Alert verde dismissível: "X formandos importados com sucesso!" (exibido via TempData)
Erro
Alert vermelho dismissível com descrição do erro (exibido via TempData)
Warnings
Alert amarelo dismissível com lista HTML de avisos:
- Linhas ignoradas (motivo)
- Campos inválidos
- Duplicatas encontradas
- E-mails inválidos
Modal de Resultado
Exibe resumo completo da importação com todas as mensagens combinadas
?? Regras de Negócio
- Nome completo e e-mail são obrigatórios
- E-mail deve ser único dentro do tenant
- Linhas sem nome ou e-mail são ignoradas
- Datas inválidas resultam em campo null
- Formandos são criados com status "pendente" por padrão
- Importação é parcial: linhas válidas são criadas mesmo com erros em outras
- Template deve ser gerado pela própria aplicação (DownloadTemplate)
- Todos os formandos são associados à turma selecionada
?? Integração com API
Listar Turmas: GET /api/admin/turmas
- Headers: Authorization, X-Tenant-Id
- Response: { turmas: [...] } ou { data: [...] }
Download Template: GET /Formandos/DownloadTemplate
- Retorna arquivo Excel (.xlsx) com cabeçalhos pré-configurados
Upload e Importação: POST /Formandos/Import
- Content-Type: multipart/form-data
- Campos: turmaId (int), file (file)
- Antiforgery token obrigatório
- Redirect após processamento com TempData
?? Navegação
- Ao importar com sucesso: Permanece na tela com mensagem de sucesso + modal
- Ao clicar em "Ir para Formandos" (modal): Redireciona para /Formandos/Index
- Ao clicar em "Cancelar": Redireciona para /Formandos/Index
- Ao clicar em "Voltar": Redireciona para /Formandos/Index
?? Responsividade
Layout responsivo em 1 coluna, adaptável a todos os tamanhos de tela. Tabela de estrutura é table-responsive.