diff --git a/Gemfile b/Gemfile index bfc41880..f490b246 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,10 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.2' +gem 'cycromatic' + +# gem to read pdf files +gem 'pdf-reader', '~> 2.4.2' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' gem 'rails', '~> 5.2.0' # Use postgresql as the database for Active Record @@ -27,7 +31,6 @@ gem 'jbuilder', '~> 2.5' # Use ActiveModel has_secure_password gem 'bcrypt', '~> 3.1.7' -gem 'webdrivers', '~> 4.0' # Uses HAML templates gem 'haml' diff --git a/Gemfile.lock b/Gemfile.lock index c2dba9cb..91fa9006 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -20,48 +20,43 @@ GIT GEM remote: https://rubygems.org/ specs: - - abstract_type (0.0.7) - actioncable (5.2.4) - actionpack (= 5.2.4) + actioncable (5.2.5) + actionpack (= 5.2.5) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.4) - actionpack (= 5.2.4) - actionview (= 5.2.4) - activejob (= 5.2.4) + actionmailer (5.2.5) + actionpack (= 5.2.5) + actionview (= 5.2.5) + activejob (= 5.2.5) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.4) - actionview (= 5.2.4) - activesupport (= 5.2.4) - rack (~> 2.0) + actionpack (5.2.5) + actionview (= 5.2.5) + activesupport (= 5.2.5) + rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.4) - activesupport (= 5.2.4) - + actionview (5.2.5) + activesupport (= 5.2.5) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - - activejob (5.2.4) - activesupport (= 5.2.4) + activejob (5.2.5) + activesupport (= 5.2.5) globalid (>= 0.3.6) - activemodel (5.2.4) - activesupport (= 5.2.4) - activerecord (5.2.4) - activemodel (= 5.2.4) - activesupport (= 5.2.4) + activemodel (5.2.5) + activesupport (= 5.2.5) + activerecord (5.2.5) + activemodel (= 5.2.5) + activesupport (= 5.2.5) arel (>= 9.0) - activestorage (5.2.4) - actionpack (= 5.2.4) - activerecord (= 5.2.4) - marcel (~> 0.3.1) - activesupport (5.2.4) - + activestorage (5.2.5) + actionpack (= 5.2.5) + activerecord (= 5.2.5) + marcel (~> 1.0.0) + activesupport (5.2.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -70,10 +65,8 @@ GEM public_suffix (>= 2.0.2, < 5.0) arel (9.0.0) arrayfields (4.9.2) - ast (2.4.2) autoprefixer-rails (10.2.4.0) - execjs bcrypt (3.1.16) bindex (0.8.1) @@ -114,7 +107,6 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.1.8) crass (1.0.6) cucumber (5.3.0) @@ -147,7 +139,6 @@ GEM capybara (>= 2.18, < 4) cucumber (>= 3.0.2, < 6) mime-types (~> 3.2) - nokogiri (~> 1.8) rails (>= 5.0, < 7) cucumber-rails-training-wheels (1.0.0) @@ -174,9 +165,7 @@ GEM factory_bot (~> 6.1.0) railties (>= 5.0.0) fattr (2.4.0) - ffi (1.15.0) - flay (2.12.1) erubis (~> 2.7.0) path_expander (~> 1.0) @@ -189,9 +178,7 @@ GEM formatador (0.2.5) globalid (0.4.2) activesupport (>= 4.2.0) - guard (2.16.2) - formatador (>= 0.2.4) listen (>= 2.7, < 4.0) lumberjack (>= 1.0.12, < 2.0) @@ -215,22 +202,16 @@ GEM html2haml (>= 1.0.1) railties (>= 5.1) hirb (0.7.3) - html2haml (2.2.0) erubis (~> 2.7.0) haml (>= 4.0, < 6) nokogiri (>= 1.6.0) ruby_parser (~> 3.5) - http-accept (1.7.0) - http-cookie (1.0.3) - domain_name (~> 0.5) - i18n (1.7.0) + i18n (1.8.9) concurrent-ruby (~> 1.0) - ice_nine (0.11.2) - jbuilder (2.9.1) - activesupport (>= 4.2.0) - jquery-rails (4.3.5) - + jbuilder (2.11.2) + activesupport (>= 5.0.0) + jquery-rails (4.4.0) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) @@ -242,9 +223,7 @@ GEM rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) - loofah (2.9.0) - crass (~> 1.0.2) nokogiri (>= 1.5.9) lumberjack (1.2.8) @@ -256,36 +235,30 @@ GEM fattr (~> 2.2, >= 2.2.0) map (~> 6.1, >= 6.1.0) map (6.6.0) - marcel (0.3.3) - mimemagic (~> 0.3.2) + marcel (1.0.0) method_source (1.0.0) metric_fu-Saikuro (1.1.3) middleware (0.1.0) mime-types (3.3.1) mime-types-data (~> 3.2015) mime-types-data (3.2021.0225) - mimemagic (0.3.6) - mini_mime (1.0.2) - - - mini_portile2 (2.4.0) - minitest (5.13.0) - msgpack (1.3.1) - multi_json (1.14.1) - + mini_mime (1.0.3) + mini_portile2 (2.5.0) + minitest (5.14.4) + msgpack (1.4.2) + multi_json (1.15.0) multi_test (0.1.2) nenv (0.3.0) - netrc (0.11.0) - nio4r (2.5.2) - nokogiri (1.10.7) - mini_portile2 (~> 2.4.0) + nio4r (2.5.7) + nokogiri (1.11.2) + mini_portile2 (~> 2.5.0) + racc (~> 1.4) notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) - parallel (1.19.1) - parser (2.5.3.0) - ast (~> 2.4.0) - + parallel (1.20.1) + parser (3.0.0.0) + ast (~> 2.4.1) path_expander (1.1.0) pg (1.2.3) popper_js (1.16.0) @@ -305,20 +278,18 @@ GEM rack-test (1.1.0) rack (>= 1.0, < 3) railroady (1.5.3) - - rails (5.2.4.5) - actioncable (= 5.2.4.5) - actionmailer (= 5.2.4.5) - actionpack (= 5.2.4.5) - actionview (= 5.2.4.5) - activejob (= 5.2.4.5) - activemodel (= 5.2.4.5) - activerecord (= 5.2.4.5) - activestorage (= 5.2.4.5) - activesupport (= 5.2.4.5) + rails (5.2.5) + actioncable (= 5.2.5) + actionmailer (= 5.2.5) + actionpack (= 5.2.5) + actionview (= 5.2.5) + activejob (= 5.2.5) + activemodel (= 5.2.5) + activerecord (= 5.2.5) + activestorage (= 5.2.5) + activesupport (= 5.2.5) bundler (>= 1.3.0) - railties (= 5.2.4.5) - + railties (= 5.2.5) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -337,10 +308,9 @@ GEM json require_all (~> 3.0) ruby-progressbar - - railties (5.2.4.5) - actionpack (= 5.2.4.5) - activesupport (= 5.2.4.5) + railties (5.2.5) + actionpack (= 5.2.5) + activesupport (= 5.2.5) method_source rake (>= 0.8.7) thor (>= 0.19.0, < 2.0) @@ -348,7 +318,6 @@ GEM rake (13.0.3) rb-fsevent (0.10.4) rb-inotify (0.10.1) - ffi (~> 1.0) redcard (1.1.0) reek (6.0.3) @@ -383,9 +352,7 @@ GEM rspec-support (3.10.2) ruby-progressbar (1.11.0) ruby_dep (1.5.0) - ruby_parser (3.15.1) - sexp_processor (~> 4.9) rubyzip (2.3.0) sass (3.7.4) @@ -447,22 +414,18 @@ GEM activemodel (>= 5.0) bindex (>= 0.4.0) railties (>= 5.0) - - - webdrivers (4.1.3) + webdrivers (4.6.0) nokogiri (~> 1.6) rubyzip (>= 1.3.0) selenium-webdriver (>= 3.0, < 4.0) - websocket-driver (0.7.1) - - + websocket-driver (0.7.3) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) PLATFORMS - x86_64-linux + ruby DEPENDENCIES bcrypt (~> 3.1.7) @@ -499,12 +462,10 @@ DEPENDENCIES tzinfo-data uglifier (>= 1.3.0) web-console (>= 3.3.0) - - webdrivers (~> 4.0) - + webdrivers RUBY VERSION ruby 2.7.2p137 BUNDLED WITH - 2.2.9 + 2.1.4 diff --git a/app/controllers/monitorias_controller.rb b/app/controllers/monitorias_controller.rb index 14cda9f2..8433d4ce 100644 --- a/app/controllers/monitorias_controller.rb +++ b/app/controllers/monitorias_controller.rb @@ -1,66 +1,75 @@ -class MonitoriasController < ApplicationController - before_action :find_monitor, only: [:show] - before_action :find_monitoria, only: [:destroy, :edit, :update] - before_action :logged_in - - def new - @cod_disciplina = params[:turma] - @user = current_user - end - - def create - @monitoria = Monitoria.new(monitoria_params) - valid = true - Monitoria.find_each do |m| - if m.fk_matricula==@monitoria.fk_matricula and m.fk_turmas_id==@monitoria.fk_turmas_id and m.fk_cod_disciplina==@monitoria.fk_cod_disciplina - valid = false - end - end - - if valid and @monitoria.save - redirect_to dashboard_monitorias_path, notice: "Aplicaçao para monitoria enviada com sucesso!" - else - flash[:danger] = "Ocorreu um erro ao cadastrar a monitoria. Nenhuma monitoria cadastrada." - redirect_to dashboard_monitorias_path - end - end - - def show - @alunos = User.find_each - end - - def edit - end - - def update - if @monitoria.update monitoria_params - redirect_to dashboard_monitorias_path, notice: "Situaçao atualizada!" - else - render 'edit' - end - end - - def destroy - @monitoria.destroy - redirect_to dashboard_monitorias_path, notice: "Monitoria removida!" - end - - private - def monitoria_params - params.require(:monitoria).permit(:remuneracao, :fk_matricula, :fk_cod_disciplina, :fk_turmas_id, :descricao_status, :prioridade, :fk_status_monitoria_id) - end - - def find_monitor - @monitoria = Monitoria.where(fk_turmas_id: params[:id]) - end - - def find_monitoria - @monitoria = Monitoria.find(params[:id]) - end - - def logged_in - if !logged_in? - redirect_to new_session_path, notice: "Você precisa estar logado para acessar a pagina Monitoria" - end - end -end +class MonitoriasController < ApplicationController + before_action :find_monitor, only: [:show] + before_action :find_monitoria, only: [:destroy, :edit, :update, :validate_scraping] + before_action :logged_in + + def new + @cod_disciplina = params[:turma] + @user = current_user + end + + def create + @monitoria = Monitoria.new(monitoria_params) + valid = true + Monitoria.find_each do |m| + if m.fk_matricula==@monitoria.fk_matricula and m.fk_turmas_id==@monitoria.fk_turmas_id and m.fk_cod_disciplina==@monitoria.fk_cod_disciplina + valid = false + end + end + + if valid and @monitoria.save + redirect_to dashboard_monitorias_path, notice: "Aplicaçao para monitoria enviada com sucesso!" + else + flash[:danger] = "Ocorreu um erro ao cadastrar a monitoria. Nenhuma monitoria cadastrada." + redirect_to dashboard_monitorias_path + end + end + + def show + @alunos = User.find_each + end + + def edit + end + + def update + if @monitoria.update monitoria_params + redirect_to dashboard_monitorias_path, notice: "Situaçao atualizada!" + else + render 'edit' + end + end + + def destroy + @monitoria.destroy + redirect_to dashboard_monitorias_path, notice: "Monitoria removida!" + end + + def validate_scraping + if @monitoria.scraping(params[:filename],params[:disciplina]) + redirect_to dashboard_monitorias_path, notice: "Situaçao atualizada!" + else + redirect_to dashboard_monitorias_path, notice: "Erro de validacao" + end + end + + + private + def monitoria_params + params.require(:monitoria).permit(:remuneracao, :fk_matricula, :fk_cod_disciplina, :fk_turmas_id, :descricao_status, :prioridade, :fk_status_monitoria_id) + end + + def find_monitor + @monitoria = Monitoria.where(fk_turmas_id: params[:id]) + end + + def find_monitoria + @monitoria = Monitoria.find(params[:id]) + end + + def logged_in + if !logged_in? + redirect_to new_session_path, notice: "Você precisa estar logado para acessar a pagina Monitoria" + end + end +end diff --git a/app/models/historico_180112601.pdf b/app/models/historico_180112601.pdf new file mode 100644 index 00000000..09b173ff Binary files /dev/null and b/app/models/historico_180112601.pdf differ diff --git a/app/models/historico_igrande.pdf b/app/models/historico_igrande.pdf new file mode 100644 index 00000000..72262d9a Binary files /dev/null and b/app/models/historico_igrande.pdf differ diff --git a/app/models/historico_ira.pdf b/app/models/historico_ira.pdf new file mode 100644 index 00000000..6516f1e7 Binary files /dev/null and b/app/models/historico_ira.pdf differ diff --git a/app/models/historico_matricula.pdf b/app/models/historico_matricula.pdf new file mode 100644 index 00000000..d464218d Binary files /dev/null and b/app/models/historico_matricula.pdf differ diff --git a/app/models/historico_status.pdf b/app/models/historico_status.pdf new file mode 100644 index 00000000..f619fca2 Binary files /dev/null and b/app/models/historico_status.pdf differ diff --git a/app/models/monitoria.rb b/app/models/monitoria.rb index e5e72b26..6fc920c8 100644 --- a/app/models/monitoria.rb +++ b/app/models/monitoria.rb @@ -1,29 +1,105 @@ -class Monitoria < ApplicationRecord - - def self.all_disciplinas - @disciplinas = Array.new - Disciplina.find_each do |d| - @disciplinas << [d.nome, d.cod_disciplina] - end - @disciplinas - end - - # def self.all_turmas - # @turmas = Array.new - # Turma.find_each do |t| - # @turmas << [t.turma, t.id] - # end - # @turmas - # end - - def self.all_status - return [['Pendente', 1], ['Recusado', 2], ['Aceito', 3], ['Encerrado', 4]] - end - validates_presence_of :remuneracao - validates_presence_of :fk_matricula - validates_presence_of :fk_cod_disciplina - validates_presence_of :fk_turmas_id - validates_presence_of :fk_status_monitoria_id - - -end +# Aqui está a monitoria +class Monitoria < ApplicationRecord + + require 'pdf-reader' + + + def self.all_disciplinas + @disciplinas = Array.new + Disciplina.find_each do |disp| + @disciplinas << [disp.nome, disp.cod_disciplina] + end + @disciplinas + end + + # def self.all_turmas + # @turmas = Array.new + # Turma.find_each do |t| + # @turmas << [t.turma, t.id] + # end + # @turmas + # end + + def self.all_status + return [['Pendente', 1], ['Recusado', 2], ['Aceito', 3], ['Encerrado', 4]] + end + validates_presence_of :remuneracao + validates_presence_of :fk_matricula + validates_presence_of :fk_cod_disciplina + validates_presence_of :fk_turmas_id + validates_presence_of :fk_status_monitoria_id + + ## + # O metodo scraping faz a raspagem dos dados do historico (status, ira, mencao e matricula) + # + # Recebe como argumentos o nome do arquivo do historico e o codigo da disciplina a ser avaliada + # + # Retorna o resultado retornado pela funcao validacao + + def scraping(filename, disciplina) + filename = Rails.root.join('app', 'models',filename).to_s + #le o historico + linhas_uteis = [] + PDF::Reader.open(filename) do |reader| + reader.pages.each do |page| + lines = page.text.scan(/^.+/) + lines.each do |line| + if line.include?('Matrícula:') or line.include?('Status:') or line.include?('IRA:') or line.include?(disciplina) + linhas_uteis.append(line.split()) + end + end + end + end + + status_doc = linhas_uteis[1][1] + + #validacao status + if status_doc != "ATIVO" + self.update(fk_status_monitoria_id: 2) + return 'Recusado pelo status' + end + + return validacao(linhas_uteis) + end + + ## + # O metodo validacao e invocado pelo metodo historico e valida as informacoes extraidas do historico + # + # Recebe as linhas do historico que contem os dados a serem validados + # + # Retorna uma string que especifica se o aluno pode ser aceito ou se este foi recusado por + # + # alguma irregularidade dos dados de seu historico + + def validacao(linhas_uteis) + matricula_doc = linhas_uteis[0][-1] + ira_doc = linhas_uteis[3][-3] + mencao_doc = linhas_uteis[4][-2] + + self.update(fk_status_monitoria_id: 2) + + #validacao de matricula + if matricula_doc.length != 9 or matricula_doc != "#{matricula_doc.to_i}" + return 'Recusado pela matricula' + end + + #validacao de mencao + if mencao_doc != "SS" and mencao_doc != "MS" + return 'Recusado pela mencao' + end + + #validacao IRA + num_ira = ira_doc.to_f + if num_ira < 0 or num_ira > 5 + return 'Recusado pelo IRA' + end + if(self.remuneracao == 'Remunerado' and num_ira < 3.5) + return 'Recusado pelo IRA para monitoria remunerada' + end + + self.update(fk_status_monitoria_id: 3) + return "Aceito" + + end +end + \ No newline at end of file diff --git a/app/views/monitorias/show.html.haml b/app/views/monitorias/show.html.haml index 4e810895..acabc7d0 100644 --- a/app/views/monitorias/show.html.haml +++ b/app/views/monitorias/show.html.haml @@ -102,4 +102,6 @@ =link_to "Tarefas", tarefas_path(monitoria_id: monitor.id), class: 'btn btn-outline-primary unb-blue btn-block' %hr =link_to "Alterar Situaçao", edit_monitoria_path(monitor.id), class: 'btn btn-outline-primary unb-blue btn-block' + %hr + =link_to "Validar Monitoria", scraping_historico_path(filename:'historico_180112601.pdf', disciplina: monitor.fk_cod_disciplina, id: monitor.id), class: 'btn btn-outline-primary unb-blue btn-block', method: :put .col-1 diff --git a/db/migrate/20191121154635_add_monitor_to_atendimentos.rb b/db/migrate/20191121154635_add_monitor_to_atendimentos.rb index 190fa11f..2431b02f 100644 --- a/db/migrate/20191121154635_add_monitor_to_atendimentos.rb +++ b/db/migrate/20191121154635_add_monitor_to_atendimentos.rb @@ -1,5 +1,5 @@ class AddMonitorToAtendimentos < ActiveRecord::Migration[5.2] def change - add_reference :atendimentos, :monitor, foreign_key: true + add_reference :atendimentos, :monitor, foreign_key: {to_table: :users} end end diff --git a/db/schema.rb b/db/schema.rb index b3b197b1..d0aa8b15 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,9 +10,10 @@ # # It's strongly recommended that you check this file into your version control system. - ActiveRecord::Schema.define(version: 2019_12_10_130811) do + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" create_table "admins", force: :cascade do |t| t.string "name", null: false @@ -25,13 +26,13 @@ end create_table "atendimentos", force: :cascade do |t| - t.integer "motivo_id" + t.bigint "motivo_id" t.date "dia" t.string "descricao" t.string "aluno_atendido" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.integer "monitor_id" + t.bigint "monitor_id" t.index ["monitor_id"], name: "index_atendimentos_on_monitor_id" t.index ["motivo_id"], name: "index_atendimentos_on_motivo_id" end @@ -142,7 +143,7 @@ t.boolean "feito" t.datetime "inicio" t.datetime "fim" - t.integer "monitoria_id" + t.bigint "monitoria_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["monitoria_id"], name: "index_tarefas_on_monitoria_id" @@ -193,4 +194,7 @@ t.integer "c_restantes", default: 0, null: false end + add_foreign_key "atendimentos", "motivos" + add_foreign_key "atendimentos", "users", column: "monitor_id" + add_foreign_key "tarefas", "monitoria", column: "monitoria_id" end diff --git a/db/seeds.rb b/db/seeds.rb index 54463dc5..5d163dc2 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -17,26 +17,27 @@ # remember_token: nil, created_at: '2018-06-04 18:12:09.050792', updated_at: '2018-06-04 18:12:09.050792') ###################### -Disciplina.create([{id:1, nome: "APC", +Disciplina.create!([{id:1, nome: "APC", fk_tipo_disciplina_id: 1, c_prat: 2, c_teor: 4, cod_disciplina: 1}]) -Disciplina.create([{id:2, nome: "ED", +Disciplina.create!([{id:2, nome: "ED", fk_tipo_disciplina_id: 1, c_prat: 2, c_teor: 2, cod_disciplina: 2}]) ###################### -# User.create(id: 1, name: "Aluno1", email: "aluno1@gmail.com", password: "123456", -# cpf: "03638481182", rg: "2645178", matricula: "140080279") +User.create!(id: 1, name: "Aluno", email: "aluno1@gmail.com", password: "123456", password_confirmation: '123456', + cpf: "03638481182", rg: "2645178", matricula: "140080279") # User.create(id: 2, name: "Aluno2", email: "aluno2@gmail.com", password: "123456", # cpf: "03638481111", rg: "2645111", matricula: "140080211", # fk_banco: nil, remember_token: nil, created_at: '2018-06-04 19:02:24.831795', # updated_at: '2018-06-04 19:02:24.831795') -#Professor.create(id: 1, name: "Carla", email: "carla@unb.br", username: "carla", password: "123456", role: 1) +Professor.create!(id: 1, name: "Genaina", email: "genaina@unb.br", username: "genaina", password: "123456", password_confirmation: '123456', role: 1) +Professor.create!(id: 2, name: "Carla", email: "carla@unb.br", username: "carla", password: "123456", password_confirmation: '123456', role: 1) ###################### ###################### diff --git a/doc/Monitoria.html b/doc/Monitoria.html index d3458d1a..4e63144d 100644 --- a/doc/Monitoria.html +++ b/doc/Monitoria.html @@ -21,8 +21,6 @@ - -