?? 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:

  1. Baixe o template Excel clicando no botão abaixo
  2. Preencha o arquivo com os dados dos formandos
  3. Mantenha os cabeçalhos da primeira linha
  4. Campos obrigatórios estão marcados com *
  5. 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 Email 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.