diff --git a/Gemfile.lock b/Gemfile.lock index adbacdd87b..82d0191627 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -298,8 +298,12 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm-linux-musl) racc (~> 1.4) + + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-musl) racc (~> 1.4) ostruct (0.6.3) diff --git a/app/controllers/dashboards_controller.rb b/app/controllers/dashboards_controller.rb index 4426a400e7..31e59dae6b 100644 --- a/app/controllers/dashboards_controller.rb +++ b/app/controllers/dashboards_controller.rb @@ -3,58 +3,72 @@ class DashboardsController < ApplicationController before_action :require_login - layout "admin_layout", only: [ :admin, :admin_gerenciamento, :admin_avaliacao ] - # tela de admin def admin end - # tela de gerenciamento def admin_gerenciamento - @turmas = Turma.all + @turmas = Turma.all @discentes = Discente.all - @docentes = Docente.all + @docentes = Docente.all end - # importação do json def importar_json - # codigo de auxilio - if params["json"].blank? - puts "ERRO: O parâmetro 'json' veio vazio!" - flash[:error] = "Por favor, selecione um arquivo JSON." - redirect_to admin_gerenciamento_dashboard_path and return - end - - puts "Arquivo recebido com sucesso: #{params["json"].original_filename}" + return redirecionar_json_vazio if json_vazio? - # Chama o service - resultado = Importer::AcademicDataImporter.import!(params["json"]) + registrar_arquivo_recebido - if resultado - puts "SUCESSO: O Service Object terminou sem erros." + if importar_dados_json flash[:success] = "JSON importado com sucesso!" else - puts "AVISO: O Service retornou falso." + flash[:alert] = "Ocorreu um problema ao importar o JSON." end - redirect_to admin_gerenciamento_dashboard_path - - rescue => e - puts "EXCEÇÃO CAPTURADA NO CONTROLLER: #{e.message}" - puts e.backtrace.first(2) - flash[:error] = "Ocorreu um erro na importação: #{e.message}" redirect_to admin_gerenciamento_dashboard_path + rescue StandardError => e + tratar_erro_importacao(e) end - + def admin_avaliacao + end + def discente + end + private - # tela de avaliações - def admin_avaliacao + def json_vazio? + params[:json].blank? end - def discente + def redirecionar_json_vazio + puts "ERRO: O parâmetro 'json' veio vazio!" + flash[:error] = "Por favor, selecione um arquivo JSON." + redirect_to admin_gerenciamento_dashboard_path + end + + def registrar_arquivo_recebido + puts "Arquivo recebido com sucesso: #{params[:json].original_filename}" + end + + def importar_dados_json + resultado = Importer::AcademicDataImporter.import!(params[:json]) + + if resultado + puts "SUCESSO: O Service Object terminou sem erros." + true + else + puts "AVISO: O Service retornou falso." + false + end + end + + def tratar_erro_importacao(erro) + puts "EXCEÇÃO CAPTURADA NO CONTROLLER: #{erro.message}" + puts erro.backtrace.first(2) + + flash[:error] = "Ocorreu um erro na importação: #{erro.message}" + redirect_to admin_gerenciamento_dashboard_path end end diff --git a/app/controllers/envio_formularios_controller.rb b/app/controllers/envio_formularios_controller.rb index 4f321608e4..46da2dc476 100644 --- a/app/controllers/envio_formularios_controller.rb +++ b/app/controllers/envio_formularios_controller.rb @@ -36,7 +36,7 @@ def set_formulario def mensagem_erro_validacao(questoes, respostas_params) return "Todos os campos obrigatórios devem ser preenchidos" if campos_vazios?(questoes, respostas_params) - return "Por favor, insira um valor válido entre 1 e 5" if valores_invalidos?(questoes, respostas_params) + "Por favor, insira um valor válido entre 1 e 5" if valores_invalidos?(questoes, respostas_params) end def campos_vazios?(questoes, respostas_params) diff --git a/app/controllers/formularios_controller.rb b/app/controllers/formularios_controller.rb index 7982e51565..4d79385153 100644 --- a/app/controllers/formularios_controller.rb +++ b/app/controllers/formularios_controller.rb @@ -1,66 +1,93 @@ -# app/controllers/formularios_controller.rb class FormulariosController < ApplicationController before_action :exigir_discente! before_action :set_formulario, only: [ :show ] - # GET /formularios def index @turmas = discente_atual.turmas - turmas_ids = discente_atual.turmas.pluck(:id) - respondidos_ids = discente_atual.envio_formularios.pluck(:formulario_id) - base = Formulario.where(turma_id: turmas_ids).includes(:turma, :template) - - @formularios_pendentes = formularios_pendentes(base, respondidos_ids) - @formularios_respondidos = formularios_respondidos(base) - @formularios_fechados = formularios_fechados(base, respondidos_ids) + @formularios_pendentes = formularios_pendentes + @formularios_respondidos = formularios_respondidos + @formularios_fechados = formularios_fechados end - # GET /formularios/:id def show - if discente_atual.ja_respondeu?(@formulario) - redirect_to minha_resposta_formulario_path(@formulario), - notice: "Você já respondeu este formulário." - return - end - - return redirect_to formularios_path, alert: "O prazo para responder este formulário já encerrou." unless @formulario.aberto? - return redirect_to formularios_path, alert: "Você não tem acesso a este formulário." unless discente_atual.turmas.include?(@formulario.turma) + return redirect_to_minha_resposta if formulario_respondido? + return redirect_formulario_fechado unless @formulario.aberto? + return redirect_sem_acesso_formulario unless discente_tem_acesso_ao_formulario? @questoes = @formulario.questoes.includes(questao_template: :opcao_questoes) end - # GET /formularios/:id/minha_resposta def minha_resposta @formulario = Formulario.find(params[:id]) - @envio = discente_atual.envio_formularios.find_by(formulario: @formulario) + @envio = discente_atual.envio_formularios.find_by(formulario: @formulario) - return redirect_to formularios_path, alert: "Você ainda não respondeu este formulário." unless @envio - return redirect_to formularios_path, alert: "Você não tem acesso a este formulário." unless discente_atual.turmas.include?(@formulario.turma) + return redirect_sem_resposta unless @envio + return redirect_sem_acesso_formulario unless discente_atual.turmas.include?(@formulario.turma) @respostas = @envio.respostas.includes(questao: { questao_template: :opcao_questoes }) end private + def turmas_ids + @turmas_ids ||= discente_atual.turmas.pluck(:id) + end + + def respondidos_ids + @respondidos_ids ||= discente_atual.envio_formularios.pluck(:formulario_id) + end + + def formularios_base + @formularios_base ||= Formulario.where(turma_id: turmas_ids).includes(:turma, :template) + end + + def formularios_pendentes + formularios_base.abertos.where.not(id: respondidos_ids).order(prazo: :asc) + end + + def formularios_respondidos + formularios_base + .joins(:envio_formularios) + .where(envio_formularios: { discente_id: discente_atual.id }) + .order("envio_formularios.enviado_em desc") + end + + def formularios_fechados + formularios_base.fechados.where.not(id: respondidos_ids).order(prazo: :desc) + end + def set_formulario @formulario = Formulario.find(params[:id]) rescue ActiveRecord::RecordNotFound redirect_to formularios_path, alert: "Formulário não encontrado." and return end - def formularios_pendentes(base, respondidos_ids) - base.abertos.where.not(id: respondidos_ids).order(prazo: :asc) + def formulario_respondido? + discente_atual.ja_respondeu?(@formulario) end - def formularios_respondidos(base) - base - .joins(:envio_formularios) - .where(envio_formularios: { discente_id: discente_atual.id }) - .order("envio_formularios.enviado_em desc") + def redirect_to_minha_resposta + redirect_to minha_resposta_formulario_path(@formulario), + notice: "Você já respondeu este formulário." + end + + def redirect_formulario_fechado + redirect_to formularios_path, + alert: "O prazo para responder este formulário já encerrou." + end + + def redirect_sem_acesso_formulario + redirect_to formularios_path, + alert: "Você não tem acesso a este formulário." + end + + def redirect_sem_resposta + redirect_to formularios_path, + alert: "Você ainda não respondeu este formulário." end - def formularios_fechados(base, respondidos_ids) - base.fechados.where.not(id: respondidos_ids).order(prazo: :desc) + def discente_tem_acesso_ao_formulario? + discente_atual.turmas.include?(@formulario.turma) end end diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb index 91b44e54e3..2f9a9c5eb8 100644 --- a/app/mailers/user_mailer.rb +++ b/app/mailers/user_mailer.rb @@ -1,13 +1,12 @@ class UserMailer < ApplicationMailer - def primeiro_acesso(usuario) @usuario = usuario - + @url_definir_senha = definir_senha_url(email: @usuario.email) mail( to: @usuario.email, - subject: 'Bem-vindo ao CAMAAR! Defina sua senha de acesso' + subject: "Bem-vindo ao CAMAAR! Defina sua senha de acesso" ) end end diff --git a/app/models/turma.rb b/app/models/turma.rb index d58f283190..cabbfdad79 100644 --- a/app/models/turma.rb +++ b/app/models/turma.rb @@ -7,4 +7,3 @@ class Turma < ApplicationRecord validates :codigo, presence: true validates :nome, presence: true end - diff --git a/app/services/importer/academic_data_importer.rb b/app/services/importer/academic_data_importer.rb index 6355c0fd42..db3cd85695 100644 --- a/app/services/importer/academic_data_importer.rb +++ b/app/services/importer/academic_data_importer.rb @@ -9,16 +9,17 @@ def self.import!(upload_file) ActiveRecord::Base.transaction do + departamento = Departamento.find_or_create_by!(nome: "Ciência da Computação") unique_turmas = data_hash.uniq { |t| [ t["code"], t["classCode"], t["semester"] ] } turma_objects = unique_turmas.map do |t| - Turma.new(codigo: t["code"], turma: t["classCode"], semestre: t["semester"], departamento: "Ciência da Computação") + Turma.new(codigo: t["code"], nome: t["classCode"], semestre: t["semester"], departamento: departamento) end # duplicação de objetos Turma.import turma_objects, on_duplicate_key_ignore: true, validate: false - turmas_hash = Turma.all.pluck(:codigo, :turma, :semestre, :id).each_with_object({}) do |(codigo, turma, semestre, id), hash| - hash["#{codigo}-#{turma}-#{semestre}"] = id + turmas_hash = Turma.all.pluck(:codigo, :nome, :semestre, :id).each_with_object({}) do |(codigo, nome, semestre, id), hash| + hash["#{codigo}-#{nome}-#{semestre}"] = id end # armazenar os discentes e docentes @@ -40,72 +41,85 @@ def self.import!(upload_file) raw_docentes << d_user.merge("turma_id" => turma_id) end end - + unique_discentes = raw_discentes.uniq { |d| d["matricula"] } unique_docentes = raw_docentes.uniq { |d| d["email"] } - discente_objects = unique_discentes.map do |members| - Discente.new( - nome: members["nome"]&.downcase, - curso: members["curso"]&.downcase, - matricula: members["matricula"], - usuario: members["usuario"], - formacao: members["formacao"]&.downcase, - ocupacao: members["ocupacao"]&.downcase, - email: members["email"]&.downcase, - turma_id: members["turma_id"] - ) - end - Discente.import discente_objects, on_duplicate_key_ignore: true, validate: false - - users_discente_objects = unique_discentes.map do |members| - User.new( + usuarios_discente_objects = unique_discentes.map do |members| + Usuario.new( + login: members["matricula"], nome: members["nome"]&.downcase, - matricula: members["matricula"], email: members["email"], - perfil: "Discente", + perfil: :discente, password: "123456", password_confirmation: "123456", primeiro_acesso: false ) - end - User.import users_discente_objects, on_duplicate_key_ignore: true, validate: false + Usuario.import usuarios_discente_objects, on_duplicate_key_ignore: true, validate: false - emails_importados = users_discente_objects.map(&:email) - usuarios_salvos = User.where(email: emails_importados) + emails_importados = usuarios_discente_objects.map(&:email) + usuarios_salvos = Usuario.where(email: emails_importados) + usuarios_por_email = usuarios_salvos.index_by(&:email) - usuarios_salvos.each do |usuario| - UsuarioMailer.email_primeiro_acesso(usuario).deliver_later - end + discente_objects = unique_discentes.filter_map do |members| + usuario = usuarios_por_email[members["email"]] + next unless usuario - docente_objects = unique_docentes.map do |members| - Docente.new( - nome: members["nome"]&.downcase, - departamento: members["departamento"]&.downcase, - usuario: members["usuario"], - formacao: members["formacao"]&.downcase, - ocupacao: members["ocupacao"]&.downcase, - email: members["email"]&.downcase, - turma: members["turma_id"] + Discente.new( + usuario: usuario, + matricula: members["matricula"], + curso: members["curso"]&.downcase ) end - Docente.import docente_objects, on_duplicate_key_ignore: true, validate: false + Discente.import discente_objects, on_duplicate_key_ignore: true, validate: false - users_docente_objects = unique_docentes.map do |members| - User.new( + matricula_objects = unique_discentes.filter_map do |members| + usuario = usuarios_por_email[members["email"]] + discente = Discente.find_by(usuario: usuario) + turma_id = members["turma_id"] + + next unless discente && turma_id + + Matricula.new(discente: discente, turma_id: turma_id) + end + Matricula.import matricula_objects, on_duplicate_key_ignore: true, validate: false + + usuarios_salvos.each do |usuario| + UserMailer.primeiro_acesso(usuario).deliver_later + end + + usuarios_docente_objects = unique_docentes.map do |members| + Usuario.new( + login: members["email"], nome: members["nome"]&.downcase, - matricula: members["email"], email: members["email"], - perfil: "Docente", + perfil: :docente, password: "123456", password_confirmation: "123456", primeiro_acesso: false ) end - - User.import users_docente_objects, on_duplicate_key_ignore: true, validate: false + Usuario.import usuarios_docente_objects, on_duplicate_key_ignore: true, validate: false + + docentes_por_email = Usuario.where(email: usuarios_docente_objects.map(&:email)).index_by(&:email) + + docente_objects = unique_docentes.filter_map do |members| + usuario = docentes_por_email[members["email"]] + next unless usuario + + Docente.new(usuario: usuario, departamento: departamento) + end + Docente.import docente_objects, on_duplicate_key_ignore: true, validate: false + + unique_docentes.each do |members| + usuario = docentes_por_email[members["email"]] + docente = Docente.find_by(usuario: usuario) + turma = Turma.find_by(id: members["turma_id"]) + + turma&.update!(docente: docente) if docente + end end # registro de erros rescue StandardError => e @@ -118,4 +132,4 @@ def self.import!(upload_file) true end end -end \ No newline at end of file +end diff --git a/app/views/dashboards/admin.html.erb b/app/views/dashboards/admin.html.erb index 0a5cd4512e..5ee621dadc 100644 --- a/app/views/dashboards/admin.html.erb +++ b/app/views/dashboards/admin.html.erb @@ -8,7 +8,6 @@ Seus testes de criação de downloads entrarão aqui